]> git.baikalelectronics.ru Git - kernel.git/commit
MIPS: Make set_pte() SMP safe.
authorDavid Daney <david.daney@cavium.com>
Tue, 4 Aug 2015 00:48:43 +0000 (17:48 -0700)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 5 Aug 2015 09:11:10 +0000 (11:11 +0200)
commit7861143782d37861e341ec611abb527c7f0d7d0e
tree40c529d5bb47cc8fc7380df3ac4e918fd76852b3
parent2a260bd4a7f329a99ce8dc24c24a067e9748830e
MIPS: Make set_pte() SMP safe.

On MIPS the GLOBAL bit of the PTE must have the same value in any
aligned pair of PTEs.  These pairs of PTEs are referred to as
"buddies".  In a SMP system is is possible for two CPUs to be calling
set_pte() on adjacent PTEs at the same time.  There is a race between
setting the PTE and a different CPU setting the GLOBAL bit in its
buddy PTE.

This race can be observed when multiple CPUs are executing
vmap()/vfree() at the same time.

Make setting the buddy PTE's GLOBAL bit an atomic operation to close
the race condition.

The case of CONFIG_64BIT_PHYS_ADDR && CONFIG_CPU_MIPS32 is *not*
handled.

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: <stable@vger.kernel.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/10835/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/pgtable.h