On Wed, Jun 14, 2017 at 3:33 PM, Dave Hansen <dave.han...@intel.com> wrote: > On 06/13/2017 09:56 PM, Andy Lutomirski wrote: >> - if (cpumask_test_cpu(cpu, &batch->cpumask)) >> + if (cpumask_test_cpu(cpu, &batch->cpumask)) { >> + local_irq_disable(); >> flush_tlb_func_local(&info, TLB_LOCAL_SHOOTDOWN); >> + local_irq_enable(); >> + } >> + > > Could you talk a little about why this needs to be local_irq_disable() > and not preempt_disable()? Is it about the case where somebody is > trying to call flush_tlb_func_*() from an interrupt handler?
It's to prevent flush_tlb_func_local() and flush_tlb_func_remote() from being run concurrently, which would cause flush_tlb_func_common() to be reentered. Either we'd need to be very careful in flush_tlb_func_common() to avoid races if this happened, or we could just disable interrupts around flush_tlb_func_local(). The latter is fast and easy. --Andy