Squashfs: optimise squashfs_cache_get entry search
Ajeet Yadav [Tue, 27 Dec 2011 09:40:04 +0000 (14:40 +0530)]
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>

fs/squashfs/cache.c
fs/squashfs/squashfs_fs_sb.h

index ea6e798..af0b738 100644 (file)
@@ -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;
index 651f0b3..52934a2 100644 (file)
@@ -28,6 +28,7 @@
 struct squashfs_cache {
        char                    *name;
        int                     entries;
+       int                     curr_blk;
        int                     next_blk;
        int                     num_waiters;
        int                     unused;