MIPS: Close races in TLB modify handlers.
authorDavid Daney <david.daney@cavium.com>
Tue, 5 Jul 2011 23:34:46 +0000 (16:34 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 26 Jul 2011 05:47:47 +0000 (06:47 +0100)
commitbf28607fbe529e20180080c4a0295b0a47834fde
tree101ca3c89186e1feb07ceb61ba91a9150d19218f
parentf0daaaf5236297ea81ec7732cd0df5dbd84a5042
MIPS: Close races in TLB modify handlers.

Page table entries are made invalid by writing a zero into the the PTE
slot in a page table.  This creates a race condition with the TLB
modify handlers when they are updating the PTE.

CPU0                              CPU1

Test for _PAGE_PRESENT
.                                 set to not _PAGE_PRESENT (zero)
Set to _PAGE_VALID

So now the page not present value (zero) is suddenly valid and user
space programs have access to physical page zero.

We close the race by putting the test for _PAGE_PRESENT and setting of
_PAGE_VALID into an atomic LL/SC section.  This requires more registers
than just K0 and K1 in the handlers, so we need to save some registers
to a save area and then restore them when we are done.

The save area is an array of cacheline aligned structures that should
not suffer cache line bouncing as they are CPU private.

[ralf@linux-mips.org: Fix !defined(CONFIG_MIPS_PGD_C0_CONTEXT) build error.]

Signed-off-by: David Daney <david.daney@cavium.com>
To: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/2577/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/mm/tlbex.c