aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/alloc.c
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2009-11-14 01:54:27 -0500
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2009-11-19 20:05:50 -0500
commitdb38d5ad323362bfca118b52fe5906f97a69fb45 (patch)
tree11940fedf0eb0ff80527094bd435ec89641f8adc /fs/nilfs2/alloc.c
parent141bbdba9c2c1592d56b019277774099a5412aea (diff)
nilfs2: add cache framework for persistent object allocator
This adds setup and cleanup routines of the persistent object allocator cache. According to ftrace analyses, accessing buffers of the DAT file suffers indispensable overhead many times. To mitigate the overhead, This introduce cache framework for the persistent object allocator (palloc) which the DAT file and ifile are using. struct nilfs_palloc_cache represents the cache object per metadata file using palloc. The cache is initialized through nilfs_palloc_setup_cache() and destroyed by nilfs_palloc_destroy_cache(); callers of the former function will be added to individual allocators of DAT and ifile on successive patches. nilfs_palloc_destroy_cache() will be called from nilfs_mdt_destroy() if the cache is attached to a metadata file. A companion function nilfs_palloc_clear_cache() is provided to allow releasing buffer head references independently with the cleanup task. This adjunctive function will be used before invalidating pages of metadata file with the cache. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Diffstat (limited to 'fs/nilfs2/alloc.c')
-rw-r--r--fs/nilfs2/alloc.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/fs/nilfs2/alloc.c b/fs/nilfs2/alloc.c
index 7e2b3ce57aa..c56300d8d17 100644
--- a/fs/nilfs2/alloc.c
+++ b/fs/nilfs2/alloc.c
@@ -491,3 +491,30 @@ int nilfs_palloc_freev(struct inode *inode, __u64 *entry_nrs, size_t nitems)
491 } 491 }
492 return 0; 492 return 0;
493} 493}
494
495void nilfs_palloc_setup_cache(struct inode *inode,
496 struct nilfs_palloc_cache *cache)
497{
498 NILFS_MDT(inode)->mi_palloc_cache = cache;
499 spin_lock_init(&cache->lock);
500}
501
502void nilfs_palloc_clear_cache(struct inode *inode)
503{
504 struct nilfs_palloc_cache *cache = NILFS_MDT(inode)->mi_palloc_cache;
505
506 spin_lock(&cache->lock);
507 brelse(cache->prev_desc.bh);
508 brelse(cache->prev_bitmap.bh);
509 brelse(cache->prev_entry.bh);
510 cache->prev_desc.bh = NULL;
511 cache->prev_bitmap.bh = NULL;
512 cache->prev_entry.bh = NULL;
513 spin_unlock(&cache->lock);
514}
515
516void nilfs_palloc_destroy_cache(struct inode *inode)
517{
518 nilfs_palloc_clear_cache(inode);
519 NILFS_MDT(inode)->mi_palloc_cache = NULL;
520}