]> git.hungrycats.org Git - linux/commitdiff
x86/speculation/l1tf: Make pmd/pud_mknotpresent() invert
authorAndi Kleen <ak@linux.intel.com>
Tue, 7 Aug 2018 22:09:37 +0000 (15:09 -0700)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 3 Oct 2018 03:10:06 +0000 (04:10 +0100)
commit 0768f91530ff46683e0b372df14fd79fe8d156e5 upstream.

Some cases in THP like:
  - MADV_FREE
  - mprotect
  - split

mark the PMD non present for temporarily to prevent races. The window for
an L1TF attack in these contexts is very small, but it wants to be fixed
for correctness sake.

Use the proper low level functions for pmd/pud_mknotpresent() to address
this.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
[bwh: Backported to 3.16:
 - Drop change to pud_mknotpresent()
 - pmd_mknotpresent() does not touch _PAGE_NONE]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
arch/x86/include/asm/pgtable.h

index cf23aa1915ce1993e2cf374832ed505afc125202..5a102146341b561024ce95fa91f41721368897de 100644 (file)
@@ -308,11 +308,6 @@ static inline pmd_t pmd_mkwrite(pmd_t pmd)
        return pmd_set_flags(pmd, _PAGE_RW);
 }
 
-static inline pmd_t pmd_mknotpresent(pmd_t pmd)
-{
-       return pmd_clear_flags(pmd, _PAGE_PRESENT);
-}
-
 static inline pud_t pud_set_flags(pud_t pud, pudval_t set)
 {
        pudval_t v = native_pud_val(pud);
@@ -393,6 +388,12 @@ static inline pud_t pfn_pud(unsigned long page_nr, pgprot_t pgprot)
        return __pud(pfn | massage_pgprot(pgprot));
 }
 
+static inline pmd_t pmd_mknotpresent(pmd_t pmd)
+{
+       return pfn_pmd(pmd_pfn(pmd),
+                      __pgprot(pmd_flags(pmd) & ~_PAGE_PRESENT));
+}
+
 static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask);
 
 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)