On Wed, Jun 22, 2022 at 10:15:56AM -0400, Chuck Lever wrote: > Enable the filecache hash table to start small, then grow with the > workload. Smaller server deployments benefit because there should > be lower memory utilization. Larger server deployments should see > improved scaling with the number of open files. > > I know this is a big and messy patch, but there's no good way to > rip out and replace a data structure like this. > > Suggested-by: Jeff Layton <jlayton@xxxxxxxxxx> > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> Pretty sure I mentioned converting to rhashtable as well when we were talking about the pointer-chasing overhead of list and tree based indexing of large caches. :) > + > +/* > + * Atomically insert a new nfsd_file item into nfsd_file_rhash_tbl. > + * > + * Return values: > + * %NULL: @new was inserted successfully > + * %A valid pointer: @new was not inserted, a matching item is returned > + * %ERR_PTR: an unexpected error occurred during insertion > + */ > +static struct nfsd_file *nfsd_file_insert(struct nfsd_file *new) > +{ > + struct nfsd_file_lookup_key key = { > + .type = NFSD_FILE_KEY_FULL, > + .inode = new->nf_inode, > + .need = new->nf_flags, > + .net = new->nf_net, > + .cred = current_cred(), > + }; > + struct nfsd_file *nf; > + > + nf = rhashtable_lookup_get_insert_key(&nfsd_file_rhash_tbl, > + &key, &new->nf_rhash, > + nfsd_file_rhash_params); > + if (!nf) > + return nf; The insert can return an error (e.g. -ENOMEM) so need to check IS_ERR(nf) here as well. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx