Message ID | 1536693506-11949-2-git-send-email-longman@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fs/dcache: Track # of negative dentries | expand |
On Tue, Sep 11, 2018 at 03:18:23PM -0400, Waiman Long wrote: > The nr_dentry_unused per-cpu counter tracks dentries in both the > LRU lists and the shrink lists where the DCACHE_LRU_LIST bit is set. > The shrink_dcache_sb() function moves dentries from the LRU list to a > shrink list and subtracts the dentry count from nr_dentry_unused. This > is incorrect as the nr_dentry_unused count Will also be decremented in > shrink_dentry_list() via d_shrink_del(). To fix this double decrement, > the decrement in the shrink_dcache_sb() function is taken out. > > Fixes: 4e717f5c1083 ("list_lru: remove special case function list_lru_dispose_all." > > Signed-off-by: Waiman Long <longman@redhat.com> Please add a stable tag for this. Otherwise looks fine. Reviewed-by: Dave Chinner <dchinner@redhat.com>
On 09/11/2018 06:02 PM, Dave Chinner wrote: > On Tue, Sep 11, 2018 at 03:18:23PM -0400, Waiman Long wrote: >> The nr_dentry_unused per-cpu counter tracks dentries in both the >> LRU lists and the shrink lists where the DCACHE_LRU_LIST bit is set. >> The shrink_dcache_sb() function moves dentries from the LRU list to a >> shrink list and subtracts the dentry count from nr_dentry_unused. This >> is incorrect as the nr_dentry_unused count Will also be decremented in >> shrink_dentry_list() via d_shrink_del(). To fix this double decrement, >> the decrement in the shrink_dcache_sb() function is taken out. >> >> Fixes: 4e717f5c1083 ("list_lru: remove special case function list_lru_dispose_all." >> >> Signed-off-by: Waiman Long <longman@redhat.com> > Please add a stable tag for this. > > Otherwise looks fine. > > Reviewed-by: Dave Chinner <dchinner@redhat.com> > I will add the cc:stable tag. Cheers, Longman
diff --git a/fs/dcache.c b/fs/dcache.c index 2e7e8d8..cb515f1 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -1202,15 +1202,11 @@ static enum lru_status dentry_lru_isolate_shrink(struct list_head *item, */ void shrink_dcache_sb(struct super_block *sb) { - long freed; - do { LIST_HEAD(dispose); - freed = list_lru_walk(&sb->s_dentry_lru, + list_lru_walk(&sb->s_dentry_lru, dentry_lru_isolate_shrink, &dispose, 1024); - - this_cpu_sub(nr_dentry_unused, freed); shrink_dentry_list(&dispose); } while (list_lru_count(&sb->s_dentry_lru) > 0); }
The nr_dentry_unused per-cpu counter tracks dentries in both the LRU lists and the shrink lists where the DCACHE_LRU_LIST bit is set. The shrink_dcache_sb() function moves dentries from the LRU list to a shrink list and subtracts the dentry count from nr_dentry_unused. This is incorrect as the nr_dentry_unused count Will also be decremented in shrink_dentry_list() via d_shrink_del(). To fix this double decrement, the decrement in the shrink_dcache_sb() function is taken out. Fixes: 4e717f5c1083 ("list_lru: remove special case function list_lru_dispose_all." Signed-off-by: Waiman Long <longman@redhat.com> --- fs/dcache.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)