Merge tag 'powerpc-5.2-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: "One fix for a regression introduced by our 32-bit KASAN support, which broke booting on machines with "bootx" early debugging enabled. A fix for a bug which broke kexec on 32-bit, introduced by changes to the 32-bit STRICT_KERNEL_RWX support in v5.1. Finally two fixes going to stable for our THP split/collapse handling, discovered by Nick. The first fixes random crashes and/or corruption in guests under sufficient load. Thanks to: Nicholas Piggin, Christophe Leroy, Aaro Koskinen, Mathieu Malaterre" * tag 'powerpc-5.2-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/32s: fix booting with CONFIG_PPC_EARLY_DEBUG_BOOTX powerpc/64s: __find_linux_pte() synchronization vs pmdp_invalidate() powerpc/64s: Fix THP PMD collapse serialisation powerpc: Fix kexec failure on book3s/32
This commit is contained in:
@@ -876,6 +876,23 @@ static inline int pmd_present(pmd_t pmd)
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int pmd_is_serializing(pmd_t pmd)
|
||||
{
|
||||
/*
|
||||
* If the pmd is undergoing a split, the _PAGE_PRESENT bit is clear
|
||||
* and _PAGE_INVALID is set (see pmd_present, pmdp_invalidate).
|
||||
*
|
||||
* This condition may also occur when flushing a pmd while flushing
|
||||
* it (see ptep_modify_prot_start), so callers must ensure this
|
||||
* case is fine as well.
|
||||
*/
|
||||
if ((pmd_raw(pmd) & cpu_to_be64(_PAGE_PRESENT | _PAGE_INVALID)) ==
|
||||
cpu_to_be64(_PAGE_INVALID))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int pmd_bad(pmd_t pmd)
|
||||
{
|
||||
if (radix_enabled())
|
||||
@@ -1092,6 +1109,19 @@ static inline int pmd_protnone(pmd_t pmd)
|
||||
#define pmd_access_permitted pmd_access_permitted
|
||||
static inline bool pmd_access_permitted(pmd_t pmd, bool write)
|
||||
{
|
||||
/*
|
||||
* pmdp_invalidate sets this combination (which is not caught by
|
||||
* !pte_present() check in pte_access_permitted), to prevent
|
||||
* lock-free lookups, as part of the serialize_against_pte_lookup()
|
||||
* synchronisation.
|
||||
*
|
||||
* This also catches the case where the PTE's hardware PRESENT bit is
|
||||
* cleared while TLB is flushed, which is suboptimal but should not
|
||||
* be frequent.
|
||||
*/
|
||||
if (pmd_is_serializing(pmd))
|
||||
return false;
|
||||
|
||||
return pte_access_permitted(pmd_pte(pmd), write);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user