diff options
author | Ajeet Yadav <ajeet.yadav.77@gmail.com> | 2011-12-27 13:40:04 +0400 |
---|---|---|
committer | Phillip Lougher <phillip@squashfs.org.uk> | 2011-12-30 05:24:13 +0400 |
commit | d7fbd893388d9e86d29b7cfbd5457bcf03496fbf (patch) | |
tree | ea94d043ee3e842f7273391b143a5949afb39975 /fs/squashfs/cache.c | |
parent | 89cab5b5727d3139adc247e3a3d4ee5b10e3eda5 (diff) | |
download | linux-d7fbd893388d9e86d29b7cfbd5457bcf03496fbf.tar.xz |
Squashfs: optimise squashfs_cache_get entry search
squashfs_cache_get() iterates over all entries to search for
block its looking for. Often get() / put() are called for
same block.
If we cache the current entry index, then we can optimise the
subsequent *_get() calls.
Signed-off-by: Ajeet Yadav <ajeet.yadav.77@gmail.com>
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Diffstat (limited to 'fs/squashfs/cache.c')
-rw-r--r-- | fs/squashfs/cache.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/squashfs/cache.c b/fs/squashfs/cache.c index ea6e798e548b..af0b73802592 100644 --- a/fs/squashfs/cache.c +++ b/fs/squashfs/cache.c @@ -70,11 +70,15 @@ struct squashfs_cache_entry *squashfs_cache_get(struct super_block *sb, spin_lock(&cache->lock); while (1) { - for (i = 0; i < cache->entries; i++) - if (cache->entry[i].block == block) + for (i = cache->curr_blk, n = 0; n < cache->entries; n++) { + if (cache->entry[i].block == block) { + cache->curr_blk = i; break; + } + i = (i + 1) % cache->entries; + } - if (i == cache->entries) { + if (n == cache->entries) { /* * Block not in cache, if all cache entries are used * go to sleep waiting for one to become available. @@ -245,6 +249,7 @@ struct squashfs_cache *squashfs_cache_init(char *name, int entries, goto cleanup; } + cache->curr_blk = 0; cache->next_blk = 0; cache->unused = entries; cache->entries = entries; |