mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-27 19:53:15 -04:00
mm: introduce vma_get_page_prot() and use it
There's a large number of vm_get_page_prot(vma->vm_flags) invocations. Make life easier by introducing vma_get_page_prot() parameterised by the VMA. This also makes converting vm_get_page_prot() to vma_flags_t easier. Also update the userland VMA tests to reflect the change. No functional change intended. Link: https://lore.kernel.org/20260711-b4-vma-flags-mm-v2-8-0fa2357d5431@kernel.org Signed-off-by: Lorenzo Stoakes <ljs@kernel.org> Acked-by: Zi Yan <ziy@nvidia.com> Acked-by: Jani Nikula <jani.nikula@intel.com> # for i915 Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de> [DRM] Reviewed-by: Vlastimil Babka (SUSE) <vbabka@kernel.org> Cc: Baolin Wang <baolin.wang@linux.alibaba.com> Cc: Barry Song <baohua@kernel.org> Cc: Christian Brauner <brauner@kernel.org> Cc: Dave Airlie <airlied@gmail.com> Cc: David Hildenbrand <david@kernel.org> Cc: Dev Jain <dev.jain@arm.com> Cc: Jan Kara <jack@suse.cz> Cc: Jann Horn <jannh@google.com> Cc: Lance Yang <lance.yang@linux.dev> Cc: Mike Rapoport <rppt@kernel.org> Cc: Muchun Song <muchun.song@linux.dev> Cc: Nico Pache <npache@redhat.com> Cc: Oscar Salvador <osalvador@suse.de> Cc: Pedro Falcato <pfalcato@suse.de> Cc: Suren Baghdasaryan <surenb@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
e28266b033
commit
a2fdfd0080
@@ -1252,7 +1252,7 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
||||
}
|
||||
|
||||
vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_writecombine(vma_get_page_prot(vma));
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
}
|
||||
|
||||
|
||||
@@ -540,7 +540,7 @@ int drm_gem_dma_mmap(struct drm_gem_dma_object *dma_obj, struct vm_area_struct *
|
||||
vm_flags_mod(vma, VM_DONTDUMP | VM_DONTEXPAND, VM_PFNMAP);
|
||||
|
||||
if (dma_obj->map_noncoherent) {
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
|
||||
ret = dma_mmap_pages(drm_dev_dma_dev(dma_obj->base.dev),
|
||||
vma, vma->vm_end - vma->vm_start,
|
||||
|
||||
@@ -764,7 +764,7 @@ int drm_gem_shmem_mmap(struct drm_gem_shmem_object *shmem, struct vm_area_struct
|
||||
return ret;
|
||||
|
||||
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
if (shmem->map_wc)
|
||||
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ static int etnaviv_gem_mmap_obj(struct etnaviv_gem_object *etnaviv_obj,
|
||||
|
||||
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
|
||||
vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vm_page_prot = vma_get_page_prot(vma);
|
||||
|
||||
if (etnaviv_obj->flags & ETNA_BO_WC) {
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_page_prot);
|
||||
|
||||
@@ -377,13 +377,13 @@ static int exynos_drm_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct
|
||||
|
||||
/* non-cachable as default. */
|
||||
if (exynos_gem->flags & EXYNOS_BO_CACHABLE)
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
else if (exynos_gem->flags & EXYNOS_BO_WC)
|
||||
vma->vm_page_prot =
|
||||
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_writecombine(vma_get_page_prot(vma));
|
||||
else
|
||||
vma->vm_page_prot =
|
||||
pgprot_noncached(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_noncached(vma_get_page_prot(vma));
|
||||
|
||||
ret = exynos_drm_gem_mmap_buffer(exynos_gem, vma);
|
||||
if (ret)
|
||||
|
||||
@@ -112,7 +112,7 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
|
||||
vma = find_vma(mm, addr);
|
||||
if (vma && __vma_matches(vma, obj->base.filp, addr, args->size))
|
||||
vma->vm_page_prot =
|
||||
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_writecombine(vma_get_page_prot(vma));
|
||||
else
|
||||
addr = -ENOMEM;
|
||||
mmap_write_unlock(mm);
|
||||
@@ -1024,7 +1024,7 @@ i915_gem_object_mmap(struct drm_i915_gem_object *obj,
|
||||
fput(anon);
|
||||
|
||||
if (obj->ops->mmap_ops) {
|
||||
vma->vm_page_prot = pgprot_decrypted(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_decrypted(vma_get_page_prot(vma));
|
||||
vma->vm_ops = obj->ops->mmap_ops;
|
||||
vma->vm_private_data = obj->base.vma_node.driver_private;
|
||||
return 0;
|
||||
@@ -1035,7 +1035,7 @@ i915_gem_object_mmap(struct drm_i915_gem_object *obj,
|
||||
switch (mmo->mmap_type) {
|
||||
case I915_MMAP_TYPE_WC:
|
||||
vma->vm_page_prot =
|
||||
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_writecombine(vma_get_page_prot(vma));
|
||||
vma->vm_ops = &vm_ops_cpu;
|
||||
break;
|
||||
|
||||
@@ -1043,19 +1043,19 @@ i915_gem_object_mmap(struct drm_i915_gem_object *obj,
|
||||
GEM_WARN_ON(1);
|
||||
fallthrough;
|
||||
case I915_MMAP_TYPE_WB:
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
vma->vm_ops = &vm_ops_cpu;
|
||||
break;
|
||||
|
||||
case I915_MMAP_TYPE_UC:
|
||||
vma->vm_page_prot =
|
||||
pgprot_noncached(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_noncached(vma_get_page_prot(vma));
|
||||
vma->vm_ops = &vm_ops_cpu;
|
||||
break;
|
||||
|
||||
case I915_MMAP_TYPE_GTT:
|
||||
vma->vm_page_prot =
|
||||
pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
pgprot_writecombine(vma_get_page_prot(vma));
|
||||
vma->vm_ops = &vm_ops_gtt;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1125,7 +1125,7 @@ static int msm_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struct
|
||||
struct msm_gem_object *msm_obj = to_msm_bo(obj);
|
||||
|
||||
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_page_prot = msm_gem_pgprot(msm_obj, vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = msm_gem_pgprot(msm_obj, vma_get_page_prot(vma));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ static vm_fault_t nouveau_ttm_fault(struct vm_fault *vmf)
|
||||
goto error_unlock;
|
||||
|
||||
nouveau_bo_del_io_reserve_lru(bo);
|
||||
prot = vm_get_page_prot(vma->vm_flags);
|
||||
prot = vma_get_page_prot(vma);
|
||||
ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT);
|
||||
nouveau_bo_add_io_reserve_lru(bo);
|
||||
if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
|
||||
|
||||
@@ -84,7 +84,7 @@ static int omap_fbdev_pan_display(struct fb_var_screeninfo *var, struct fb_info
|
||||
|
||||
static int omap_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||
{
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_writecombine(vma_get_page_prot(vma));
|
||||
|
||||
return fb_deferred_io_mmap(info, vma);
|
||||
}
|
||||
|
||||
@@ -538,9 +538,9 @@ static int omap_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struc
|
||||
vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP | VM_IO | VM_MIXEDMAP);
|
||||
|
||||
if (omap_obj->flags & OMAP_BO_WC) {
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_writecombine(vma_get_page_prot(vma));
|
||||
} else if (omap_obj->flags & OMAP_BO_UNCACHED) {
|
||||
vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_noncached(vma_get_page_prot(vma));
|
||||
} else {
|
||||
/*
|
||||
* We do have some private objects, at least for scanout buffers
|
||||
@@ -558,7 +558,7 @@ static int omap_gem_object_mmap(struct drm_gem_object *obj, struct vm_area_struc
|
||||
vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
|
||||
vma_set_file(vma, obj->filp);
|
||||
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
}
|
||||
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
|
||||
@@ -776,7 +776,7 @@ static int panthor_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *v
|
||||
}
|
||||
|
||||
vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
if (should_map_wc(bo))
|
||||
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
|
||||
|
||||
|
||||
@@ -255,7 +255,7 @@ static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj,
|
||||
*/
|
||||
vm_flags_mod(vma, VM_IO | VM_DONTEXPAND | VM_DONTDUMP, VM_PFNMAP);
|
||||
|
||||
vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_writecombine(vma_get_page_prot(vma));
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
|
||||
if (rk_obj->pages)
|
||||
|
||||
@@ -602,7 +602,7 @@ int __tegra_gem_mmap(struct drm_gem_object *gem, struct vm_area_struct *vma)
|
||||
|
||||
vma->vm_pgoff = vm_pgoff;
|
||||
} else {
|
||||
pgprot_t prot = vm_get_page_prot(vma->vm_flags);
|
||||
pgprot_t prot = vma_get_page_prot(vma);
|
||||
|
||||
vm_flags_mod(vma, VM_MIXEDMAP, VM_PFNMAP);
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ static int virtio_gpu_vram_mmap(struct drm_gem_object *obj,
|
||||
|
||||
vma->vm_pgoff -= drm_vma_node_start(&obj->vma_node);
|
||||
vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
vma->vm_page_prot = pgprot_decrypted(vma->vm_page_prot);
|
||||
vma->vm_ops = &virtio_gpu_vram_vm_ops;
|
||||
|
||||
|
||||
@@ -481,7 +481,7 @@ vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf)
|
||||
if (vbo->dirty && vbo->dirty->method == VMW_BO_DIRTY_MKWRITE)
|
||||
prot = vm_get_page_prot(vma->vm_flags & ~VM_SHARED);
|
||||
else
|
||||
prot = vm_get_page_prot(vma->vm_flags);
|
||||
prot = vma_get_page_prot(vma);
|
||||
|
||||
ret = ttm_bo_vm_fault_reserved(vmf, prot, num_prefault);
|
||||
if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
|
||||
|
||||
@@ -281,7 +281,7 @@ static vm_fault_t barrier_fault(struct vm_fault *vmf)
|
||||
pgprot_t prot;
|
||||
int idx;
|
||||
|
||||
prot = vm_get_page_prot(vma->vm_flags);
|
||||
prot = vma_get_page_prot(vma);
|
||||
|
||||
if (drm_dev_enter(dev, &idx)) {
|
||||
unsigned long pfn;
|
||||
|
||||
@@ -149,7 +149,7 @@ static int xe_mmio_gem_mmap(struct drm_gem_object *base, struct vm_area_struct *
|
||||
|
||||
/* Set vm_pgoff (used as a fake buffer offset by DRM) to 0 */
|
||||
vma->vm_pgoff = 0;
|
||||
vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags));
|
||||
vma->vm_page_prot = pgprot_noncached(vma_get_page_prot(vma));
|
||||
vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP |
|
||||
VM_DONTCOPY | VM_NORESERVE);
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ static int xen_drm_front_gem_object_mmap(struct drm_gem_object *gem_obj,
|
||||
* which is mapped as Normal Inner Write-Back Outer Write-Back
|
||||
* Inner-Shareable.
|
||||
*/
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
|
||||
/*
|
||||
* vm_operations_struct.fault handler will be called if CPU access
|
||||
|
||||
@@ -161,7 +161,7 @@ int fb_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
|
||||
len = info->fix.mmio_len;
|
||||
}
|
||||
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
vma->vm_page_prot = pgprot_framebuffer(vma->vm_page_prot, vma->vm_start,
|
||||
vma->vm_end, start);
|
||||
|
||||
|
||||
@@ -4610,6 +4610,11 @@ static inline pgprot_t vma_flags_to_page_prot(vma_flags_t vma_flags)
|
||||
return vm_get_page_prot(vm_flags);
|
||||
}
|
||||
|
||||
static inline pgprot_t vma_get_page_prot(const struct vm_area_struct *vma)
|
||||
{
|
||||
return vma_flags_to_page_prot(vma->flags);
|
||||
}
|
||||
|
||||
void vma_set_page_prot(struct vm_area_struct *vma);
|
||||
#else
|
||||
static inline pgprot_t vm_get_page_prot(vm_flags_t vm_flags)
|
||||
@@ -4620,9 +4625,13 @@ static inline pgprot_t vma_flags_to_page_prot(vma_flags_t vma_flags)
|
||||
{
|
||||
return __pgprot(0);
|
||||
}
|
||||
static inline pgprot_t vma_get_page_prot(const struct vm_area_struct *vma)
|
||||
{
|
||||
return __pgprot(0);
|
||||
}
|
||||
static inline void vma_set_page_prot(struct vm_area_struct *vma)
|
||||
{
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
2
mm/vma.c
2
mm/vma.c
@@ -3430,7 +3430,7 @@ struct vm_area_struct *__install_special_mapping(
|
||||
if (pgtable_supports_soft_dirty())
|
||||
vm_flags |= VM_SOFTDIRTY;
|
||||
vm_flags_init(vma, vm_flags & ~VM_LOCKED_MASK);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
|
||||
vma->vm_ops = ops;
|
||||
vma->vm_private_data = priv;
|
||||
|
||||
@@ -146,7 +146,7 @@ int create_init_stack_vma(struct mm_struct *mm, struct vm_area_struct **vmap,
|
||||
if (pgtable_supports_soft_dirty())
|
||||
flags |= VM_SOFTDIRTY;
|
||||
vm_flags_init(vma, flags);
|
||||
vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
|
||||
vma->vm_page_prot = vma_get_page_prot(vma);
|
||||
|
||||
err = insert_vm_struct(mm, vma);
|
||||
if (err)
|
||||
|
||||
@@ -851,7 +851,7 @@ static void snd_dma_noncoherent_free(struct snd_dma_buffer *dmab)
|
||||
static int snd_dma_noncoherent_mmap(struct snd_dma_buffer *dmab,
|
||||
struct vm_area_struct *area)
|
||||
{
|
||||
area->vm_page_prot = vm_get_page_prot(area->vm_flags);
|
||||
area->vm_page_prot = vma_get_page_prot(area);
|
||||
return dma_mmap_pages(dmab->dev.dev, area,
|
||||
area->vm_end - area->vm_start,
|
||||
virt_to_page(dmab->area));
|
||||
|
||||
@@ -1575,3 +1575,8 @@ static inline void vma_assert_can_modify(struct vm_area_struct *vma)
|
||||
if (vma_is_attached(vma))
|
||||
vma_assert_write_locked(vma);
|
||||
}
|
||||
|
||||
static inline pgprot_t vma_get_page_prot(const struct vm_area_struct *vma)
|
||||
{
|
||||
return vma_flags_to_page_prot(vma->flags);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user