On Mon, Sep 23, 2019 at 05:28:56PM +0200, Michal Hocko wrote: > On Mon 23-09-19 17:15:19, Peter Zijlstra wrote: > > > diff --git a/arch/x86/mm/numa.c b/arch/x86/mm/numa.c > > > index 4123100e..9859acb 100644 > > > --- a/arch/x86/mm/numa.c > > > +++ b/arch/x86/mm/numa.c > > > @@ -861,6 +861,9 @@ void numa_remove_cpu(int cpu) > > > */ > > > const struct cpumask *cpumask_of_node(int node) > > > { > > > + if (node == NUMA_NO_NODE) > > > + return cpu_online_mask; > > > > This mandates the caller holds cpus_read_lock() or something, I'm pretty > > sure that if I put: > > > > lockdep_assert_cpus_held(); > > Is this documented somewhere? No idea... common sense :-) > Also how does that differ from a normal > case when a proper node is used? The cpumask will always be dynamic in > the cpu hotplug presence, right? As per normal yes, and I'm fairly sure there's a ton of bugs. Any 'online' state is subject to change except when you're holding sufficient locks to stop it. Disabling preemption also stabilizes it, because cpu unplug relies on stop-machine. > > here, it comes apart real quick. Without holding the cpu hotplug lock, > > the online mask is gibberish. > > Can the returned cpu mask go away? No, the cpu_online_mask itself has static storage, the contents OTOH can change at will. Very little practical difference :-)