NFSD: Fix the filecache LRU shrinker
[ 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f65a30361a
commit
1d683366d4
1 changed files with 3 additions and 2 deletions
|
@ -445,6 +445,7 @@ nfsd_file_dispose_list_delayed(struct list_head *dispose)
|
||||||
*
|
*
|
||||||
* Return values:
|
* Return values:
|
||||||
* %LRU_REMOVED: @item was removed from the LRU
|
* %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
|
* %LRU_SKIP: @item cannot be evicted
|
||||||
*/
|
*/
|
||||||
static enum lru_status
|
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)) {
|
if (test_and_clear_bit(NFSD_FILE_REFERENCED, &nf->nf_flags)) {
|
||||||
trace_nfsd_file_gc_referenced(nf);
|
trace_nfsd_file_gc_referenced(nf);
|
||||||
return LRU_SKIP;
|
return LRU_ROTATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) {
|
if (!test_and_clear_bit(NFSD_FILE_HASHED, &nf->nf_flags)) {
|
||||||
|
@ -525,7 +526,7 @@ nfsd_file_gc(void)
|
||||||
unsigned long ret;
|
unsigned long ret;
|
||||||
|
|
||||||
ret = list_lru_walk(&nfsd_file_lru, nfsd_file_lru_cb,
|
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));
|
trace_nfsd_file_gc_removed(ret, list_lru_count(&nfsd_file_lru));
|
||||||
nfsd_file_gc_dispose_list(&dispose);
|
nfsd_file_gc_dispose_list(&dispose);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue