> On Jun 22, 2022, at 8:38 PM, Dave Chinner <david@xxxxxxxxxxxxx> wrote: > > 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. :) Jeff's suggestion was right in the source code :-) but fair enough. The idea was also discussed when the filecache code was changed to use kzvalloc recently. I appreciate your review and your advice! >> + >> +/* >> + * 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. That is likely the cause of the BUG that Wang just reported, as that will send a ERR_PTR to nfsd_file_get(), which blows up when it tries to defererence it. I'll resend the series first thing tomorrow morning after some more clean up and testing. -- Chuck Lever