Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
ce0dba2
drm/ttm: introduce pool_shrink_rwsem
Sep 11, 2023
08cfa87
mm: shrinker: add infrastructure for dynamically allocating shrinker
Sep 11, 2023
62dda9a
kvm: mmu: dynamically allocate the x86-mmu shrinker
Sep 11, 2023
31a27a3
binder: dynamically allocate the android-binder shrinker
Sep 11, 2023
0bdd948
drm/ttm: dynamically allocate the drm-ttm_pool shrinker
Sep 11, 2023
2809d15
xenbus/backend: dynamically allocate the xen-backend shrinker
Sep 11, 2023
6650b21
erofs: dynamically allocate the erofs-shrinker
Sep 11, 2023
da699ba
f2fs: dynamically allocate the f2fs-shrinker
Sep 11, 2023
aff0368
gfs2: dynamically allocate the gfs2-glock shrinker
Sep 11, 2023
3d041ba
gfs2: dynamically allocate the gfs2-qd shrinker
Sep 11, 2023
86b5d4f
NFSv4.2: dynamically allocate the nfs-xattr shrinkers
Sep 11, 2023
4587761
nfs: dynamically allocate the nfs-acl shrinker
Sep 11, 2023
797c4b9
nfsd: dynamically allocate the nfsd-filecache shrinker
Sep 11, 2023
83beda5
quota: dynamically allocate the dquota-cache shrinker
Sep 11, 2023
bc99339
ubifs: dynamically allocate the ubifs-slab shrinker
Sep 11, 2023
823c2f5
rcu: dynamically allocate the rcu-lazy shrinker
Sep 11, 2023
5fbfa75
rcu: dynamically allocate the rcu-kfree shrinker
Sep 11, 2023
edd8fa9
mm: thp: dynamically allocate the thp-related shrinkers
Sep 11, 2023
09449ef
sunrpc: dynamically allocate the sunrpc_cred shrinker
Sep 11, 2023
c9e70d0
mm: workingset: dynamically allocate the mm-shadow shrinker
Sep 11, 2023
2e344e6
drm/i915: dynamically allocate the i915_gem_mm shrinker
Sep 11, 2023
7af1010
drm/msm: dynamically allocate the drm-msm_gem shrinker
Sep 11, 2023
f18fcc6
drm/panfrost: dynamically allocate the drm-panfrost shrinker
Sep 11, 2023
a987147
dm: dynamically allocate the dm-bufio shrinker
Sep 11, 2023
f204a3c
dm zoned: dynamically allocate the dm-zoned-meta shrinker
Sep 11, 2023
d6a6158
md/raid5: dynamically allocate the md-raid5 shrinker
Sep 11, 2023
f425de1
bcache: dynamically allocate the md-bcache shrinker
Sep 11, 2023
1d461c8
vmw_balloon: dynamically allocate the vmw-balloon shrinker
Sep 11, 2023
ecc73c3
virtio_balloon: dynamically allocate the virtio-balloon shrinker
Sep 11, 2023
40b8816
mbcache: dynamically allocate the mbcache shrinker
Sep 11, 2023
bcf2c5c
ext4: dynamically allocate the ext4-es shrinker
Sep 11, 2023
552857b
jbd2,ext4: dynamically allocate the jbd2-journal shrinker
Sep 11, 2023
50a2e3b
nfsd: dynamically allocate the nfsd-client shrinker
Sep 11, 2023
7c7ecf1
nfsd: dynamically allocate the nfsd-reply shrinker
Sep 11, 2023
2c96ace
xfs: dynamically allocate the xfs-buf shrinker
Sep 11, 2023
46e378c
xfs: dynamically allocate the xfs-inodegc shrinker
Sep 11, 2023
3ba2ae6
xfs: dynamically allocate the xfs-qm shrinker
Sep 11, 2023
4cbb603
zsmalloc: dynamically allocate the mm-zspool shrinker
Sep 11, 2023
4a5f43e
fs: super: dynamically allocate the s_shrink
Sep 11, 2023
8e53cd6
mm: shrinker: remove old APIs
Sep 11, 2023
1f5a283
mm: shrinker: add a secondary array for shrinker_info::{map, nr_defer…
Sep 11, 2023
5a90fbf
mm: shrinker: rename {prealloc|unregister}_memcg_shrinker() to shrink…
Sep 11, 2023
197f067
mm: shrinker: make global slab shrink lockless
Sep 11, 2023
1b4c87e
mm: shrinker: make memcg slab shrink lockless
Sep 11, 2023
8208597
mm: shrinker: hold write lock to reparent shrinker nr_deferred
Sep 11, 2023
412781f
mm: shrinker: convert shrinker_rwsem to mutex
Sep 11, 2023
058957f
mm: add printf attribute to shrinker_debugfs_name_alloc
el-puerro Oct 6, 2023
280b771
mm: shrinker: use kvzalloc_node() from expand_one_shrinker_info()
Jan 3, 2024
97afe56
mm: shrinker: avoid memleak in alloc_shrinker_info
Oct 25, 2024
0b98133
mm/shrinker: fix refcount leak in shrink_slab_memcg()
ahacigu-linux Feb 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions arch/x86/kvm/mmu/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -6791,11 +6791,7 @@ static unsigned long mmu_shrink_count(struct shrinker *shrink,
return percpu_counter_read_positive(&kvm_total_used_mmu_pages);
}

static struct shrinker mmu_shrinker = {
.count_objects = mmu_shrink_count,
.scan_objects = mmu_shrink_scan,
.seeks = DEFAULT_SEEKS * 10,
};
static struct shrinker *mmu_shrinker;

static void mmu_destroy_caches(void)
{
Expand Down Expand Up @@ -6928,10 +6924,16 @@ int kvm_mmu_vendor_module_init(void)
if (percpu_counter_init(&kvm_total_used_mmu_pages, 0, GFP_KERNEL))
goto out;

ret = register_shrinker(&mmu_shrinker, "x86-mmu");
if (ret)
mmu_shrinker = shrinker_alloc(0, "x86-mmu");
if (!mmu_shrinker)
goto out_shrinker;

mmu_shrinker->count_objects = mmu_shrink_count;
mmu_shrinker->scan_objects = mmu_shrink_scan;
mmu_shrinker->seeks = DEFAULT_SEEKS * 10;

shrinker_register(mmu_shrinker);

return 0;

out_shrinker:
Expand All @@ -6953,7 +6955,7 @@ void kvm_mmu_vendor_module_exit(void)
{
mmu_destroy_caches();
percpu_counter_destroy(&kvm_total_used_mmu_pages);
unregister_shrinker(&mmu_shrinker);
shrinker_free(mmu_shrinker);
}

/*
Expand Down
30 changes: 18 additions & 12 deletions drivers/android/binder_alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1055,11 +1055,7 @@ binder_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
NULL, sc->nr_to_scan);
}

static struct shrinker binder_shrinker = {
.count_objects = binder_shrink_count,
.scan_objects = binder_shrink_scan,
.seeks = DEFAULT_SEEKS,
};
static struct shrinker *binder_shrinker;

/**
* binder_alloc_init() - called by binder_open() for per-proc initialization
Expand All @@ -1079,19 +1075,29 @@ void binder_alloc_init(struct binder_alloc *alloc)

int binder_alloc_shrinker_init(void)
{
int ret = list_lru_init(&binder_alloc_lru);
int ret;

if (ret == 0) {
ret = register_shrinker(&binder_shrinker, "android-binder");
if (ret)
list_lru_destroy(&binder_alloc_lru);
ret = list_lru_init(&binder_alloc_lru);
if (ret)
return ret;

binder_shrinker = shrinker_alloc(0, "android-binder");
if (!binder_shrinker) {
list_lru_destroy(&binder_alloc_lru);
return -ENOMEM;
}
return ret;

binder_shrinker->count_objects = binder_shrink_count;
binder_shrinker->scan_objects = binder_shrink_scan;

shrinker_register(binder_shrinker);

return 0;
}

void binder_alloc_shrinker_exit(void)
{
unregister_shrinker(&binder_shrinker);
shrinker_free(binder_shrinker);
list_lru_destroy(&binder_alloc_lru);
}

Expand Down
29 changes: 16 additions & 13 deletions drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,7 @@ unsigned long i915_gem_shrink_all(struct drm_i915_private *i915)
static unsigned long
i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
{
struct drm_i915_private *i915 =
container_of(shrinker, struct drm_i915_private, mm.shrinker);
struct drm_i915_private *i915 = shrinker->private_data;
unsigned long num_objects;
unsigned long count;

Expand All @@ -306,8 +305,8 @@ i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
if (num_objects) {
unsigned long avg = 2 * count / num_objects;

i915->mm.shrinker.batch =
max((i915->mm.shrinker.batch + avg) >> 1,
i915->mm.shrinker->batch =
max((i915->mm.shrinker->batch + avg) >> 1,
128ul /* default SHRINK_BATCH */);
}

