]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commitd917adf8cf4b492393ed770771fb93fa542cae4d
tree101ca3c89186e1feb07ceb61ba91a9150d19218f
parent6c842125aeb17228d9de1b9b04cf9cd5befe87b3
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