* [PATCH 0/2] ARM: fix the pmd_mknotpresent definition
@ 2016-05-31 16:37 Catalin Marinas
2016-05-31 16:37 ` [PATCH 1/2] ARM: mm: ensure pmd_present only checks the valid bit Catalin Marinas
2016-05-31 16:37 ` [PATCH 2/2] ARM: mm: Fix definition of pmd_mknotpresent Catalin Marinas
0 siblings, 2 replies; 3+ messages in thread
From: Catalin Marinas @ 2016-05-31 16:37 UTC (permalink / raw)
To: linux-arm-kernel
Following discussions on the LKML few months ago:
http://lkml.iu.edu/hypermail/linux/kernel/1602.3/01844.html
we need to adjust the LPAE pmd_mknotpresent() so that it does not clash
with the pmd_none() definition (IOW, we should allow !pmd_none() &&
!pmd_present() after pmd_mknotpresent()). This requires that
pmd_present() checks the L_PMD_SECT_VALID bit instead of a non-zero
value (similar commit for arm64: 5bb1cc0ff9a6 "arm64: Ensure
pmd_present() returns false after pmd_mknotpresent()")
Steve Capper (1):
ARM: mm: Fix definition of pmd_mknotpresent
Will Deacon (1):
ARM: mm: ensure pmd_present only checks the valid bit
arch/arm/include/asm/pgtable-2level.h | 1 +
arch/arm/include/asm/pgtable-3level.h | 5 +++--
arch/arm/include/asm/pgtable.h | 1 -
3 files changed, 4 insertions(+), 3 deletions(-)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] ARM: mm: ensure pmd_present only checks the valid bit
2016-05-31 16:37 [PATCH 0/2] ARM: fix the pmd_mknotpresent definition Catalin Marinas
@ 2016-05-31 16:37 ` Catalin Marinas
2016-05-31 16:37 ` [PATCH 2/2] ARM: mm: Fix definition of pmd_mknotpresent Catalin Marinas
1 sibling, 0 replies; 3+ messages in thread
From: Catalin Marinas @ 2016-05-31 16:37 UTC (permalink / raw)
To: linux-arm-kernel
From: Will Deacon <will.deacon@arm.com>
In a subsequent patch, pmd_mknotpresent will clear the valid bit of the
pmd entry, resulting in a not-present entry from the hardware's
perspective. Unfortunately, pmd_present simply checks for a non-zero pmd
value and will therefore continue to return true even after a
pmd_mknotpresent operation. Since pmd_mknotpresent is only used for
managing huge entries, this is only an issue for the 3-level case.
This patch fixes the 3-level pmd_present implementation to take into
account the valid bit. For bisectability, the change is made before the
fix to pmd_mknotpresent.
Fixes: 8d9625070073 ("ARM: mm: Transparent huge page support for LPAE systems.")
Cc: <stable@vger.kernel.org> # 3.11+
Cc: Russell King <linux@armlinux.org.uk>
Cc: Steve Capper <Steve.Capper@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
[catalin.marinas at arm.com: comment update regarding pmd_mknotpresent patch]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
---
arch/arm/include/asm/pgtable-2level.h | 1 +
arch/arm/include/asm/pgtable-3level.h | 1 +
arch/arm/include/asm/pgtable.h | 1 -
3 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h
index aeddd28b3595..92fd2c8a9af0 100644
--- a/arch/arm/include/asm/pgtable-2level.h
+++ b/arch/arm/include/asm/pgtable-2level.h
@@ -193,6 +193,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
#define pmd_large(pmd) (pmd_val(pmd) & 2)
#define pmd_bad(pmd) (pmd_val(pmd) & 2)
+#define pmd_present(pmd) (pmd_val(pmd))
#define copy_pmd(pmdpd,pmdps) \
do { \
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
index fa70db7c714b..4dce1580bc15 100644
--- a/arch/arm/include/asm/pgtable-3level.h
+++ b/arch/arm/include/asm/pgtable-3level.h
@@ -211,6 +211,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr)
: !!(pmd_val(pmd) & (val)))
#define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
+#define pmd_present(pmd) (pmd_isset((pmd), L_PMD_SECT_VALID))
#define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
#define pte_special(pte) (pte_isset((pte), L_PTE_SPECIAL))
static inline pte_t pte_mkspecial(pte_t pte)
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
index 348caabb7625..d62204060cbe 100644
--- a/arch/arm/include/asm/pgtable.h
+++ b/arch/arm/include/asm/pgtable.h
@@ -182,7 +182,6 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
#define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
#define pmd_none(pmd) (!pmd_val(pmd))
-#define pmd_present(pmd) (pmd_val(pmd))
static inline pte_t *pmd_page_vaddr(pmd_t pmd)
{
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] ARM: mm: Fix definition of pmd_mknotpresent
2016-05-31 16:37 [PATCH 0/2] ARM: fix the pmd_mknotpresent definition Catalin Marinas
2016-05-31 16:37 ` [PATCH 1/2] ARM: mm: ensure pmd_present only checks the valid bit Catalin Marinas
@ 2016-05-31 16:37 ` Catalin Marinas
1 sibling, 0 replies; 3+ messages in thread
From: Catalin Marinas @ 2016-05-31 16:37 UTC (permalink / raw)
To: linux-arm-kernel
From: Steve Capper <steve.capper@arm.com>
Currently pmd_mknotpresent will use a zero entry to respresent an
invalidated pmd.
Unfortunately this definition clashes with pmd_none, thus it is
possible for a race condition to occur if zap_pmd_range sees pmd_none
whilst __split_huge_pmd_locked is running too with pmdp_invalidate
just called.
This patch fixes the race condition by modifying pmd_mknotpresent to
create non-zero faulting entries (as is done in other architectures),
removing the ambiguity with pmd_none.
Fixes: 8d9625070073 ("ARM: mm: Transparent huge page support for LPAE systems.")
Cc: <stable@vger.kernel.org> # 3.11+
Reported-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Cc: Russell King <linux@armlinux.org.uk>
Signed-off-by: Steve Capper <steve.capper@arm.com>
[catalin.marinas at arm.com: using L_PMD_SECT_VALID instead of PMD_TYPE_SECT]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
---
arch/arm/include/asm/pgtable-3level.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h
index 4dce1580bc15..2a029bceaf2f 100644
--- a/arch/arm/include/asm/pgtable-3level.h
+++ b/arch/arm/include/asm/pgtable-3level.h
@@ -250,10 +250,10 @@ PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
#define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
#define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot)
-/* represent a notpresent pmd by zero, this is used by pmdp_invalidate */
+/* represent a notpresent pmd by faulting entry, this is used by pmdp_invalidate */
static inline pmd_t pmd_mknotpresent(pmd_t pmd)
{
- return __pmd(0);
+ return __pmd(pmd_val(pmd) & ~L_PMD_SECT_VALID);
}
static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-05-31 16:37 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-31 16:37 [PATCH 0/2] ARM: fix the pmd_mknotpresent definition Catalin Marinas
2016-05-31 16:37 ` [PATCH 1/2] ARM: mm: ensure pmd_present only checks the valid bit Catalin Marinas
2016-05-31 16:37 ` [PATCH 2/2] ARM: mm: Fix definition of pmd_mknotpresent Catalin Marinas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).