On Wed, 20 Nov 2024, Chuck Lever wrote: > On Tue, Nov 19, 2024 at 11:41:33AM +1100, NeilBrown wrote: > > diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h > > index ea6659d52be2..0e320ba097f2 100644 > > --- a/fs/nfsd/state.h > > +++ b/fs/nfsd/state.h > > @@ -345,6 +345,7 @@ struct nfsd4_session { > > bool se_dead; > > struct list_head se_hash; /* hash by sessionid */ > > struct list_head se_perclnt; > > + struct list_head se_all_sessions;/* global list of sessions */ > > I think my only minor issue here is whether we truly want an > "all_sessions" list. Since we don't expect the shrinker to run very > often, isn't there another mechanism that can already iterate all > clients and their sessions? "all_sessions" certainly isn't my favourite part of the set. But I do think we need it. We can iterate all sessions by iterating all net-namespaces, then all clients, then all sessions. But that isn't what we need. The shrinker mechanism seems to assume an LRU. It makes "scan" requests one "batch" at a time, and may request several batches in sequence without telling you in advance how many batches to expect. So you need some concept of the "next" thing to free. Often this is the end of the LRU. But we don't have an LRU because the slots aren't a cache. An important detail is that when nfsd_slot_scan() has scanned all that it was asked, it moves the head to the current point in the list. So the next time it is called it will start with the correct next session. This will only become important where there are more than 64 (default batch size) sessions. NeilBrown > > > > struct nfs4_client *se_client; > > struct nfs4_sessionid se_sessionid; > > struct nfsd4_channel_attrs se_fchannel; > > -- > > 2.47.0 > > > > -- > Chuck Lever >