Let's factor it out to make the code easier to grasp.

Use it also in pgprot_writecombine()/pgprot_writethrough() where
clearing the old cachemode might not be required, but given that we are
already doing a function call, no need to care about this
micro-optimization.

Signed-off-by: David Hildenbrand <da...@redhat.com>
---
 arch/x86/mm/pat/memtype.c | 33 +++++++++++++++------------------
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/arch/x86/mm/pat/memtype.c b/arch/x86/mm/pat/memtype.c
index 72d8cbc611583..edec5859651d6 100644
--- a/arch/x86/mm/pat/memtype.c
+++ b/arch/x86/mm/pat/memtype.c
@@ -800,6 +800,12 @@ static inline int range_is_allowed(unsigned long pfn, 
unsigned long size)
 }
 #endif /* CONFIG_STRICT_DEVMEM */
 
+static inline void pgprot_set_cachemode(pgprot_t *prot, enum page_cache_mode 
pcm)
+{
+       *prot = __pgprot((pgprot_val(*prot) & ~_PAGE_CACHE_MASK) |
+                        cachemode2protval(pcm));
+}
+
 int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
                                unsigned long size, pgprot_t *vma_prot)
 {
@@ -811,8 +817,7 @@ int phys_mem_access_prot_allowed(struct file *file, 
unsigned long pfn,
        if (file->f_flags & O_DSYNC)
                pcm = _PAGE_CACHE_MODE_UC_MINUS;
 
-       *vma_prot = __pgprot((pgprot_val(*vma_prot) & ~_PAGE_CACHE_MASK) |
-                            cachemode2protval(pcm));
+       pgprot_set_cachemode(vma_prot, pcm);
        return 1;
 }
 
@@ -880,9 +885,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, 
pgprot_t *vma_prot,
                                (unsigned long long)paddr,
                                (unsigned long long)(paddr + size - 1),
                                cattr_name(pcm));
-                       *vma_prot = __pgprot((pgprot_val(*vma_prot) &
-                                            (~_PAGE_CACHE_MASK)) |
-                                            cachemode2protval(pcm));
+                       pgprot_set_cachemode(vma_prot, pcm);
                }
                return 0;
        }
@@ -907,9 +910,7 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, 
pgprot_t *vma_prot,
                 * We allow returning different type than the one requested in
                 * non strict case.
                 */
-               *vma_prot = __pgprot((pgprot_val(*vma_prot) &
-                                     (~_PAGE_CACHE_MASK)) |
-                                    cachemode2protval(pcm));
+               pgprot_set_cachemode(vma_prot, pcm);
        }
 
        if (memtype_kernel_map_sync(paddr, size, pcm) < 0) {
@@ -1060,9 +1061,7 @@ int track_pfn_remap(struct vm_area_struct *vma, pgprot_t 
*prot,
                        return -EINVAL;
        }
 
-       *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) |
-                        cachemode2protval(pcm));
-
+       pgprot_set_cachemode(prot, pcm);
        return 0;
 }
 
@@ -1073,10 +1072,8 @@ void track_pfn_insert(struct vm_area_struct *vma, 
pgprot_t *prot, pfn_t pfn)
        if (!pat_enabled())
                return;
 
-       /* Set prot based on lookup */
        pcm = lookup_memtype(pfn_t_to_phys(pfn));
-       *prot = __pgprot((pgprot_val(*prot) & (~_PAGE_CACHE_MASK)) |
-                        cachemode2protval(pcm));
+       pgprot_set_cachemode(prot, pcm);
 }
 
 /*
@@ -1115,15 +1112,15 @@ void untrack_pfn_clear(struct vm_area_struct *vma)
 
 pgprot_t pgprot_writecombine(pgprot_t prot)
 {
-       return __pgprot(pgprot_val(prot) |
-                               cachemode2protval(_PAGE_CACHE_MODE_WC));
+       pgprot_set_cachemode(&prot, _PAGE_CACHE_MODE_WC);
+       return prot;
 }
 EXPORT_SYMBOL_GPL(pgprot_writecombine);
 
 pgprot_t pgprot_writethrough(pgprot_t prot)
 {
-       return __pgprot(pgprot_val(prot) |
-                               cachemode2protval(_PAGE_CACHE_MODE_WT));
+       pgprot_set_cachemode(&prot, _PAGE_CACHE_MODE_WT);
+       return prot;
 }
 EXPORT_SYMBOL_GPL(pgprot_writethrough);
 
-- 
2.49.0

Reply via email to