Re: [PATCH 0/7] nfsd: filecache: change garbage collection lists

NeilBrown
2025-02-05T23:04:32Z

Hi Chuck,
what are you current thoughts on merging this series?

One of my thoughts is that I now realise that

Commit 0758a7212628 ("nfsd: drop the lock during filecache LRU scans")

in nfsd-next is bad. If there are multiple nodes (and so multiple
sublits in the list_lru) and if there are more than a few dozen files in
the lru, then that patch results in the first sublist being completely
freed before anything is done to the next.
I think the best fix for backporting to -stable is to wrap a
for_each_node_state((nid) around the while loop and using
list_lru_count_node() and list_lru_walk_node().

I could send a SQUASH patch for that and rebase this series on it.

Thanks,
NeilBrown

On Mon, 27 Jan 2025, NeilBrown wrote:
> [
> davec added to cc incase I've said something incorrect about list_lru
>
> Changes in this version:
> - no _bh locking
> - add name for a magic constant
> - remove unnecessary race-handling code
> - give a more meaningfule name for a lock for /proc/lock_stat
> - minor cleanups suggested by Jeff
>
> ]
>
> The nfsd filecache currently uses list_lru for tracking files recently
> used in NFSv3 requests which need to be "garbage collected" when they
> have becoming idle - unused for 2-4 seconds.
>
> I do not believe list_lru is a good tool for this. It does not allow
> the timeout which filecache requires so we have to add a timeout
> mechanism which holds the list_lru lock while the whole list is scanned
> looking for entries that haven't been recently accessed. When the list
> is largish (even a few hundred) this can block new requests noticably
> which need the lock to remove a file to access it.
>
> This patch removes the list_lru and instead uses 2 simple linked lists.
> When a file is accessed it is removed from whichever list it is on,
> then added to the tail of the first list. Every 2 seconds the second
> list is moved to the "freeme" list and the first list is moved to the
> second list. This avoids any need to walk a list to find old entries.
>
> These lists are per-netns rather than global as the freeme list is
> per-netns as the actual freeing is done in nfsd threads which are
> per-netns.
>
> Thanks,
> NeilBrown
>
> [PATCH 1/7] nfsd: filecache: remove race handling.
> [PATCH 2/7] nfsd: filecache: use nfsd_file_dispose_list() in
> [PATCH 3/7] nfsd: filecache: move globals nfsd_file_lru and
> [PATCH 4/7] nfsd: filecache: change garbage collection list
> [PATCH 5/7] nfsd: filecache: document the arbitrary limit on
> [PATCH 6/7] nfsd: filecache: change garbage collection to a timer.
> [PATCH 7/7] nfsd: filecache: give disposal lock a unique class name.
>
>
>