NFSD: Fix the filecache LRU shrinker
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>
This commit is contained in:
Родитель
4a0e73e635
Коммит
edead3a558
|
@ -446,6 +446,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
|
||||
|
@ -484,7 +485,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)) {
|
||||
|
@ -526,7 +527,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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче