if (percpu_counter_init(&kvm_total_used_mmu_pages, 0, GFP_KERNEL))
                goto out;
 
-       ret = register_shrinker(&mmu_shrinker);
+       ret = register_shrinker(&mmu_shrinker, "x86-mmu");
        if (ret)
                goto out;
 
 
        int ret = list_lru_init(&binder_alloc_lru);
 
        if (ret == 0) {
-               ret = register_shrinker(&binder_shrinker);
+               ret = register_shrinker(&binder_shrinker, "android-binder");
                if (ret)
                        list_lru_destroy(&binder_alloc_lru);
        }
 
        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_WARN_ON(&i915->drm, register_shrinker(&i915->mm.shrinker,
+                                                 "drm-i915_gem"));
 
        i915->mm.oom_notifier.notifier_call = i915_gem_shrinker_oom;
        drm_WARN_ON(&i915->drm, register_oom_notifier(&i915->mm.oom_notifier));
 
        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));
+       WARN_ON(register_shrinker(&priv->shrinker, "drm-msm_gem"));
 
        priv->vmap_notifier.notifier_call = msm_gem_shrinker_vmap;
        WARN_ON(register_vmap_purge_notifier(&priv->vmap_notifier));
 
        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));
+       WARN_ON(register_shrinker(&pfdev->shrinker, "drm-panfrost"));
 }
 
 /**
 
        mm_shrinker.count_objects = ttm_pool_shrinker_count;
        mm_shrinker.scan_objects = ttm_pool_shrinker_scan;
        mm_shrinker.seeks = 1;
-       return register_shrinker(&mm_shrinker);
+       return register_shrinker(&mm_shrinker, "drm-ttm_pool");
 }
 
 /**
 
        c->shrink.seeks = 4;
        c->shrink.batch = c->btree_pages * 2;
 
-       if (register_shrinker(&c->shrink))
+       if (register_shrinker(&c->shrink, "md-bcache:%pU", c->set_uuid))
                pr_warn("bcache: %s: could not register shrinker\n",
                                __func__);
 
 
        c->shrinker.scan_objects = dm_bufio_shrink_scan;
        c->shrinker.seeks = 1;
        c->shrinker.batch = 0;
-       r = register_shrinker(&c->shrinker);
+       r = register_shrinker(&c->shrinker, "md-%s:(%u:%u)", slab_name,
+                             MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev));
        if (r)
                goto bad;
 
 
        zmd->mblk_shrinker.seeks = DEFAULT_SEEKS;
 
        /* Metadata cache shrinker */
-       ret = register_shrinker(&zmd->mblk_shrinker);
+       ret = register_shrinker(&zmd->mblk_shrinker, "md-meta:(%u:%u)",
+                               MAJOR(dev->bdev->bd_dev),
+                               MINOR(dev->bdev->bd_dev));
        if (ret) {
                dmz_zmd_err(zmd, "Register metadata cache shrinker failed");
                goto err;
 
        conf->shrinker.count_objects = raid5_cache_count;
        conf->shrinker.batch = 128;
        conf->shrinker.flags = 0;
-       ret = register_shrinker(&conf->shrinker);
+       ret = register_shrinker(&conf->shrinker, "md-raid5:%s", mdname(mddev));
        if (ret) {
                pr_warn("md/raid:%s: couldn't register shrinker.\n",
                        mdname(mddev));
 
        b->shrinker.count_objects = vmballoon_shrinker_count;
        b->shrinker.seeks = DEFAULT_SEEKS;
 
-       r = register_shrinker(&b->shrinker);
+       r = register_shrinker(&b->shrinker, "vmw-balloon");
 
        if (r == 0)
                b->shrinker_registered = true;
 
        vb->shrinker.count_objects = virtio_balloon_shrinker_count;
        vb->shrinker.seeks = DEFAULT_SEEKS;
 
-       return register_shrinker(&vb->shrinker);
+       return register_shrinker(&vb->shrinker, "virtio-balloon");
 }
 
 static int virtballoon_probe(struct virtio_device *vdev)
 
 
        register_xenstore_notifier(&xenstore_notifier);
 
-       if (register_shrinker(&backend_memory_shrinker))
+       if (register_shrinker(&backend_memory_shrinker, "xen-backend"))
                pr_warn("shrinker registration failed\n");
 
        return 0;
 
                        error = -EBUSY;
        } else {
                snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
+               shrinker_debugfs_rename(&s->s_shrink, "sb-%s:%s", fs_type->name,
+                                       s->s_id);
                btrfs_sb(s)->bdev_holder = fs_type;
                if (!strstr(crc32c_impl(), "generic"))
                        set_bit(BTRFS_FS_CSUM_IMPL_FAST, &fs_info->flags);
 
 
 int __init erofs_init_shrinker(void)
 {
-       return register_shrinker(&erofs_shrinker_info);
+       return register_shrinker(&erofs_shrinker_info, "erofs-shrinker");
 }
 
 void erofs_exit_shrinker(void)
 
        sbi->s_es_shrinker.scan_objects = ext4_es_scan;
        sbi->s_es_shrinker.count_objects = ext4_es_count;
        sbi->s_es_shrinker.seeks = DEFAULT_SEEKS;
-       err = register_shrinker(&sbi->s_es_shrinker);
+       err = register_shrinker(&sbi->s_es_shrinker, "ext4-es:%s",
+                               sbi->s_sb->s_id);
        if (err)
                goto err4;
 
 
        err = f2fs_init_sysfs();
        if (err)
                goto free_garbage_collection_cache;
-       err = register_shrinker(&f2fs_shrinker_info);
+       err = register_shrinker(&f2fs_shrinker_info, "f2fs-shrinker");
        if (err)
                goto free_sysfs;
        err = register_filesystem(&f2fs_fs_type);
 
                return -ENOMEM;
        }
 
-       ret = register_shrinker(&glock_shrinker);
+       ret = register_shrinker(&glock_shrinker, "gfs2-glock");
        if (ret) {
                destroy_workqueue(gfs2_delete_workqueue);
                destroy_workqueue(glock_workqueue);
 
        if (!gfs2_trans_cachep)
                goto fail_cachep8;
 
-       error = register_shrinker(&gfs2_qd_shrinker);
+       error = register_shrinker(&gfs2_qd_shrinker, "gfs2-qd");
        if (error)
                goto fail_shrinker;
 
 
        if (percpu_counter_init(&journal->j_checkpoint_jh_count, 0, GFP_KERNEL))
                goto err_cleanup;
 
-       if (register_shrinker(&journal->j_shrinker)) {
+       if (register_shrinker(&journal->j_shrinker, "jbd2-journal:(%u:%u)",
+                             MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev))) {
                percpu_counter_destroy(&journal->j_checkpoint_jh_count);
                goto err_cleanup;
        }
 
        cache->c_shrink.count_objects = mb_cache_count;
        cache->c_shrink.scan_objects = mb_cache_scan;
        cache->c_shrink.seeks = DEFAULT_SEEKS;
-       if (register_shrinker(&cache->c_shrink)) {
+       if (register_shrinker(&cache->c_shrink, "mbcache-shrinker")) {
                kfree(cache->c_hash);
                kfree(cache);
                goto err_out;
 
        if (ret)
                goto out2;
 
-       ret = register_shrinker(&nfs4_xattr_cache_shrinker);
+       ret = register_shrinker(&nfs4_xattr_cache_shrinker, "nfs-xattr_cache");
        if (ret)
                goto out1;
 
-       ret = register_shrinker(&nfs4_xattr_entry_shrinker);
+       ret = register_shrinker(&nfs4_xattr_entry_shrinker, "nfs-xattr_entry");
        if (ret)
                goto out;
 
-       ret = register_shrinker(&nfs4_xattr_large_entry_shrinker);
+       ret = register_shrinker(&nfs4_xattr_large_entry_shrinker,
+                               "nfs-xattr_large_entry");
        if (!ret)
                return 0;
 
 
        ret = nfs_register_sysctl();
        if (ret < 0)
                goto error_2;
-       ret = register_shrinker(&acl_shrinker);
+       ret = register_shrinker(&acl_shrinker, "nfs-acl");
        if (ret < 0)
                goto error_3;
 #ifdef CONFIG_NFS_V4_2
 
                goto out_err;
        }
 
-       ret = register_shrinker(&nfsd_file_shrinker);
+       ret = register_shrinker(&nfsd_file_shrinker, "nfsd-filecache");
        if (ret) {
                pr_err("nfsd: failed to register nfsd_file_shrinker: %d\n", ret);
                goto out_lru;
 
        nn->nfsd_reply_cache_shrinker.scan_objects = nfsd_reply_cache_scan;
        nn->nfsd_reply_cache_shrinker.count_objects = nfsd_reply_cache_count;
        nn->nfsd_reply_cache_shrinker.seeks = 1;
-       status = register_shrinker(&nn->nfsd_reply_cache_shrinker);
+       status = register_shrinker(&nn->nfsd_reply_cache_shrinker,
+                                  "nfsd-reply:%s", nn->nfsd_name);
        if (status)
                goto out_stats_destroy;
 
 
        pr_info("VFS: Dquot-cache hash table entries: %ld (order %ld,"
                " %ld bytes)\n", nr_hash, order, (PAGE_SIZE << order));
 
-       if (register_shrinker(&dqcache_shrinker))
+       if (register_shrinker(&dqcache_shrinker, "dquota-cache"))
                panic("Cannot register dquot shrinker");
 
        return 0;
 
        s->s_shrink.count_objects = super_cache_count;
        s->s_shrink.batch = 1024;
        s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE;
-       if (prealloc_shrinker(&s->s_shrink))
+       if (prealloc_shrinker(&s->s_shrink, "sb-%s", type->name))
                goto fail;
        if (list_lru_init_memcg(&s->s_dentry_lru, &s->s_shrink))
                goto fail;
        } else {
                s->s_mode = mode;
                snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
+               shrinker_debugfs_rename(&s->s_shrink, "sb-%s:%s",
+                                       fc->fs_type->name, s->s_id);
                sb_set_blocksize(s, block_size(bdev));
                error = fill_super(s, fc);
                if (error) {
        } else {
                s->s_mode = mode;
                snprintf(s->s_id, sizeof(s->s_id), "%pg", bdev);
+               shrinker_debugfs_rename(&s->s_shrink, "sb-%s:%s",
+                                       fs_type->name, s->s_id);
                sb_set_blocksize(s, block_size(bdev));
                error = fill_super(s, data, flags & SB_SILENT ? 1 : 0);
                if (error) {
 
        if (!ubifs_inode_slab)
                return -ENOMEM;
 
-       err = register_shrinker(&ubifs_shrinker_info);
+       err = register_shrinker(&ubifs_shrinker_info, "ubifs-slab");
        if (err)
                goto out_slab;
 
 
        btp->bt_shrinker.scan_objects = xfs_buftarg_shrink_scan;
        btp->bt_shrinker.seeks = DEFAULT_SEEKS;
        btp->bt_shrinker.flags = SHRINKER_NUMA_AWARE;
-       if (register_shrinker(&btp->bt_shrinker))
+       if (register_shrinker(&btp->bt_shrinker, "xfs-buf:%s",
+                             mp->m_super->s_id))
                goto error_pcpu;
        return btp;
 
 
        shrink->flags = SHRINKER_NONSLAB;
        shrink->batch = XFS_INODEGC_SHRINKER_BATCH;
 
-       return register_shrinker(shrink);
+       return register_shrinker(shrink, "xfs-inodegc:%s", mp->m_super->s_id);
 }
 
        qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
        qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE;
 
-       error = register_shrinker(&qinf->qi_shrinker);
+       error = register_shrinker(&qinf->qi_shrinker, "xfs-qm:%s",
+                                 mp->m_super->s_id);
        if (error)
                goto out_free_inos;
 
 
 #endif
 #ifdef CONFIG_SHRINKER_DEBUG
        int debugfs_id;
+       const char *name;
        struct dentry *debugfs_entry;
 #endif
        /* objs pending delete, per node */
  */
 #define SHRINKER_NONSLAB       (1 << 3)
 
-extern int prealloc_shrinker(struct shrinker *shrinker);
+extern int __printf(2, 3) prealloc_shrinker(struct shrinker *shrinker,
+                                           const char *fmt, ...);
 extern void register_shrinker_prepared(struct shrinker *shrinker);
-extern int register_shrinker(struct shrinker *shrinker);
+extern int __printf(2, 3) register_shrinker(struct shrinker *shrinker,
+                                           const char *fmt, ...);
 extern void unregister_shrinker(struct shrinker *shrinker);
 extern void free_prealloced_shrinker(struct shrinker *shrinker);
 extern void synchronize_shrinkers(void);
 #ifdef CONFIG_SHRINKER_DEBUG
 extern int shrinker_debugfs_add(struct shrinker *shrinker);
 extern void shrinker_debugfs_remove(struct shrinker *shrinker);
+extern int __printf(2, 3) shrinker_debugfs_rename(struct shrinker *shrinker,
+                                                 const char *fmt, ...);
 #else /* CONFIG_SHRINKER_DEBUG */
 static inline int shrinker_debugfs_add(struct shrinker *shrinker)
 {
 static inline void shrinker_debugfs_remove(struct shrinker *shrinker)
 {
 }
+static inline __printf(2, 3)
+int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...)
+{
+       return 0;
+}
 #endif /* CONFIG_SHRINKER_DEBUG */
 #endif /* _LINUX_SHRINKER_H */
 
                INIT_DELAYED_WORK(&krcp->page_cache_work, fill_page_cache_func);
                krcp->initialized = true;
        }
-       if (register_shrinker(&kfree_rcu_shrinker))
+       if (register_shrinker(&kfree_rcu_shrinker, "rcu-kfree"))
                pr_err("Failed to register kfree_rcu() shrinker!\n");
 }
 
 
        if (err)
                goto err_slab;
 
-       err = register_shrinker(&huge_zero_page_shrinker);
+       err = register_shrinker(&huge_zero_page_shrinker, "thp-zero");
        if (err)
                goto err_hzp_shrinker;
-       err = register_shrinker(&deferred_split_shrinker);
+       err = register_shrinker(&deferred_split_shrinker, "thp-deferred_split");
        if (err)
                goto err_split_shrinker;
 
 
 int shrinker_debugfs_add(struct shrinker *shrinker)
 {
        struct dentry *entry;
-       char buf[16];
+       char buf[128];
        int id;
 
        lockdep_assert_held(&shrinker_rwsem);
                return id;
        shrinker->debugfs_id = id;
 
-       snprintf(buf, sizeof(buf), "%d", id);
+       snprintf(buf, sizeof(buf), "%s-%d", shrinker->name, id);
 
        /* create debugfs entry */
        entry = debugfs_create_dir(buf, shrinker_debugfs_root);
        return 0;
 }
 
+int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...)
+{
+       struct dentry *entry;
+       char buf[128];
+       const char *new, *old;
+       va_list ap;
+       int ret = 0;
+
+       va_start(ap, fmt);
+       new = kvasprintf_const(GFP_KERNEL, fmt, ap);
+       va_end(ap);
+
+       if (!new)
+               return -ENOMEM;
+
+       down_write(&shrinker_rwsem);
+
+       old = shrinker->name;
+       shrinker->name = new;
+
+       if (shrinker->debugfs_entry) {
+               snprintf(buf, sizeof(buf), "%s-%d", shrinker->name,
+                        shrinker->debugfs_id);
+
+               entry = debugfs_rename(shrinker_debugfs_root,
+                                      shrinker->debugfs_entry,
+                                      shrinker_debugfs_root, buf);
+               if (IS_ERR(entry))
+                       ret = PTR_ERR(entry);
+               else
+                       shrinker->debugfs_entry = entry;
+       }
+
+       up_write(&shrinker_rwsem);
+
+       kfree_const(old);
+
+       return ret;
+}
+EXPORT_SYMBOL(shrinker_debugfs_rename);
+
 void shrinker_debugfs_remove(struct shrinker *shrinker)
 {
        lockdep_assert_held(&shrinker_rwsem);
 
+       kfree_const(shrinker->name);
+
        if (!shrinker->debugfs_entry)
                return;
 
 
 /*
  * Add a shrinker callback to be called from the vm.
  */
-int prealloc_shrinker(struct shrinker *shrinker)
+static int __prealloc_shrinker(struct shrinker *shrinker)
 {
        unsigned int size;
        int err;
        return 0;
 }
 
+#ifdef CONFIG_SHRINKER_DEBUG
+int prealloc_shrinker(struct shrinker *shrinker, const char *fmt, ...)
+{
+       va_list ap;
+       int err;
+
+       va_start(ap, fmt);
+       shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap);
+       va_end(ap);
+       if (!shrinker->name)
+               return -ENOMEM;
+
+       err = __prealloc_shrinker(shrinker);
+       if (err)
+               kfree_const(shrinker->name);
+
+       return err;
+}
+#else
+int prealloc_shrinker(struct shrinker *shrinker, const char *fmt, ...)
+{
+       return __prealloc_shrinker(shrinker);
+}
+#endif
+
 void free_prealloced_shrinker(struct shrinker *shrinker)
 {
+#ifdef CONFIG_SHRINKER_DEBUG
+       kfree_const(shrinker->name);
+#endif
        if (shrinker->flags & SHRINKER_MEMCG_AWARE) {
                down_write(&shrinker_rwsem);
                unregister_memcg_shrinker(shrinker);
        up_write(&shrinker_rwsem);
 }
 
-int register_shrinker(struct shrinker *shrinker)
+static int __register_shrinker(struct shrinker *shrinker)
 {
-       int err = prealloc_shrinker(shrinker);
+       int err = __prealloc_shrinker(shrinker);
 
        if (err)
                return err;
        register_shrinker_prepared(shrinker);
        return 0;
 }
+
+#ifdef CONFIG_SHRINKER_DEBUG
+int register_shrinker(struct shrinker *shrinker, const char *fmt, ...)
+{
+       va_list ap;
+       int err;
+
+       va_start(ap, fmt);
+       shrinker->name = kvasprintf_const(GFP_KERNEL, fmt, ap);
+       va_end(ap);
+       if (!shrinker->name)
+               return -ENOMEM;
+
+       err = __register_shrinker(shrinker);
+       if (err)
+               kfree_const(shrinker->name);
+       return err;
+}
+#else
+int register_shrinker(struct shrinker *shrinker, const char *fmt, ...)
+{
+       return __register_shrinker(shrinker);
+}
+#endif
 EXPORT_SYMBOL(register_shrinker);
 
 /*
 
        pr_info("workingset: timestamp_bits=%d max_order=%d bucket_order=%u\n",
               timestamp_bits, max_order, bucket_order);
 
-       ret = prealloc_shrinker(&workingset_shadow_shrinker);
+       ret = prealloc_shrinker(&workingset_shadow_shrinker, "mm-shadow");
        if (ret)
                goto err;
        ret = __list_lru_init(&shadow_nodes, true, &shadow_nodes_key,
 
        pool->shrinker.batch = 0;
        pool->shrinker.seeks = DEFAULT_SEEKS;
 
-       return register_shrinker(&pool->shrinker);
+       return register_shrinker(&pool->shrinker, "mm-zspool:%s",
+                                pool->name);
 }
 
 /**
 
        err = rpc_init_authunix();
        if (err < 0)
                goto out1;
-       err = register_shrinker(&rpc_cred_shrinker);
+       err = register_shrinker(&rpc_cred_shrinker, "sunrpc_cred");
        if (err < 0)
                goto out2;
        return 0;