Re: [PATCH v3 2/8] x86/mm: Change the leave_mm() condition for local TLB flushes

From: Rik van Riel
Date: Thu May 25 2017 - 21:39:15 EST


On Thu, 2017-05-25 at 17:47 -0700, Andy Lutomirski wrote:
>
> +++ b/arch/x86/mm/tlb.c
> @@ -311,7 +311,7 @@ void flush_tlb_mm_range(struct mm_struct *mm,
> unsigned long start,
> Â goto out;
> Â }
> Â
> - if (!current->mm) {
> + if (this_cpu_read(cpu_tlbstate.state) != TLBSTATE_OK) {
> Â leave_mm(smp_processor_id());

Unless -mm changed leave_mm (I did not check), this
is not quite correct yet.

The reason is leave_mm (at least in the latest Linus
tree) ignores the cpu argument for one of its checks.

You should probably fix that in an earlier patch,
assuming you haven't already done so in -mm.

void leave_mm(int cpu)
{
ÂÂÂÂÂÂÂÂstruct mm_struct *active_mm =
this_cpu_read(cpu_tlbstate.active_mm);
ÂÂÂÂÂÂÂÂif (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK)
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂBUG();
ÂÂÂÂÂÂÂÂif (cpumask_test_cpu(cpu, mm_cpumask(active_mm))) {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂcpumask_clear_cpu(cpu, mm_cpumask(active_mm));
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂload_cr3(swapper_pg_dir);