> On Jun 23, 2022, at 7:51 PM, Chuck Lever III <chuck.lever@xxxxxxxxxx> wrote: > >> On Jun 23, 2022, at 6:56 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: >> >> On Wed, Jun 22, 2022 at 10:15:50AM -0400, Chuck Lever wrote: >> >>> +static u32 nfsd_file_obj_hashfn(const void *data, u32 len, u32 seed) >>> +{ >>> + const struct nfsd_file *nf = data; >>> + >>> + return jhash2((const u32 *)&nf->nf_inode, >>> + sizeof_field(struct nfsd_file, nf_inode) / sizeof(u32), >>> + seed); >> >> Out of curiosity - what are you using to allocate those? Because if >> it's a slab, then middle bits of address (i.e. lower bits of >> (unsigned long)data / L1_CACHE_BYTES) would better be random enough... > > 261 static struct nfsd_file * > 262 nfsd_file_alloc(struct nfsd_file_lookup_key *key, unsigned int may) > 263 { > 264 static atomic_t nfsd_file_id; > 265 struct nfsd_file *nf; > 266 > 267 nf = kmem_cache_alloc(nfsd_file_slab, GFP_KERNEL); > > Was wondering about that. pahole says struct nfsd_file is 112 > bytes on my system. Oops. nfsd_file_obj_hashfn() is supposed to be generating the hash value based on the address stored in the nf_inode field. So it's an inode pointer, alloced via kmem_cache_alloc by default. -- Chuck Lever