On Wed, Jun 14, 2017 at 3:33 PM, Dave Hansen <dave.hansen@xxxxxxxxx> 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 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>