Expand All @@ -317,8 +316,7 @@ i915_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
static unsigned long
i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
{
struct drm_i915_private *i915 =
container_of(shrinker, struct drm_i915_private, mm.shrinker);
struct drm_i915_private *i915 = shrinker->private_data;
unsigned long freed;

sc->nr_scanned = 0;
Expand Down Expand Up @@ -430,12 +428,17 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr

void i915_gem_driver_register__shrinker(struct drm_i915_private *i915)
{
i915->mm.shrinker.scan_objects = i915_gem_shrinker_scan;
i915->mm.shrinker.count_objects = i915_gem_shrinker_count;
i915->mm.shrinker.seeks = DEFAULT_SEEKS;
i915->mm.shrinker.batch = 4096;
drm_WARN_ON(&i915->drm, register_shrinker(&i915->mm.shrinker,
"drm-i915_gem"));
i915->mm.shrinker = shrinker_alloc(0, "drm-i915_gem");
if (!i915->mm.shrinker) {
drm_WARN_ON(&i915->drm, 1);
} else {
i915->mm.shrinker->scan_objects = i915_gem_shrinker_scan;
i915->mm.shrinker->count_objects = i915_gem_shrinker_count;
i915->mm.shrinker->batch = 4096;
i915->mm.shrinker->private_data = i915;

shrinker_register(i915->mm.shrinker);
}

i915->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom;
drm_WARN_ON(&i915->drm, register_oom_notifier(&i915->mm.oom_notifier));
Expand All @@ -451,7 +454,7 @@ void i915_gem_driver_unregister__shrinker(struct drm_i915_private *i915)
unregister_vmap_purge_notifier(&i915->mm.vmap_notifier));
drm_WARN_ON(&i915->drm,
unregister_oom_notifier(&i915->mm.oom_notifier));
unregister_shrinker(&i915->mm.shrinker);
shrinker_free(i915->mm.shrinker);
}

