Please remove Bob Lee from this email group. He is deceased
On Thu, Jun 22, 2023, 1:56 AM Qi Zheng <zhengqi.a...@bytedance.com> wrote: > In preparation for implementing lockless slab shrink, > we need to dynamically allocate the drm-panfrost shrinker, > so that it can be freed asynchronously using kfree_rcu(). > Then it doesn't need to wait for RCU read-side critical > section when releasing the struct panfrost_device. > > Signed-off-by: Qi Zheng <zhengqi.a...@bytedance.com> > --- > drivers/gpu/drm/panfrost/panfrost_device.h | 2 +- > .../gpu/drm/panfrost/panfrost_gem_shrinker.c | 24 ++++++++++--------- > 2 files changed, 14 insertions(+), 12 deletions(-) > > diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h > b/drivers/gpu/drm/panfrost/panfrost_device.h > index b0126b9fbadc..e667e5689353 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_device.h > +++ b/drivers/gpu/drm/panfrost/panfrost_device.h > @@ -118,7 +118,7 @@ struct panfrost_device { > > struct mutex shrinker_lock; > struct list_head shrinker_list; > - struct shrinker shrinker; > + struct shrinker *shrinker; > > struct panfrost_devfreq pfdevfreq; > }; > diff --git a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > index bf0170782f25..2a5513eb9e1f 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > +++ b/drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c > @@ -18,8 +18,7 @@ > static unsigned long > panfrost_gem_shrinker_count(struct shrinker *shrinker, struct > shrink_control *sc) > { > - struct panfrost_device *pfdev = > - container_of(shrinker, struct panfrost_device, shrinker); > + struct panfrost_device *pfdev = shrinker->private_data; > struct drm_gem_shmem_object *shmem; > unsigned long count = 0; > > @@ -65,8 +64,7 @@ static bool panfrost_gem_purge(struct drm_gem_object > *obj) > static unsigned long > panfrost_gem_shrinker_scan(struct shrinker *shrinker, struct > shrink_control *sc) > { > - struct panfrost_device *pfdev = > - container_of(shrinker, struct panfrost_device, shrinker); > + struct panfrost_device *pfdev = shrinker->private_data; > struct drm_gem_shmem_object *shmem, *tmp; > unsigned long freed = 0; > > @@ -100,10 +98,15 @@ panfrost_gem_shrinker_scan(struct shrinker *shrinker, > struct shrink_control *sc) > void panfrost_gem_shrinker_init(struct drm_device *dev) > { > struct panfrost_device *pfdev = dev->dev_private; > - pfdev->shrinker.count_objects = panfrost_gem_shrinker_count; > - pfdev->shrinker.scan_objects = panfrost_gem_shrinker_scan; > - pfdev->shrinker.seeks = DEFAULT_SEEKS; > - WARN_ON(register_shrinker(&pfdev->shrinker, "drm-panfrost")); > + > + pfdev->shrinker = > shrinker_alloc_and_init(panfrost_gem_shrinker_count, > + > panfrost_gem_shrinker_scan, 0, > + DEFAULT_SEEKS, 0, pfdev); > + if (pfdev->shrinker && > + register_shrinker(pfdev->shrinker, "drm-panfrost")) { > + shrinker_free(pfdev->shrinker); > + WARN_ON(1); > + } > } > > /** > @@ -116,7 +119,6 @@ void panfrost_gem_shrinker_cleanup(struct drm_device > *dev) > { > struct panfrost_device *pfdev = dev->dev_private; > > - if (pfdev->shrinker.nr_deferred) { > - unregister_shrinker(&pfdev->shrinker); > - } > + if (pfdev->shrinker->nr_deferred) > + unregister_and_free_shrinker(pfdev->shrinker); > } > -- > 2.30.2 > >