[patch 01/15] mm/memory.c: avoid access flag update TLB flush for retried page fault
Nicholas Piggin
npiggin at gmail.com
Tue Jul 28 20:53:23 AEST 2020
Excerpts from Linus Torvalds's message of July 28, 2020 4:37 am:
> [ Adding linux-arch, just to make other architectures aware of this issue too.
>
> We have a "flush_tlb_fix_spurious_fault()" thing to take care of the
> "TLB may contain stale entries, we can't take the same fault over and
> over again" situation.
>
> On x86, it's a no-op, because x86 doesn't do that. x86 will re-walk
> the page tables - or possibly just always invalidate the faulting TLB
> entry - before taking a fault, so there can be no long-term stale
> TLB's.
[snip]
> It looks like powerpc people at least thought about this, and only
> do it if there is a coprocessor. Which sounds a bit confused, but I
> don't know the rules.
I'm not sure about ppc32 and 64e, I'm almost certain they should do a
local flush if anyting, and someone with a good understanding of the
ISAs and CPUs might be able to nop it entirely. I agree global can't
ever really make sense (except as a default because we have no generic
local flush).
powerpc/64s reloads translations after taking a fault, so it's fine with
a nop here.
The quirk is a problem with coprocessor where it's supposed to
invalidate the translation after a fault but it doesn't, so we can get a
read-only TLB stuck after something else does a RO->RW upgrade on the
TLB. Something like that IIRC. Coprocessors have their own MMU which
lives in the nest not the core, so you need a global TLB flush to
invalidate that thing.
Thanks,
Nick
More information about the Linuxppc-dev
mailing list