On Fri, Oct 25, 2024 at 11:30:26AM -0700, Davidlohr Bueso wrote: > On Fri, 25 Oct 2024, Peter Zijlstra wrote:\n > > > static int __init futex_init(void) > > { > > - unsigned int futex_shift; > > - unsigned long i; > > + unsigned int order, n; > > + unsigned long size, i; > > > > #ifdef CONFIG_BASE_SMALL > > futex_hashsize = 16; > > #else > > - futex_hashsize = roundup_pow_of_two(256 * num_possible_cpus()); > > + futex_hashsize = 256 * num_possible_cpus(); > > + futex_hashsize /= num_possible_nodes(); > > + futex_hashsize = roundup_pow_of_two(futex_hashsize); > > #endif > > + futex_hashshift = ilog2(futex_hashsize); > > + size = sizeof(struct futex_hash_bucket) * futex_hashsize; > > + order = get_order(size); > > + > > + for_each_node(n) { > > Probably want to skip nodes that don't have CPUs, those will never > have the remote for .node value. What if the CPU-less node is placed equidistant between two (or more) regular nodes and it is the best location for a futex that is spanning those nodes? That is to say, just because it doesn't have CPUs, doesn't mean it is never the right node. Hmm?