From: "Adrián Larumbe" <adrian.larumbe@collabora.com>
To: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Rob Herring <robh@kernel.org>,
Steven Price <steven.price@arm.com>,
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>,
Faith Ekstrand <faith.ekstrand@collabora.com>,
"Marty E. Plummer" <hanetzer@startmail.com>,
Tomeu Vizoso <tomeu@tomeuvizoso.net>,
Eric Anholt <eric@anholt.net>,
Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>,
Robin Murphy <robin.murphy@arm.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Collabora Kernel Team <kernel@collabora.com>,
Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH v5 04/11] drm/panfrost: Move shrinker initialization and unplug one level down
Date: Thu, 13 Aug 2026 13:13:39 +0100 [thread overview]
Message-ID: <an2zl5n-OD0ucwwk@sobremesa> (raw)
In-Reply-To: <20260812100755.123e7ee0@fedora-21.home>
On 12.08.2026 10:07, Boris Brezillon wrote:
> On Tue, 11 Aug 2026 22:42:13 +0100
> Adrián Larumbe <adrian.larumbe@collabora.com> wrote:
>
> > Since the moment we call drm_dev_register() the device should be in a
> > position to accept jobs, so it's best if the shrinker is already
> > initialized by then.
> >
> > On top of that, make shrinker functions take an panfrost_device pointer
> > like other functions in the same sequence and rename them accordingly.
> >
> > Essentially mimic the init/fini behaviour in Panthor.
> >
> > On top of that, remove the config feature check, because it's unnecessary.
> >
> > Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
> > ---
> > drivers/gpu/drm/panfrost/panfrost_device.c | 8 +++++++-
> > drivers/gpu/drm/panfrost/panfrost_drv.c | 6 ------
> > drivers/gpu/drm/panfrost/panfrost_gem.c | 25 ++++++++++++++----------
> > drivers/gpu/drm/panfrost/panfrost_gem.h | 7 ++++---
> > drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c | 8 ++------
> > 5 files changed, 28 insertions(+), 26 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c
> > index d8421fd6a662..74992deb0b3a 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_device.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_device.c
> > @@ -281,9 +281,14 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> > if (err)
> > goto out_job;
> >
> > - panfrost_gem_init(pfdev);
> > + err = panfrost_gem_init(pfdev);
> > + if (err)
> > + goto out_perfcnt;
> >
> > return 0;
> > +
> > +out_perfcnt:
> > + panfrost_perfcnt_fini(pfdev);
> > out_job:
> > panfrost_jm_fini(pfdev);
> > out_mmu:
> > @@ -305,6 +310,7 @@ int panfrost_device_init(struct panfrost_device *pfdev)
> >
> > void panfrost_device_fini(struct panfrost_device *pfdev)
> > {
> > + panfrost_gem_fini(pfdev);
> > panfrost_perfcnt_fini(pfdev);
> > panfrost_jm_fini(pfdev);
> > panfrost_mmu_fini(pfdev);
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> > index 2e931fa90da0..331a3bd5b98c 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> > @@ -1002,14 +1002,9 @@ static int panfrost_probe(struct platform_device *pdev)
> > if (err < 0)
> > goto err_out1;
> >
> > - err = panfrost_gem_shrinker_init(&pfdev->base);
> > - if (err)
> > - goto err_out2;
> >
> > return 0;
> >
> > -err_out2:
> > - drm_dev_unregister(&pfdev->base);
> > err_out1:
> > pm_runtime_disable(pfdev->base.dev);
> > panfrost_device_fini(pfdev);
> > @@ -1023,7 +1018,6 @@ static void panfrost_remove(struct platform_device *pdev)
> > struct panfrost_device *pfdev = platform_get_drvdata(pdev);
> >
> > drm_dev_unregister(&pfdev->base);
> > - panfrost_gem_shrinker_cleanup(&pfdev->base);
> >
> > pm_runtime_get_sync(pfdev->base.dev);
> > pm_runtime_disable(pfdev->base.dev);
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c
> > index 3a7fce428898..7b993a089af2 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_gem.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c
> > @@ -15,20 +15,25 @@
> > #include "panfrost_gem.h"
> > #include "panfrost_mmu.h"
> >
> > -void panfrost_gem_init(struct panfrost_device *pfdev)
> > +int panfrost_gem_init(struct panfrost_device *pfdev)
> > {
> > int err;
> >
> > - if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
> > - !panfrost_transparent_hugepage)
> > - return;
> > + if (panfrost_transparent_hugepage) {
>
> Hm, are you sure it compiles fine when CONFIG_TRANSPARENT_HUGEPAGE=n?
> Feels like the linker would complain about a missing symbol in that
> case.
Yep, I don't have it enabled in the build config, and yet it compiles troublefree.
Steven had suggested getting rid of the feature check altogether, and I thought it
might trigger a compiler error, but it seems the linker might be resolving undefined
external variable symbols to 0.
> If you really want to simplify it this way, you probably need
>
> #if IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE)
> extern bool panfrost_transparent_hugepage;
> #else
> #define panfrost_transparent_hugepage false
> #endif
This makes it more clear so I'll go for it in the next iteration.
> in panfrost_drv.h.
>
> > + err = drm_gem_huge_mnt_create(&pfdev->base, "within_size");
> > + if (drm_gem_get_huge_mnt(&pfdev->base))
> > + drm_info(&pfdev->base, "Using Transparent Hugepage\n");
> > + else if (err)
> > + drm_warn(&pfdev->base,
> > + "Can't use Transparent Hugepage (%d)\n", err);
> > + }
> >
> > - err = drm_gem_huge_mnt_create(&pfdev->base, "within_size");
> > - if (drm_gem_get_huge_mnt(&pfdev->base))
> > - drm_info(&pfdev->base, "Using Transparent Hugepage\n");
> > - else if (err)
> > - drm_warn(&pfdev->base, "Can't use Transparent Hugepage (%d)\n",
> > - err);
> > + return panfrost_gem_shrinker_init(pfdev);
> > +}
> > +
> > +void panfrost_gem_fini(struct panfrost_device *pfdev)
> > +{
> > + panfrost_gem_shrinker_fini(pfdev);
> > }
> >
> > #ifdef CONFIG_DEBUG_FS
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h
> > index 79d4377019e9..5c823cdbd980 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_gem.h
> > +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h
> > @@ -129,7 +129,8 @@ drm_mm_node_to_panfrost_mapping(struct drm_mm_node *node)
> > return container_of(node, struct panfrost_gem_mapping, mmnode);
> > }
> >
> > -void panfrost_gem_init(struct panfrost_device *pfdev);
> > +int panfrost_gem_init(struct panfrost_device *pfdev);
> > +void panfrost_gem_fini(struct panfrost_device *pfdev);
> >
> > struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size);
> >
> > @@ -154,8 +155,8 @@ panfrost_gem_mapping_get(struct panfrost_gem_object *bo,
> > void panfrost_gem_mapping_put(struct panfrost_gem_mapping *mapping);
> > void panfrost_gem_teardown_mappings_locked(struct panfrost_gem_object *bo);
> >
> > -int panfrost_gem_shrinker_init(struct drm_device *dev);
> > -void panfrost_gem_shrinker_cleanup(struct drm_device *dev);
> > +int panfrost_gem_shrinker_init(struct panfrost_device *pfdev);
> > +void panfrost_gem_shrinker_fini(struct panfrost_device *pfdev);
> >
> > void panfrost_gem_set_label(struct drm_gem_object *obj, const char *label);
> > int panfrost_gem_sync(struct drm_gem_object *obj, u32 type,
> > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
> > index 2fe967a90bcb..fefae87535d6 100644
> > --- a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
> > +++ b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
> > @@ -95,10 +95,8 @@ panfrost_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
> > *
> > * This function registers and sets up the panfrost shrinker.
> > */
> > -int panfrost_gem_shrinker_init(struct drm_device *dev)
> > +int panfrost_gem_shrinker_init(struct panfrost_device *pfdev)
> > {
> > - struct panfrost_device *pfdev = to_panfrost_device(dev);
> > -
> > pfdev->shrinker = shrinker_alloc(0, "drm-panfrost");
> > if (!pfdev->shrinker)
> > return -ENOMEM;
> > @@ -118,10 +116,8 @@ int panfrost_gem_shrinker_init(struct drm_device *dev)
> > *
> > * This function unregisters the panfrost shrinker.
> > */
> > -void panfrost_gem_shrinker_cleanup(struct drm_device *dev)
> > +void panfrost_gem_shrinker_fini(struct panfrost_device *pfdev)
> > {
> > - struct panfrost_device *pfdev = to_panfrost_device(dev);
> > -
> > if (pfdev->shrinker)
> > shrinker_free(pfdev->shrinker);
> > }
> >
next prev parent reply other threads:[~2026-08-13 12:13 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 21:42 [PATCH v5 00/11] RPM, perfcnt and other minor fixes for Panfrost Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 01/11] drm/panfrost: Check another bo field for cache option query Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 02/11] drm/panfrost: Prevent division by 0 Adrián Larumbe
2026-08-11 21:57 ` sashiko-bot
2026-08-12 7:59 ` Boris Brezillon
2026-08-11 21:42 ` [PATCH v5 03/11] drm/panfrost: Remove unnecessary header file include Adrián Larumbe
2026-08-12 8:00 ` Boris Brezillon
2026-08-11 21:42 ` [PATCH v5 04/11] drm/panfrost: Move shrinker initialization and unplug one level down Adrián Larumbe
2026-08-11 21:55 ` sashiko-bot
2026-08-12 8:07 ` Boris Brezillon
2026-08-13 12:13 ` Adrián Larumbe [this message]
2026-08-11 21:42 ` [PATCH v5 05/11] drm/panfrost: Move all device power up and down into RPM callbacks Adrián Larumbe
2026-08-11 21:54 ` sashiko-bot
2026-08-12 9:07 ` Boris Brezillon
2026-08-13 13:22 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 06/11] drm/panfrost: Explicitly enable MMU interrupts at device init Adrián Larumbe
2026-08-11 21:54 ` sashiko-bot
2026-08-12 9:14 ` Boris Brezillon
2026-08-13 12:41 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 07/11] drm/panfrost: Add debugfs knob for manually triggering a GPU reset Adrián Larumbe
2026-08-11 21:54 ` sashiko-bot
2026-08-12 9:17 ` Boris Brezillon
2026-08-13 12:20 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 08/11] drm/panfrost: Move perfcnt GPU disable sequence into a helper Adrián Larumbe
2026-08-12 9:48 ` Boris Brezillon
2026-08-13 12:28 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 09/11] drm/panfrost: Introduce a reset lock Adrián Larumbe
2026-08-11 21:55 ` sashiko-bot
2026-08-12 9:44 ` Boris Brezillon
2026-08-12 9:45 ` Boris Brezillon
2026-08-13 12:50 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 10/11] drm/panfrost: Fix races between perfcnt and reset sequence Adrián Larumbe
2026-08-11 21:58 ` sashiko-bot
2026-08-12 10:06 ` Boris Brezillon
2026-08-13 12:50 ` Adrián Larumbe
2026-08-11 21:42 ` [PATCH v5 11/11] drm/panfrost: Bump driver minor to reflect new DUMP IOCTL req field Adrián Larumbe
2026-08-11 21:55 ` sashiko-bot
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=an2zl5n-OD0ucwwk@sobremesa \
--to=adrian.larumbe@collabora.com \
--cc=airlied@gmail.com \
--cc=alyssa.rosenzweig@collabora.com \
--cc=boris.brezillon@collabora.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=eric@anholt.net \
--cc=faith.ekstrand@collabora.com \
--cc=hanetzer@startmail.com \
--cc=kernel@collabora.com \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=robin.murphy@arm.com \
--cc=simona@ffwll.ch \
--cc=steven.price@arm.com \
--cc=tomeu@tomeuvizoso.net \
--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.