On Wed,  4 Feb 2026 12:39:29 +0100
Thomas Zimmermann <[email protected]> wrote:

> Return the exact VM_FAULT_ mask from drm_gem_shmem_try_map_pmd(). Gives
> the caller better insight into the result. Return 0 if nothing was done.
> 
> If the caller sees VM_FAULT_NOPAGE, drm_gem_shmem_try_map_pmd() added a
> PMD entry to the page table. As before, return early from the page-fault
> handler in that case.
> 
> Signed-off-by: Thomas Zimmermann <[email protected]>
> Suggested-by: Matthew Wilcox <[email protected]>

Reviewed-by: Boris Brezillon <[email protected]>

> ---
>  drivers/gpu/drm/drm_gem_shmem_helper.c | 14 ++++++--------
>  1 file changed, 6 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c 
> b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index 3871a6d92f77..e7316dc7e921 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -550,8 +550,8 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, 
> struct drm_device *dev,
>  }
>  EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);
>  
> -static bool drm_gem_shmem_try_map_pmd(struct vm_fault *vmf, unsigned long 
> addr,
> -                                   struct page *page)
> +static vm_fault_t drm_gem_shmem_try_map_pmd(struct vm_fault *vmf, unsigned 
> long addr,
> +                                         struct page *page)
>  {
>  #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
>       unsigned long pfn = page_to_pfn(page);
> @@ -562,12 +562,11 @@ static bool drm_gem_shmem_try_map_pmd(struct vm_fault 
> *vmf, unsigned long addr,
>           pmd_none(*vmf->pmd) &&
>           folio_test_pmd_mappable(page_folio(page))) {
>               pfn &= PMD_MASK >> PAGE_SHIFT;
> -             if (vmf_insert_pfn_pmd(vmf, pfn, false) == VM_FAULT_NOPAGE)
> -                     return true;
> +             return vmf_insert_pfn_pmd(vmf, pfn, false);
>       }
>  #endif
>  
> -     return false;
> +     return 0;
>  }
>  
>  static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
> @@ -593,10 +592,9 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault 
> *vmf)
>               goto out;
>       }
>  
> -     if (drm_gem_shmem_try_map_pmd(vmf, vmf->address, pages[page_offset])) {
> -             ret = VM_FAULT_NOPAGE;
> +     ret = drm_gem_shmem_try_map_pmd(vmf, vmf->address, pages[page_offset]);
> +     if (ret == VM_FAULT_NOPAGE)
>               goto out;
> -     }
>  
>       pfn = page_to_pfn(pages[page_offset]);
>       ret = vmf_insert_pfn(vma, vmf->address, pfn);

Reply via email to