From: Boris Brezillon <boris.brezillon@collabora.com>
To: Steven Price <steven.price@arm.com>
Cc: "Liviu Dudau" <liviu.dudau@arm.com>,
"Adrián Larumbe" <adrian.larumbe@collabora.com>,
dri-devel@lists.freedesktop.org,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Akash Goel" <akash.goel@arm.com>,
"Rob Clark" <robin.clark@oss.qualcomm.com>,
"Sean Paul" <sean@poorly.run>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Akhil P Oommen" <akhilpo@oss.qualcomm.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"Dmitry Osipenko" <dmitry.osipenko@collabora.com>,
"Chris Diamand" <chris.diamand@arm.com>,
"Danilo Krummrich" <dakr@kernel.org>,
"Matthew Brost" <matthew.brost@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Alice Ryhl" <aliceryhl@google.com>,
kernel@collabora.com
Subject: Re: [PATCH v1 6/9] drm/panthor: Lazily allocate pages on mmap()
Date: Mon, 12 Jan 2026 15:32:00 +0100 [thread overview]
Message-ID: <20260112153200.30fd4e3e@fedora> (raw)
In-Reply-To: <37e36106-8d62-4915-a0e1-c7b283e0ff17@arm.com>
On Mon, 12 Jan 2026 12:15:13 +0000
Steven Price <steven.price@arm.com> wrote:
> On 09/01/2026 13:07, Boris Brezillon wrote:
> > Defer pages allocation until their first access.
> >
> > Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> > ---
> > drivers/gpu/drm/panthor/panthor_gem.c | 119 ++++++++++++++++----------
> > 1 file changed, 75 insertions(+), 44 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
> > index 0e52c7a07c87..44f05bd957e7 100644
> > --- a/drivers/gpu/drm/panthor/panthor_gem.c
> > +++ b/drivers/gpu/drm/panthor/panthor_gem.c
> > @@ -600,15 +600,6 @@ static int panthor_gem_mmap(struct drm_gem_object *obj, struct vm_area_struct *v
> > if (is_cow_mapping(vma->vm_flags))
> > return -EINVAL;
> >
> > - dma_resv_lock(obj->resv, NULL);
> > - ret = panthor_gem_backing_get_pages_locked(bo);
> > - if (!ret)
> > - ret = panthor_gem_prep_for_cpu_map_locked(bo);
> > - dma_resv_unlock(obj->resv);
> > -
> > - if (ret)
> > - return ret;
> > -
> > vm_flags_set(vma, VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
> > vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
> > if (should_map_wc(bo))
> > @@ -628,82 +619,122 @@ static enum drm_gem_object_status panthor_gem_status(struct drm_gem_object *obj)
> > return res;
> > }
> >
> > -static bool try_map_pmd(struct vm_fault *vmf, unsigned long addr, struct page *page)
> > +static vm_fault_t insert_page(struct vm_fault *vmf, struct page *page)
> > {
> > + struct vm_area_struct *vma = vmf->vma;
> > + vm_fault_t ret;
> > +
> > #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
> > unsigned long pfn = page_to_pfn(page);
> > unsigned long paddr = pfn << PAGE_SHIFT;
> > - bool aligned = (addr & ~PMD_MASK) == (paddr & ~PMD_MASK);
> > + bool aligned = (vmf->address & ~PMD_MASK) == (paddr & ~PMD_MASK);
> >
> > if (aligned &&
> > 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;
> > + ret = vmf_insert_pfn_pmd(vmf, pfn, false);
> > + if (ret == VM_FAULT_NOPAGE)
> > + return VM_FAULT_NOPAGE;
> > }
> > #endif
> >
> > - return false;
> > + return vmf_insert_pfn(vma, vmf->address, page_to_pfn(page));
> > }
> >
> > -static vm_fault_t panthor_gem_fault(struct vm_fault *vmf)
> > +static vm_fault_t nonblocking_page_setup(struct vm_fault *vmf, pgoff_t page_offset)
> > {
> > struct vm_area_struct *vma = vmf->vma;
> > - struct drm_gem_object *obj = vma->vm_private_data;
> > struct panthor_gem_object *bo = to_panthor_bo(vma->vm_private_data);
> > - loff_t num_pages = obj->size >> PAGE_SHIFT;
> > vm_fault_t ret;
> > - pgoff_t page_offset;
> > - unsigned long pfn;
> >
> > - /* Offset to faulty address in the VMA. */
> > - page_offset = vmf->pgoff - vma->vm_pgoff;
> > + if (!dma_resv_trylock(bo->base.resv))
> > + return VM_FAULT_RETRY;
> >
> > - dma_resv_lock(bo->base.resv, NULL);
> > + if (bo->backing.pages)
> > + ret = insert_page(vmf, bo->backing.pages[page_offset]);
> > + else
> > + ret = VM_FAULT_RETRY;
> >
> > - if (page_offset >= num_pages ||
> > - drm_WARN_ON_ONCE(obj->dev, !bo->backing.pages)) {
> > - ret = VM_FAULT_SIGBUS;
> > - goto out;
> > + dma_resv_unlock(bo->base.resv);
> > + return ret;
> > +}
> > +
> > +static vm_fault_t blocking_page_setup(struct vm_fault *vmf,
> > + struct panthor_gem_object *bo,
> > + pgoff_t page_offset, bool mmap_lock_held)
> > +{
> > + vm_fault_t ret;
> > + int err;
> > +
> > + if (vmf->flags & FAULT_FLAG_INTERRUPTIBLE) {
> > + err = dma_resv_lock_interruptible(bo->base.resv, NULL);
> > + if (err)
> > + return mmap_lock_held ? VM_FAULT_NOPAGE : VM_FAULT_RETRY;
>
> I'm not sure about this. First FAULT_FLAG_INTERRUPTIBLE is currently
> only used by userfaultfd AFAICT.
And GUP, which admittedly, only seems possible if one tries to map a
userpage in kernel space, and we don't support that (yet?).
> Second returning VM_FAULT_NOPAGE seems
> wrong - that's for the case were we've inserted a pte but in this case
> we haven't.
Got this from [1], and remember going through the fault handler API
with Akash, and finding something describing this case.
>
> Otherwise I couldn't spot any issues staring at the code, but I might
> have missed something. mm code is always hard to follow!
It is, indeed, which is why I'm glad to have a new pair of eyes looking
at this ;-).
Thanks,
Boris
[1]https://elixir.bootlin.com/linux/v6.18.4/source/drivers/gpu/drm/ttm/ttm_bo_vm.c#L116
next prev parent reply other threads:[~2026-01-12 14:32 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-09 13:07 [PATCH v1 0/9] drm/panthor: Add a GEM shrinker Boris Brezillon
2026-01-09 13:07 ` [PATCH v1 1/9] drm/gem: Consider GEM object reclaimable if shrinking fails Boris Brezillon
2026-01-12 9:25 ` Alice Ryhl
2026-01-12 10:02 ` Boris Brezillon
2026-01-15 13:28 ` Liviu Dudau
2026-01-09 13:07 ` [PATCH v1 2/9] drm/gpuvm: Validate BOs in the extobj list when VM is resv protected Boris Brezillon
2026-01-09 19:38 ` Danilo Krummrich
2026-01-12 7:30 ` Boris Brezillon
2026-01-09 13:07 ` [PATCH v1 3/9] drm/panthor: Move panthor_gems_debugfs_init() to panthor_gem.c Boris Brezillon
2026-01-12 11:27 ` Steven Price
2026-01-15 13:39 ` Liviu Dudau
2026-01-09 13:07 ` [PATCH v1 4/9] drm/panthor: Group panthor_kernel_bo_xxx() helpers Boris Brezillon
2026-01-12 11:29 ` Steven Price
2026-01-15 13:41 ` Liviu Dudau
2026-01-09 13:07 ` [PATCH v1 5/9] drm/panthor: Part ways with drm_gem_shmem_object Boris Brezillon
2026-01-12 12:06 ` Steven Price
2026-01-12 14:17 ` Boris Brezillon
2026-01-12 16:03 ` Steven Price
2026-01-12 16:45 ` Boris Brezillon
2026-01-21 11:11 ` Akash Goel
2026-01-21 15:17 ` Boris Brezillon
2026-01-15 16:51 ` Liviu Dudau
2026-01-15 17:27 ` Boris Brezillon
2026-01-15 17:45 ` Liviu Dudau
2026-01-16 12:09 ` Steven Price
2026-01-09 13:07 ` [PATCH v1 6/9] drm/panthor: Lazily allocate pages on mmap() Boris Brezillon
2026-01-12 12:15 ` Steven Price
2026-01-12 14:32 ` Boris Brezillon [this message]
2026-01-12 16:41 ` Steven Price
2026-01-12 16:50 ` Boris Brezillon
2026-01-15 17:34 ` Liviu Dudau
2026-01-15 19:27 ` Boris Brezillon
2026-01-16 8:19 ` kernel test robot
2026-01-09 13:07 ` [PATCH v1 7/9] drm/panthor: Split panthor_vm_prepare_map_op_ctx() to prepare for reclaim Boris Brezillon
2026-01-12 12:21 ` Steven Price
2026-01-15 17:40 ` Liviu Dudau
2026-01-09 13:08 ` [PATCH v1 8/9] drm/panthor: Track the number of mmap on a BO Boris Brezillon
2026-01-12 12:33 ` Steven Price
2026-01-12 14:39 ` Boris Brezillon
2026-01-12 15:19 ` Alice Ryhl
2026-01-12 15:49 ` Boris Brezillon
2026-01-12 15:51 ` Alice Ryhl
2026-01-12 16:06 ` Boris Brezillon
2026-01-12 16:49 ` Steven Price
2026-01-12 16:59 ` Boris Brezillon
2026-01-12 17:10 ` Steven Price
2026-01-12 17:18 ` Boris Brezillon
2026-01-13 12:26 ` Boris Brezillon
2026-01-09 13:08 ` [PATCH v1 9/9] drm/panthor: Add a GEM shrinker Boris Brezillon
2026-01-14 15:05 ` Steven Price
2026-01-15 10:50 ` Boris Brezillon
2026-01-15 11:24 ` Steven Price
2026-01-15 12:01 ` Boris Brezillon
2026-01-15 13:56 ` Akash Goel
2026-01-15 14:36 ` Boris Brezillon
2026-01-15 14:37 ` Boris Brezillon
2026-01-21 11:49 ` Akash Goel
2026-01-21 14:52 ` Boris Brezillon
2026-01-28 11:21 ` Akash Goel
2026-01-28 15:52 ` Boris Brezillon
2026-01-28 16:26 ` Akash Goel
2026-01-12 8:37 ` [PATCH v1 0/9] " Boris Brezillon
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=20260112153200.30fd4e3e@fedora \
--to=boris.brezillon@collabora.com \
--cc=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=akash.goel@arm.com \
--cc=akhilpo@oss.qualcomm.com \
--cc=aliceryhl@google.com \
--cc=chris.diamand@arm.com \
--cc=dakr@kernel.org \
--cc=dmitry.osipenko@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=kernel@collabora.com \
--cc=konradybcio@kernel.org \
--cc=liviu.dudau@arm.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthew.brost@intel.com \
--cc=mripard@kernel.org \
--cc=robin.clark@oss.qualcomm.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
--cc=steven.price@arm.com \
--cc=thomas.hellstrom@linux.intel.com \
--cc=tzimmermann@suse.de \
/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.