All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@collabora.com>
To: "Loïc Molinari" <loic.molinari@collabora.com>
Cc: "Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
	"Maxime Ripard" <mripard@kernel.org>,
	"Thomas Zimmermann" <tzimmermann@suse.de>,
	"David Airlie" <airlied@gmail.com>,
	"Simona Vetter" <simona@ffwll.ch>,
	"Jani Nikula" <jani.nikula@linux.intel.com>,
	"Joonas Lahtinen" <joonas.lahtinen@linux.intel.com>,
	"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
	"Tvrtko Ursulin" <tursulin@ursulin.net>,
	"Rob Herring" <robh@kernel.org>,
	"Steven Price" <steven.price@arm.com>,
	"Liviu Dudau" <liviu.dudau@arm.com>,
	"Melissa Wen" <mwen@igalia.com>,
	"Maíra Canal" <mcanal@igalia.com>,
	"Hugh Dickins" <hughd@google.com>,
	"Baolin Wang" <baolin.wang@linux.alibaba.com>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Al Viro" <viro@zeniv.linux.org.uk>,
	"Mikołaj Wasiak" <mikolaj.wasiak@intel.com>,
	"Christian Brauner" <brauner@kernel.org>,
	"Nitin Gote" <nitin.r.gote@intel.com>,
	"Andi Shyti" <andi.shyti@linux.intel.com>,
	"Christopher Healy" <healych@amazon.com>,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	intel-gfx@lists.freedesktop.org, linux-mm@kvack.org,
	kernel@collabora.com, "kernel test robot" <lkp@intel.com>
Subject: Re: [PATCH v3 01/10] drm/shmem-helper: Add huge page fault handler
Date: Mon, 6 Oct 2025 08:52:47 +0200	[thread overview]
Message-ID: <20251006085247.52f29f59@fedora> (raw)
In-Reply-To: <20251004093054.21388-2-loic.molinari@collabora.com>

On Sat,  4 Oct 2025 11:30:44 +0200
Loïc Molinari <loic.molinari@collabora.com> wrote:

> This gives the mm subsystem the ability to propose the insertion of
> PUD or PMD-sized mappings for the faulting addresses.
> 
> On builds with CONFIG_TRANSPARENT_HUGEPAGE enabled, if the mmap() user
> address is aligned to a huge page size, if the GEM object is backed by
> shmem buffers on mount points setting the 'huge=' option and if the
> shmem backing store manages to allocate a huge folio, the CPU mapping
> will then benefit from significantly increased memcpy() performance.
> When these conditions are met on a system with 2 MiB huge pages, an
> aligned copy of 2 MiB would raise a single page fault instead of 4096.
> 
> v2:
> - set ret to VM_FAULT_FALLBACK in default switch statement
> - ifdef out paddr declaration
> 
> Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://lore.kernel.org/oe-kbuild-all/202509241315.8jjCyL7U-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202509241654.qJk1H5kr-lkp@intel.com/
> Closes: https://lore.kernel.org/oe-kbuild-all/202509241920.PtSEkfd4-lkp@intel.com/

I'm not sure those Closes/Reported-by tags are needed when you fix bugs
introduced in a previous revisions of the patchset.

