]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
NFSD: Fix the filecache LRU shrinker
authorChuck Lever <chuck.lever@oracle.com>
Fri, 8 Jul 2022 18:25:24 +0000 (14:25 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:19:09 +0000 (16:19 +0200)
[ Upstream commit edead3a55804739b2e4af0f35e9c7326264e7b22 ]

Without LRU item rotation, the shrinker visits only a few items on
the end of the LRU list, and those would always be long-term OPEN
files for NFSv4 workloads. That makes the filecache shrinker
completely ineffective.

Adopt the same strategy as the inode LRU by using LRU_ROTATE.

Suggested-by: Dave Chinner <david@fromorbit.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/filecache.c

index 5c9e3ff6397b0caee79edb0bb9647f3ec099e9d1..849c010c6ef6160149d5f66c8a9b24e6f0478035 100644 (file)
@@ -445,6 +445,7 @@ nfsd_file_dispose_list_delayed(struct list_head *dispose)
  *
  * Return values:
  *   %LRU_REMOVED: @item was removed from the LRU
+ *   %LRU_ROTATE: @item is to be moved to the LRU tail
  *   %LRU_SKIP: @item cannot be evicted
  */
 static enum lru_status
@@ -483,7 +484,7 @@ nfsd_file_lru_cb(struct list_head *item, struct list_lru_one *lru,
 
        if (test_and_clear_bit(NFSD_FILE_REFERENCED, &nf->nf_flags)) {
                trace_nfsd_file_gc_referenced(nf);
-               return LRU_SKIP;
+               return LRU_ROTATE;
        }
 
        if (!test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) {
@@ -525,7 +526,7 @@ nfsd_file_gc(void)
        unsigned long ret;
 
        ret = list_lru_walk(&nfsd_file_lru, nfsd_file_lru_cb,
-                           &dispose, LONG_MAX);
+                           &dispose, list_lru_count(&nfsd_file_lru));
        trace_nfsd_file_gc_removed(ret, list_lru_count(&nfsd_file_lru));
        nfsd_file_gc_dispose_list(&dispose);
 }