On Thu, Jan 23, 2020 at 09:15:55AM -0500, Waiman Long wrote: > On 1/14/20 10:59 PM, Alex Kogan wrote: > > +static int __init cna_init_nodes(void) > > +{ > > + unsigned int cpu; > > + > > + /* > > + * this will break on 32bit architectures, so we restrict > > + * the use of CNA to 64bit only (see arch/x86/Kconfig) > > + */ > > + BUILD_BUG_ON(sizeof(struct cna_node) > sizeof(struct qnode)); > > + /* we store an ecoded tail word in the node's @locked field */ > > + BUILD_BUG_ON(sizeof(u32) > sizeof(unsigned int)); > > + > > + for_each_possible_cpu(cpu) > > + cna_init_nodes_per_cpu(cpu); > > + > > + return 0; > > +} > > +early_initcall(cna_init_nodes); > > + > > I just realized that you shouldn't call cna_init_nodes as an > early_initcall. Instead, > > > +/* > > + * Switch to the NUMA-friendly slow path for spinlocks when we have > > + * multiple NUMA nodes in native environment, unless the user has > > + * overridden this default behavior by setting the numa_spinlock flag. > > + */ > > +void __init cna_configure_spin_lock_slowpath(void) > > +{ > > + if ((numa_spinlock_flag == 1) || > > + (numa_spinlock_flag == 0 && nr_node_ids > 1 && > > + pv_ops.lock.queued_spin_lock_slowpath == > > + native_queued_spin_lock_slowpath)) { > > + pv_ops.lock.queued_spin_lock_slowpath = > > + __cna_queued_spin_lock_slowpath; > > + > > + pr_info("Enabling CNA spinlock\n"); > > + } > > +} > > call it when it is sure that CNA spinlock is going to be used. At this > point, the system is still in UP mode and the slowpath will not be called. Indeed, let me go fix that!