On 7/18/19 5:58 PM, Nadav Amit wrote: > @@ -624,16 +622,11 @@ EXPORT_SYMBOL(on_each_cpu); > void on_each_cpu_mask(const struct cpumask *mask, smp_call_func_t func, > void *info, bool wait) > { > - int cpu = get_cpu(); > + preempt_disable(); > > - smp_call_function_many(mask, func, info, wait); > - if (cpumask_test_cpu(cpu, mask)) { > - unsigned long flags; > - local_irq_save(flags); > - func(info); > - local_irq_restore(flags); > - } > - put_cpu(); > + __smp_call_function_many(mask, func, func, info, wait); > + > + preempt_enable(); > }
The get_cpu() was missing it too, but it would be nice to add some comments about why preempt needs to be off. I was also thinking it might make sense to do: cfd = get_cpu_var(cfd_data); __smp_call_function_many(cfd, ...); put_cpu_var(cfd_data); instead of the explicit preempt_enable/disable(), but I don't feel too strongly about it.