> ---
>  drivers/gpu/drm/drm_gem_shmem_helper.c | 56 ++++++++++++++++++++++++--
>  1 file changed, 52 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c
> index 50594cf8e17c..22c4b09e10a3 100644
> --- a/drivers/gpu/drm/drm_gem_shmem_helper.c
> +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c
> @@ -573,7 +573,8 @@ int drm_gem_shmem_dumb_create(struct drm_file *file, struct drm_device *dev,
>  }
>  EXPORT_SYMBOL_GPL(drm_gem_shmem_dumb_create);
>  
> -static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
> +static vm_fault_t drm_gem_shmem_huge_fault(struct vm_fault *vmf,
> +					   unsigned int order)
>  {
>  	struct vm_area_struct *vma = vmf->vma;
>  	struct drm_gem_object *obj = vma->vm_private_data;
> @@ -582,6 +583,10 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
>  	vm_fault_t ret;
>  	struct page *page;
>  	pgoff_t page_offset;
> +	unsigned long pfn;
> +#if defined(CONFIG_ARCH_SUPPORTS_PMD_PFNMAP) || defined(CONFIG_ARCH_SUPPORTS_PUD_PFNMAP)
> +	unsigned long paddr;
> +#endif
>  
>  	/* We don't use vmf->pgoff since that has the fake offset */
>  	page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT;
> @@ -592,17 +597,57 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
>  	    drm_WARN_ON_ONCE(obj->dev, !shmem->pages) ||
>  	    shmem->madv < 0) {
>  		ret = VM_FAULT_SIGBUS;
> -	} else {
> -		page = shmem->pages[page_offset];
> +		goto out;
> +	}
>  
> -		ret = vmf_insert_pfn(vma, vmf->address, page_to_pfn(page));
> +	page = shmem->pages[page_offset];
> +	pfn = page_to_pfn(page);
> +
> +	switch (order) {
> +	case 0:
> +		ret = vmf_insert_pfn(vma, vmf->address, pfn);
> +		break;
> +
> +#ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
> +	case PMD_ORDER:
> +		paddr = pfn << PAGE_SHIFT;
> +		if (((vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK)) &&
> +		    (folio_order(page_folio(page)) == PMD_ORDER))
> +			ret = vmf_insert_pfn_pmd(
> +				    vmf, pfn & (PMD_MASK >> PAGE_SHIFT), false);
> +		else
> +			ret = VM_FAULT_FALLBACK;
> +		break;
> +#endif
> +
> +#ifdef CONFIG_ARCH_SUPPORTS_PUD_PFNMAP
> +	case PUD_ORDER:
> +		paddr = pfn << PAGE_SHIFT;
> +		if (((vmf->address & ~PUD_MASK) == (paddr & ~PUD_MASK)) &&
> +		    (folio_order(page_folio(page)) == PUD_ORDER))
> +			ret = vmf_insert_pfn_pud(
> +				    vmf, pfn & (PUD_MASK >> PAGE_SHIFT), false);
> +		else
> +			ret = VM_FAULT_FALLBACK;
> +		break;
> +#endif
> +
> +	default:
> +		ret = VM_FAULT_FALLBACK;
> +		break;
>  	}
>  
> + out:
>  	dma_resv_unlock(shmem->base.resv);
>  
>  	return ret;
>  }
>  
> +static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf)
> +{
> +	return drm_gem_shmem_huge_fault(vmf, 0);
> +}
> +
>  static void drm_gem_shmem_vm_open(struct vm_area_struct *vma)
>  {
>  	struct drm_gem_object *obj = vma->vm_private_data;
> @@ -639,6 +684,9 @@ static void drm_gem_shmem_vm_close(struct vm_area_struct *vma)
>  
>  const struct vm_operations_struct drm_gem_shmem_vm_ops = {
>  	.fault = drm_gem_shmem_fault,
> +#if defined(CONFIG_ARCH_SUPPORTS_PMD_PFNMAP) || defined(CONFIG_ARCH_SUPPORTS_PUD_PFNMAP)
> +	.huge_fault = drm_gem_shmem_huge_fault,
> +#endif
>  	.open = drm_gem_shmem_vm_open,
>  	.close = drm_gem_shmem_vm_close,
>  };


  parent reply	other threads:[~2025-10-06  6:52 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-04  9:30 [PATCH v3 00/10] drm: Reduce page tables overhead with THP Loïc Molinari
2025-10-04  9:30 ` [PATCH v3 01/10] drm/shmem-helper: Add huge page fault handler Loïc Molinari
2025-10-04 22:53   ` Matthew Wilcox
2025-10-06  6:52   ` Boris Brezillon [this message]
2025-10-06 16:01   ` Andi Shyti
2025-10-04  9:30 ` [PATCH v3 02/10] drm/gem: Introduce drm_gem_get_unmapped_area() fop Loïc Molinari
2025-10-10  7:48   ` kernel test robot
2025-10-04  9:30 ` [PATCH v3 03/10] drm/gem: Add huge tmpfs mount point helper Loïc Molinari
2025-10-04 20:34   ` Al Viro
2025-10-06  6:58   ` Boris Brezillon
2025-10-06  7:02   ` Boris Brezillon
2025-10-04  9:30 ` [PATCH v3 04/10] drm/i915: Use " Loïc Molinari
2025-10-04  9:30 ` [PATCH v3 05/10] drm/v3d: " Loïc Molinari
2025-10-06  7:07   ` Boris Brezillon
2025-10-04  9:30 ` [PATCH v3 06/10] drm/gem: Get rid of *_with_mnt helpers Loïc Molinari
2025-10-06  7:17   ` Boris Brezillon
2025-10-04  9:30 ` [PATCH v3 07/10] drm/panthor: Introduce huge tmpfs mount point option Loïc Molinari
2025-10-06  7:28   ` Boris Brezillon
2025-10-15 13:09     ` Loïc Molinari
2025-10-15 13:12       ` Boris Brezillon
2025-10-06  7:34   ` Boris Brezillon
2025-10-04  9:30 ` [PATCH v3 08/10] drm/panthor: Improve IOMMU map/unmap debugging logs Loïc Molinari
2025-10-04  9:30 ` [PATCH v3 09/10] drm/panfrost: Introduce huge tmpfs mount point option Loïc Molinari
2025-10-06  7:33   ` Boris Brezillon
2025-10-04  9:30 ` [PATCH v3 10/10] Documentation/gpu/drm-mm: Add THP paragraph to GEM mapping section Loïc Molinari
2025-10-04 22:40   ` Bagas Sanjaya
2025-10-04 10:42 ` ✓ i915.CI.BAT: success for series starting with [v3,01/10] drm/shmem-helper: Add huge page fault handler Patchwork
2025-10-04 12:26 ` ✗ i915.CI.Full: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251006085247.52f29f59@fedora \
    --to=boris.brezillon@collabora.com \
    --cc=airlied@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andi.shyti@linux.intel.com \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=brauner@kernel.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=healych@amazon.com \
    --cc=hughd@google.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=joonas.lahtinen@linux.intel.com \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=liviu.dudau@arm.com \
    --cc=lkp@intel.com \
    --cc=loic.molinari@collabora.com \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mcanal@igalia.com \
    --cc=mikolaj.wasiak@intel.com \
    --cc=mripard@kernel.org \
    --cc=mwen@igalia.com \
    --cc=nitin.r.gote@intel.com \
    --cc=robh@kernel.org \
    --cc=rodrigo.vivi@intel.com \
    --cc=simona@ffwll.ch \
    --cc=steven.price@arm.com \
    --cc=tursulin@ursulin.net \
    --cc=tzimmermann@suse.de \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.