From: Boris Brezillon <boris.brezillon@collabora.com>
To: Akash Goel <akash.goel@arm.com>
Cc: "Steven Price" <steven.price@arm.com>,
"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>,
"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, nd@arm.com
Subject: Re: [PATCH v1 9/9] drm/panthor: Add a GEM shrinker
Date: Wed, 21 Jan 2026 15:52:38 +0100 [thread overview]
Message-ID: <20260121155238.2a6c0274@fedora> (raw)
In-Reply-To: <714d2b72-67df-4590-9943-6289886c0a89@arm.com>
On Wed, 21 Jan 2026 11:49:34 +0000
Akash Goel <akash.goel@arm.com> wrote:
> Hi Boris,
>
> On 1/9/26 13:08, Boris Brezillon wrote:
> > From: Akash Goel <akash.goel@arm.com>
> >
> > This implementation is losely based on the MSM shrinker, and it's
> > relying on the drm_gpuvm eviction/validation infrastructure.
> >
> > Right now we only support swapout/eviction, but we could add an extra
> > flag to specify when buffer content doesn't need to be preserved to
> > avoid the swapout/swapin dance.
> >
> > Locking is a bit of a nightmare, but using _trylock() all the way in
> > the reclaim path seems to make lockdep happy. And yes, we might be
> > missing opportunities to reclaim when the system is under heavy GPU
> > load/heavy memory pressure/heavy GPU VM activity, but that's better
> > than no reclaim at all.
> >
> > Signed-off-by: Akash Goel <akash.goel@arm.com>
> > Co-developed-by: Boris Brezillon <boris.brezillon@collabora.com>
> > Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
> > ---
> > drivers/gpu/drm/panthor/panthor_device.c | 11 +-
> > drivers/gpu/drm/panthor/panthor_device.h | 73 ++++
> > drivers/gpu/drm/panthor/panthor_gem.c | 427 ++++++++++++++++++++++-
> > drivers/gpu/drm/panthor/panthor_gem.h | 67 ++++
> > drivers/gpu/drm/panthor/panthor_mmu.c | 338 +++++++++++++++++-
> > drivers/gpu/drm/panthor/panthor_mmu.h | 8 +
> > 6 files changed, 901 insertions(+), 23 deletions(-)
> >
>
> > diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h
> > index f35e52b9546a..bc348aa9634e 100644
> > --- a/drivers/gpu/drm/panthor/panthor_device.h
> > +++ b/drivers/gpu/drm/panthor/panthor_device.h
> > @@ -14,6 +14,7 @@
> > #include <linux/spinlock.h>
> >
> > #include <drm/drm_device.h>
> > +#include <drm/drm_gem.h>
> > #include <drm/drm_mm.h>
> > #include <drm/gpu_scheduler.h>
> > #include <drm/panthor_drm.h>
> > @@ -157,6 +158,78 @@ struct panthor_device {
> > /** @devfreq: Device frequency scaling management data. */
> > struct panthor_devfreq *devfreq;
> >
> >
> > +static bool is_gpu_mapped(struct panthor_gem_object *bo,
> > + enum panthor_gem_reclaim_state *state)
> > +{
> > + struct drm_gpuvm *vm = NULL;
> > + struct drm_gpuvm_bo *vm_bo;
> > +
> > + drm_gem_for_each_gpuvm_bo(vm_bo, &bo->base) {
> > + if (!vm) {
> > + *state = PANTHOR_GEM_GPU_MAPPED_PRIVATE;
> > + vm = vm_bo->vm;
> > + } else if (vm != vm_bo->vm) {
> > + *state = PANTHOR_GEM_GPU_MAPPED_SHARED;
> > + break;
> > + }
> > + }
> > +
> > + return !!vm;
> > +}
> > +
> > +static enum panthor_gem_reclaim_state
> > +panthor_gem_evaluate_reclaim_state_locked(struct panthor_gem_object *bo)
> > +{
> > + enum panthor_gem_reclaim_state gpu_mapped_state;
> > +
> > + dma_resv_assert_held(bo->base.resv);
> > + lockdep_assert_held(&bo->base.gpuva.lock);
> > +
> > + /* If pages have not been allocated, there's nothing to reclaim. */
> > + if (!bo->backing.pages)
> > + return PANTHOR_GEM_UNRECLAIMABLE;
> > +
> > + /* If memory is pinned, we prevent reclaim. */
> > + if (refcount_read(&bo->backing.pin_count))
> > + return PANTHOR_GEM_UNRECLAIMABLE;
> > +
> > + if (is_gpu_mapped(bo, &gpu_mapped_state))
> > + return gpu_mapped_state;
> > +
> > + if (refcount_read(&bo->cmap.mmap_count) && bo->backing.pages)
> > + return PANTHOR_GEM_MMAPPED;
> > +
> > + return PANTHOR_GEM_UNUSED;
> > +}
> > +
> > +void panthor_gem_update_reclaim_state_locked(struct panthor_gem_object *bo,
> > + enum panthor_gem_reclaim_state *old_statep)
> > +{
> > + struct panthor_device *ptdev = container_of(bo->base.dev, struct panthor_device, base);
> > + enum panthor_gem_reclaim_state old_state = bo->reclaim_state;
> > + enum panthor_gem_reclaim_state new_state;
> > + bool was_gpu_mapped, is_gpu_mapped;
> > +
> > + if (old_statep)
> > + *old_statep = old_state;
> > +
> > + new_state = panthor_gem_evaluate_reclaim_state_locked(bo);
> > + if (new_state == old_state)
> > + return;
> > +
> > + was_gpu_mapped = old_state == PANTHOR_GEM_GPU_MAPPED_SHARED ||
> > + old_state == PANTHOR_GEM_GPU_MAPPED_PRIVATE;
> > + is_gpu_mapped = new_state == PANTHOR_GEM_GPU_MAPPED_SHARED ||
> > + new_state == PANTHOR_GEM_GPU_MAPPED_PRIVATE;
> > +
> > + if (is_gpu_mapped && !was_gpu_mapped)
> > + ptdev->reclaim.gpu_mapped_count += bo->base.size >> PAGE_SHIFT;
> > + else if (!is_gpu_mapped && was_gpu_mapped)
> > + ptdev->reclaim.gpu_mapped_count -= bo->base.size >> PAGE_SHIFT;
> > +
> > + switch (new_state) {
> > + case PANTHOR_GEM_UNUSED:
> > + drm_gem_lru_move_tail(&ptdev->reclaim.unused, &bo->base);
> > + break;
> > + case PANTHOR_GEM_MMAPPED:
> > + drm_gem_lru_move_tail(&ptdev->reclaim.mmapped, &bo->base);
> > + break;
> > + case PANTHOR_GEM_GPU_MAPPED_PRIVATE:
> > + panthor_vm_update_bo_reclaim_lru_locked(bo);
> > + break;
> > + case PANTHOR_GEM_GPU_MAPPED_SHARED:
> > + drm_gem_lru_move_tail(&ptdev->reclaim.gpu_mapped_shared, &bo->base);
> > + break;
> > + case PANTHOR_GEM_UNRECLAIMABLE:
> > + drm_gem_lru_remove(&bo->base);
> > + break;
> > + default:
> > + break;
> > + }
> > +
> > + bo->reclaim_state = new_state;
> > +}
> > +
> > static void
> > panthor_gem_backing_cleanup(struct panthor_gem_object *bo)
> > {
> > @@ -153,8 +249,12 @@ static int panthor_gem_backing_pin_locked(struct panthor_gem_object *bo)
> > return 0;
> >
> > ret = panthor_gem_backing_get_pages_locked(bo);
> > - if (!ret)
> > + if (!ret) {
> > refcount_set(&bo->backing.pin_count, 1);
> > + mutex_lock(&bo->base.gpuva.lock);
> > + panthor_gem_update_reclaim_state_locked(bo, NULL);
> > + mutex_unlock(&bo->base.gpuva.lock);
> > + }
> >
> > return ret;
> > }
> > @@ -167,8 +267,12 @@ static void panthor_gem_backing_unpin_locked(struct panthor_gem_object *bo)
> > /* We don't release anything when pin_count drops to zero.
> > * Pages stay there until an explicit cleanup is requested.
> > */
> > - if (!refcount_dec_not_one(&bo->backing.pin_count))
> > + if (!refcount_dec_not_one(&bo->backing.pin_count)) {
> > refcount_set(&bo->backing.pin_count, 0);
> > + mutex_lock(&bo->base.gpuva.lock);
> > + panthor_gem_update_reclaim_state_locked(bo, NULL);
> > + mutex_unlock(&bo->base.gpuva.lock);
> > + }
> > }
> >
> > static void
> > @@ -531,6 +635,49 @@ void panthor_gem_unpin(struct panthor_gem_object *bo)
> > dma_resv_unlock(bo->base.resv);
> > }
> >
> > +
> > +static void panthor_gem_evict_locked(struct panthor_gem_object *bo)
> > +{
> > + dma_resv_assert_held(bo->base.resv);
> > + lockdep_assert_held(&bo->base.gpuva.lock);
> > +
> > + if (drm_WARN_ON_ONCE(bo->base.dev, drm_gem_is_imported(&bo->base)))
> > + return;
> > +
> > + if (drm_WARN_ON_ONCE(bo->base.dev, refcount_read(&bo->backing.pin_count)))
> > + return;
> > +
> > + if (drm_WARN_ON_ONCE(bo->base.dev, !bo->backing.pages))
> > + return;
> > +
> > + panthor_gem_dev_map_cleanup(bo);
> > + panthor_gem_backing_cleanup(bo);
> > + panthor_gem_update_reclaim_state_locked(bo, NULL);
> > +}
> > +
>
> > +
> > +static bool should_wait(enum panthor_gem_reclaim_state reclaim_state)
> > +{
> > + return reclaim_state == PANTHOR_GEM_GPU_MAPPED_PRIVATE ||
> > + reclaim_state == PANTHOR_GEM_GPU_MAPPED_SHARED;
> > +}
> > +
> > +bool panthor_gem_try_evict(struct drm_gem_object *obj,
> > + struct ww_acquire_ctx *ticket)
> > +{
> > + /*
> > + * Track last locked entry for unwinding locks in error and
> > + * success paths
> > + */
> > + struct panthor_gem_object *bo = to_panthor_bo(obj);
> > + struct drm_gpuvm_bo *vm_bo, *last_locked = NULL;
> > + enum panthor_gem_reclaim_state old_state;
> > + int ret = 0;
> > +
> > + /* To avoid potential lock ordering issue between bo_gpuva and
> > + * mapping->i_mmap_rwsem, unmap the pages from CPU side before
> > + * acquring the bo_gpuva lock. As the bo_resv lock is held, CPU
> > + * page fault handler won't be able to map in the pages whilst
> > + * eviction is in progress.
> > + */
> > + drm_vma_node_unmap(&bo->base.vma_node, bo->base.dev->anon_inode->i_mapping);
> > +
> > + /* We take this lock when walking the list to prevent
> > + * insertion/deletion.
> > + */
> > + /* We can only trylock in that path, because
> > + * - allocation might happen while some of these locks are held
> > + * - lock ordering is different in other paths
> > + * vm_resv -> bo_resv -> bo_gpuva
> > + * vs
> > + * bo_resv -> bo_gpuva -> vm_resv
> > + *
> > + * If we fail to lock that's fine, we back off and will get
> > + * back to it later.
> > + */
> > + if (!mutex_trylock(&bo->base.gpuva.lock))
> > + return false;
> > +
> > + drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
> > + struct dma_resv *resv = drm_gpuvm_resv(vm_bo->vm);
> > +
> > + if (resv == obj->resv)
> > + continue;
> > +
> > + if (!dma_resv_trylock(resv)) {
> > + ret = -EDEADLK;
> > + goto out_unlock;
> > + }
> > +
> > + last_locked = vm_bo;
> > + }
> > +
> > + /* Update the state before trying to evict the buffer, if the state was
> > + * updated to something that's harder to reclaim (higher value in the
> > + * enum), skip it (will be processed when the relevant LRU is).
> > + */
> > + panthor_gem_update_reclaim_state_locked(bo, &old_state);
> > + if (old_state < bo->reclaim_state) {
> > + ret = -EAGAIN;
> > + goto out_unlock;
> > + }
> > +
> > + /* Wait was too long, skip. */
> > + if (should_wait(bo->reclaim_state) &&
> > + dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP, false, 10) <= 0) {
> > + ret = -ETIMEDOUT;
> > + goto out_unlock;
> > + }
> > +
> > + /* Couldn't teardown the GPU mappings? Skip. */
> > + ret = panthor_vm_evict_bo_mappings_locked(bo);
> > + if (ret)
> > + goto out_unlock;
> > +
> > + /* If everything went fine, evict the object. */
> > + panthor_gem_evict_locked(bo);
> > +
> > +out_unlock:
> > + if (last_locked) {
> > + drm_gem_for_each_gpuvm_bo(vm_bo, obj) {
> > + struct dma_resv *resv = drm_gpuvm_resv(vm_bo->vm);
> > +
> > + if (resv == obj->resv)
> > + continue;
> > +
> > + dma_resv_unlock(resv);
> > +
> > + if (last_locked == vm_bo)
> > + break;
> > + }
> > + }
> > + mutex_unlock(&bo->base.gpuva.lock);
> > +
> > + return ret == 0;
> > +}
>
>
> > diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
> > index 3290e0b5facb..ffd821b3be46 100644
> > --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> > +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> > @@ -1,6 +1,7 @@
> > // SPDX-License-Identifier: GPL-2.0 or MIT
> > /* Copyright 2019 Linaro, Ltd, Rob Herring <robh@kernel.org> */
> > /* Copyright 2023 Collabora ltd. */
> > +/* Copyright 2025 ARM Limited. All rights reserved. */
> >
> > #include <drm/drm_debugfs.h>
> > #include <drm/drm_drv.h>
> > @@ -131,6 +132,9 @@ struct panthor_vma {
> > * Only map related flags are accepted.
> > */
> > u32 flags;
> > +
> > + /** @evicted: True if the VMA has been evicted. */
> > + bool evicted;
> > };
> >
> > /**
> >
> > +void panthor_vm_update_bo_reclaim_lru_locked(struct panthor_gem_object *bo)
> > +{
> > + struct panthor_device *ptdev = container_of(bo->base.dev, struct panthor_device, base);
> > + struct panthor_vm *vm = NULL;
> > + struct drm_gpuvm_bo *vm_bo;
> > +
> > + dma_resv_assert_held(bo->base.resv);
> > + lockdep_assert_held(&bo->base.gpuva.lock);
> > +
> > + drm_gem_for_each_gpuvm_bo(vm_bo, &bo->base) {
> > + /* We're only supposed to have one vm_bo in the list if we get there. */
> > + drm_WARN_ON(&ptdev->base, vm);
> > + vm = container_of(vm_bo->vm, struct panthor_vm, base);
> > +
> > + mutex_lock(&ptdev->reclaim.lock);
> > + drm_gem_lru_move_tail_locked(&vm->reclaim.lru, &bo->base);
> > + if (list_empty(&vm->reclaim.lru_node))
> > + list_move(&vm->reclaim.lru_node, &ptdev->reclaim.vms);
> > + mutex_unlock(&ptdev->reclaim.lock);
> > + }
> > +}
> > +
> > +int panthor_vm_evict_bo_mappings_locked(struct panthor_gem_object *bo)
> > +{
> > + struct drm_gpuvm_bo *vm_bo;
> > +
> > + drm_gem_for_each_gpuvm_bo(vm_bo, &bo->base) {
> > + struct panthor_vm *vm = container_of(vm_bo->vm, struct panthor_vm, base);
> > + struct drm_gpuva *va;
> > +
> > + if (!mutex_trylock(&vm->op_lock))
> > + return -EDEADLK;
> > +
> > + drm_gpuvm_bo_evict(vm_bo, true);
> > + drm_gpuvm_bo_for_each_va(va, vm_bo) {
> > + struct panthor_vma *vma = container_of(va, struct panthor_vma, base);
> > +
> > + panthor_vm_lock_region(vm, va->va.addr, va->va.range);
> > + panthor_vm_unmap_pages(vm, va->va.addr, va->va.range);
>
> On further testing, I ran into a kernel warning issue.
>
> https://elixir.bootlin.com/linux/v6.18-rc5/source/drivers/iommu/io-pgtable-arm.c#L641
>
> https://elixir.bootlin.com/linux/v6.18-rc5/source/drivers/gpu/drm/panthor/panthor_mmu.c#L930
>
> Call trace:
> __arm_lpae_unmap+0x570/0x5c8 (P)
> __arm_lpae_unmap+0x144/0x5c8
> __arm_lpae_unmap+0x144/0x5c8
> arm_lpae_unmap_pages+0xe8/0x120
> panthor_vm_unmap_pages+0x1f0/0x3f8 [panthor]
> panthor_vm_evict_bo_mappings_locked+0xf4/0x1d8 [panthor]
> panthor_gem_try_evict+0x190/0x7c8 [panthor]
> drm_gem_lru_scan+0x388/0x698
>
> Following sequence leads to the kernel warnings.
>
> - BO is mapped to GPU and is in GPU_MAPPED_PRIVATE state.
>
> - Shrinker callback gets invoked and that BO is evicted. As a result BO
> is moved to UNRECLAIMABLE state.
>
> - Userspace accesses the evicted BO and panthor_gem_fault() gets the
> backing pages again. BO is moved back to GPU_MAPPED_PRIVATE state (even
> though technically the BO is still in evicted state, both vm_bo->evicted
> and vma->evicted are TRUE.
>
> - Shrinker callback is invoked again and tries to evict the same BO.
>
> - panthor_vm_evict_bo_mappings_locked() calls panthor_vm_unmap_pages()
> and the kernel warnings are emiited as PTEs are already invalid.
Yep, it looks like the other side of the problem pointed out by Steve:
CPU mappings can make the buffer reclaimable again, but those are still
evicted from the VM PoV.
>
>
> Made the following change locally to avoid the warning.
>
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c
> b/drivers/gpu/drm/panthor/panthor_mmu.c
> index ffd821b3be46..e0a1dda1675f 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -2344,6 +2344,8 @@ int panthor_vm_evict_bo_mappings_locked(struct
> panthor_gem_object *bo)
> drm_gpuvm_bo_for_each_va(va, vm_bo) {
> struct panthor_vma *vma = container_of(va,
> struct panthor_vma, base);
>
> + if (vma->evicted)
> + continue;
> panthor_vm_lock_region(vm, va->va.addr,
> va->va.range);
> panthor_vm_unmap_pages(vm, va->va.addr,
> va->va.range);
> panthor_vm_unlock_region(vm);
>
>
>
> Do you think we can also update is_gpu_mapped() so that an evicted BO
> moves to MMAPPED state, instead of GPU_MAPPED_PRIVATE state, on CPU
> access ?.
>
> Not sure if the following change makes sense.
>
> diff --git a/drivers/gpu/drm/panthor/panthor_gem.c
> b/drivers/gpu/drm/panthor/panthor_gem.c
> index 6e91c5022d0d..8a8411fed195 100644
> --- a/drivers/gpu/drm/panthor/panthor_gem.c
> +++ b/drivers/gpu/drm/panthor/panthor_gem.c
> @@ -125,6 +125,8 @@ static bool is_gpu_mapped(struct panthor_gem_object *bo,
> struct drm_gpuvm_bo *vm_bo;
>
> drm_gem_for_each_gpuvm_bo(vm_bo, &bo->base) {
> + if (vm_bo->evicted)
> + continue;
> if (!vm) {
> *state = PANTHOR_GEM_GPU_MAPPED_PRIVATE;
> vm = vm_bo->vm;
>
>
> Please let me know.
Yep, this looks correct. I'll add that to my list of fixups.
Thanks,
Boris
next prev parent reply other threads:[~2026-01-21 14:52 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
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 [this message]
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=20260121155238.2a6c0274@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=nd@arm.com \
--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.