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.

Reply via email to