On Fri, Apr 25, 2025 at 10:17:05AM +0200, David Hildenbrand wrote: > 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.
Ah my kind of patch :) > > Signed-off-by: David Hildenbrand <da...@redhat.com> LGTM, so: Reviewed-by: Lorenzo Stoakes <lorenzo.stoa...@oracle.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 */ We're losing a comment here but who cares, it's obvious what's happening. > 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 >