Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Ajeet Yadav and committed by
Phillip Lougher
d7fbd893 89cab5b5

+9 -3
+8 -3
fs/squashfs/cache.c
··· 70 70 spin_lock(&cache->lock); 71 71 72 72 while (1) { 73 - for (i = 0; i < cache->entries; i++) 74 - if (cache->entry[i].block == block) 73 + for (i = cache->curr_blk, n = 0; n < cache->entries; n++) { 74 + if (cache->entry[i].block == block) { 75 + cache->curr_blk = i; 75 76 break; 77 + } 78 + i = (i + 1) % cache->entries; 79 + } 76 80 77 - if (i == cache->entries) { 81 + if (n == cache->entries) { 78 82 /* 79 83 * Block not in cache, if all cache entries are used 80 84 * go to sleep waiting for one to become available. ··· 249 245 goto cleanup; 250 246 } 251 247 248 + cache->curr_blk = 0; 252 249 cache->next_blk = 0; 253 250 cache->unused = entries; 254 251 cache->entries = entries;
+1
fs/squashfs/squashfs_fs_sb.h
··· 28 28 struct squashfs_cache { 29 29 char *name; 30 30 int entries; 31 + int curr_blk; 31 32 int next_blk; 32 33 int num_waiters; 33 34 int unused;