FAILED: patch "[PATCH] powerpc/64s: __find_linux_pte() synchronization vs" failed to apply to 5.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From a00196a272161338d4b1d66ec69e3d57c6b280e0 Mon Sep 17 00:00:00 2001
From: Nicholas Piggin <[email protected]>
Date: Fri, 7 Jun 2019 13:56:36 +1000
Subject: [PATCH] powerpc/64s: __find_linux_pte() synchronization vs
pmdp_invalidate()
The change to pmdp_invalidate() to mark the pmd with _PAGE_INVALID broke the synchronisation against lock free lookups, __find_linux_pte()'s pmd_none() check no longer returns true for such cases.
Fix this by adding a check for this condition as well.
arch/powerpc/mm/pgtable.c +14 -2
@@ -372,13 +372,25 @@ pte_t *__find_linux_pte(pgd_t *pgdir, unsigned long ea, pdshift =PMD_SHIFT ; pmdp =pmd_offset (&pud, ea); pmd =READ_ONCE (*pmdp); +/* -* A hugepage collapse is captured by pmd_none, because -* it mark the pmd none and do a hpte invalidate. +* A hugepage collapse is captured by this condition, see +* pmdp_collapse_flush. */ if (pmd_none (pmd))return NULL ; +#ifdef CONFIG_PPC_BOOK3S_64 +/* +* A hugepage split is captured by this condition, see +* pmdp_invalidate. +* +* Huge page modification can be caught here too. +*/ +if (pmd_is_serializing (pmd)) +return NULL ; +#endif +if (pmd_trans_huge (pmd) ||pmd_devmap (pmd)) {if (is_thp) *is_thp = true;