void i915_gem_shrinker_taints_mutex(struct drm_i915_private *i915,
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ struct i915_gem_mm {

struct notifier_block oom_notifier;
struct notifier_block vmap_notifier;
struct shrinker shrinker;
struct shrinker *shrinker;

#ifdef CONFIG_MMU_NOTIFIER
/**
Expand Down
4 changes: 3 additions & 1 deletion drivers/gpu/drm/msm/msm_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,9 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
if (ret)
goto err_msm_uninit;

msm_gem_shrinker_init(ddev);
ret = msm_gem_shrinker_init(ddev);
if (ret)
goto err_msm_uninit;

if (priv->kms_init) {
ret = priv->kms_init(ddev);
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/msm/msm_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ struct msm_drm_private {
} vram;

struct notifier_block vmap_notifier;
struct shrinker shrinker;
struct shrinker *shrinker;

struct drm_atomic_state *pm_state;

Expand Down Expand Up @@ -271,7 +271,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
unsigned long msm_gem_shrinker_shrink(struct drm_device *dev, unsigned long nr_to_scan);
#endif

void msm_gem_shrinker_init(struct drm_device *dev);
int msm_gem_shrinker_init(struct drm_device *dev);
void msm_gem_shrinker_cleanup(struct drm_device *dev);

struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj);
Expand Down
33 changes: 20 additions & 13 deletions drivers/gpu/drm/msm/msm_gem_shrinker.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ static bool can_block(struct shrink_control *sc)
static unsigned long
msm_gem_shrinker_count(struct shrinker *shrinker, struct shrink_control *sc)
{
struct msm_drm_private *priv =
container_of(shrinker, struct msm_drm_private, shrinker);
struct msm_drm_private *priv = shrinker->private_data;
unsigned count = priv->lru.dontneed.count;

if (can_swap())
Expand Down Expand Up @@ -99,8 +98,7 @@ active_evict(struct drm_gem_object *obj)
static unsigned long
msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
{
struct msm_drm_private *priv =
container_of(shrinker, struct msm_drm_private, shrinker);
struct msm_drm_private *priv = shrinker->private_data;
struct {
struct drm_gem_lru *lru;
bool (*shrink)(struct drm_gem_object *obj);
Expand Down Expand Up @@ -147,10 +145,11 @@ msm_gem_shrinker_shrink(struct drm_device *dev, unsigned long nr_to_scan)
struct shrink_control sc = {
.nr_to_scan = nr_to_scan,
};
int ret;
unsigned long ret = SHRINK_STOP;

fs_reclaim_acquire(GFP_KERNEL);
ret = msm_gem_shrinker_scan(&priv->shrinker, &sc);
if (priv->shrinker)
ret = msm_gem_shrinker_scan(priv->shrinker, &sc);
fs_reclaim_release(GFP_KERNEL);

return ret;
Expand Down Expand Up @@ -209,16 +208,24 @@ msm_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr)
*
* This function registers and sets up the msm shrinker.
*/
void msm_gem_shrinker_init(struct drm_device *dev)
int msm_gem_shrinker_init(struct drm_device *dev)
{
struct msm_drm_private *priv = dev->dev_private;
priv->shrinker.count_objects = msm_gem_shrinker_count;
priv->shrinker.scan_objects = msm_gem_shrinker_scan;
priv->shrinker.seeks = DEFAULT_SEEKS;
WARN_ON(register_shrinker(&priv->shrinker, "drm-msm_gem"));

priv->shrinker = shrinker_alloc(0, "drm-msm_gem");
if (!priv->shrinker)
return -ENOMEM;

priv->shrinker->count_objects = msm_gem_shrinker_count;
priv->shrinker->scan_objects = msm_gem_shrinker_scan;
priv->shrinker->private_data = priv;

shrinker_register(priv->shrinker);

priv->vmap_notifier.notifier_call = msm_gem_shrinker_vmap;
WARN_ON(register_vmap_purge_notifier(&priv->vmap_notifier));

return 0;
}

/**
Expand All @@ -231,8 +238,8 @@ void msm_gem_shrinker_cleanup(struct drm_device *dev)
{
struct msm_drm_private *priv = dev->dev_private;

if (priv->shrinker.nr_deferred) {
if (priv->shrinker) {
WARN_ON(unregister_vmap_purge_notifier(&priv->vmap_notifier));
unregister_shrinker(&priv->shrinker);
shrinker_free(priv->shrinker);
}
}
2 changes: 1 addition & 1 deletion drivers/gpu/drm/panfrost/panfrost_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
6 changes: 5 additions & 1 deletion drivers/gpu/drm/panfrost/panfrost_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,10 +603,14 @@ static int panfrost_probe(struct platform_device *pdev)
if (err < 0)
goto err_out1;

panfrost_gem_shrinker_init(ddev);
err = panfrost_gem_shrinker_init(ddev);
if (err)
goto err_out2;

return 0;

err_out2:
drm_dev_unregister(ddev);
err_out1:
pm_runtime_disable(pfdev->dev);
panfrost_device_fini(pfdev);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/panfrost/panfrost_gem.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ 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);

void panfrost_gem_shrinker_init(struct drm_device *dev);
int panfrost_gem_shrinker_init(struct drm_device *dev);
void panfrost_gem_shrinker_cleanup(struct drm_device *dev);

#endif /* __PANFROST_GEM_H__ */
29 changes: 17 additions & 12 deletions drivers/gpu/drm/panfrost/panfrost_gem_shrinker.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -97,13 +95,21 @@ panfrost_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
*
* This function registers and sets up the panfrost shrinker.
*/
void panfrost_gem_shrinker_init(struct drm_device *dev)
int 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(0, "drm-panfrost");
if (!pfdev->shrinker)
return -ENOMEM;

pfdev->shrinker->count_objects = panfrost_gem_shrinker_count;
pfdev->shrinker->scan_objects = panfrost_gem_shrinker_scan;
pfdev->shrinker->private_data = pfdev;

shrinker_register(pfdev->shrinker);

return 0;
}

/**
Expand All @@ -116,7 +122,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)
shrinker_free(pfdev->shrinker);
}
Loading
Loading