x86/mm: Cleanup pgprot_4k_2_large() and pgprot_large_2_4k()
authorChristoph Hellwig <hch@lst.de>
Wed, 8 Apr 2020 15:27:44 +0000 (17:27 +0200)
committerBorislav Petkov <bp@suse.de>
Thu, 23 Apr 2020 09:31:52 +0000 (11:31 +0200)
Make use of lower level helpers that operate on the raw protection
values to make the code a little easier to understand, and to also
avoid extra conversions in a few callers.

[ Qian: Fix a wrongly placed bracket in the original submission.
  Reported and fixed by Qian Cai <cai@lca.pw>. Details in second
  Link: below. ]

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200408152745.1565832-4-hch@lst.de
Link: https://lkml.kernel.org/r/1ED37D02-125F-4919-861A-371981581D9E@lca.pw
arch/x86/include/asm/pgtable_types.h
arch/x86/mm/init_64.c
arch/x86/mm/pgtable.c

index 75fe903..a3b78d8 100644 (file)
@@ -488,24 +488,24 @@ static inline pgprot_t cachemode2pgprot(enum page_cache_mode pcm)
 {
        return __pgprot(cachemode2protval(pcm));
 }
-static inline pgprot_t pgprot_4k_2_large(pgprot_t pgprot)
+static inline unsigned long protval_4k_2_large(unsigned long val)
 {
-       pgprotval_t val = pgprot_val(pgprot);
-       pgprot_t new;
-
-       pgprot_val(new) = (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) |
+       return (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) |
                ((val & _PAGE_PAT) << (_PAGE_BIT_PAT_LARGE - _PAGE_BIT_PAT));
-       return new;
+}
+static inline pgprot_t pgprot_4k_2_large(pgprot_t pgprot)
+{
+       return __pgprot(protval_4k_2_large(pgprot_val(pgprot)));
+}
+static inline unsigned long protval_large_2_4k(unsigned long val)
+{
+       return (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) |
+               ((val & _PAGE_PAT_LARGE) >>
+                (_PAGE_BIT_PAT_LARGE - _PAGE_BIT_PAT));
 }
 static inline pgprot_t pgprot_large_2_4k(pgprot_t pgprot)
 {
-       pgprotval_t val = pgprot_val(pgprot);
-       pgprot_t new;
-
-       pgprot_val(new) = (val & ~(_PAGE_PAT | _PAGE_PAT_LARGE)) |
-                         ((val & _PAGE_PAT_LARGE) >>
-                          (_PAGE_BIT_PAT_LARGE - _PAGE_BIT_PAT));
-       return new;
+       return __pgprot(protval_large_2_4k(pgprot_val(pgprot)));
 }
 
 
index 3b289c2..9a497ba 100644 (file)
@@ -367,7 +367,7 @@ static void __init __init_extra_mapping(unsigned long phys, unsigned long size,
        pgprot_t prot;
 
        pgprot_val(prot) = pgprot_val(PAGE_KERNEL_LARGE) |
-               pgprot_val(pgprot_4k_2_large(cachemode2pgprot(cache)));
+               protval_4k_2_large(cachemode2protval(cache));
        BUG_ON((phys & ~PMD_MASK) || (size & ~PMD_MASK));
        for (; size; phys += PMD_SIZE, size -= PMD_SIZE) {
                pgd = pgd_offset_k((unsigned long)__va(phys));
index 7bd2c3a..c54d1d0 100644 (file)
@@ -706,11 +706,9 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
        if (pud_present(*pud) && !pud_huge(*pud))
                return 0;
 
-       prot = pgprot_4k_2_large(prot);
-
        set_pte((pte_t *)pud, pfn_pte(
                (u64)addr >> PAGE_SHIFT,
-               __pgprot(pgprot_val(prot) | _PAGE_PSE)));
+               __pgprot(protval_4k_2_large(pgprot_val(prot)) | _PAGE_PSE)));
 
        return 1;
 }
@@ -738,11 +736,9 @@ int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
        if (pmd_present(*pmd) && !pmd_huge(*pmd))
                return 0;
 
-       prot = pgprot_4k_2_large(prot);
-
        set_pte((pte_t *)pmd, pfn_pte(
                (u64)addr >> PAGE_SHIFT,
-               __pgprot(pgprot_val(prot) | _PAGE_PSE)));
+               __pgprot(protval_4k_2_large(pgprot_val(prot)) | _PAGE_PSE)));
 
        return 1;
 }