ref_tracker: add a static classname string to each ref_tracker_dir
authorJeff Layton <jlayton@kernel.org>
Wed, 18 Jun 2025 14:24:17 +0000 (10:24 -0400)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Jun 2025 00:02:04 +0000 (17:02 -0700)
A later patch in the series will be adding debugfs files for each
ref_tracker that get created in ref_tracker_dir_init(). The format will
be "class@%px". The current "name" string can vary between
ref_tracker_dir objects of the same type, so it's not suitable for this
purpose.

Add a new "class" string to the ref_tracker dir that describes the
the type of object (sans any individual info for that object).

Also, in the i915 driver, gate the creation of debugfs files on whether
the dentry pointer is still set to NULL. CI has shown that the
ref_tracker_dir can be initialized more than once.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Link: https://patch.msgid.link/20250618-reftrack-dbgfs-v15-4-24fc37ead144@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/gpu/drm/display/drm_dp_tunnel.c
drivers/gpu/drm/i915/intel_runtime_pm.c
drivers/gpu/drm/i915/intel_wakeref.c
include/linux/ref_tracker.h
lib/test_ref_tracker.c
net/core/dev.c
net/core/net_namespace.c

index 076edf1..b9c12b8 100644 (file)
@@ -1920,7 +1920,7 @@ drm_dp_tunnel_mgr_create(struct drm_device *dev, int max_group_count)
        }
 
 #ifdef CONFIG_DRM_DISPLAY_DP_TUNNEL_STATE_DEBUG
-       ref_tracker_dir_init(&mgr->ref_tracker, 16, "dptun");
+       ref_tracker_dir_init(&mgr->ref_tracker, 16, "drm_dptun", "dptun");
 #endif
 
        for (i = 0; i < max_group_count; i++) {
index 8d9f4c4..90d9014 100644 (file)
@@ -59,7 +59,9 @@ static struct drm_i915_private *rpm_to_i915(struct intel_runtime_pm *rpm)
 
 static void init_intel_runtime_pm_wakeref(struct intel_runtime_pm *rpm)
 {
-       ref_tracker_dir_init(&rpm->debug, INTEL_REFTRACK_DEAD_COUNT, dev_name(rpm->kdev));
+       if (!rpm->debug.class)
+               ref_tracker_dir_init(&rpm->debug, INTEL_REFTRACK_DEAD_COUNT,
+                                    "intel_runtime_pm", dev_name(rpm->kdev));
 }
 
 static intel_wakeref_t
index 51561b1..7e74c58 100644 (file)
@@ -114,7 +114,8 @@ void __intel_wakeref_init(struct intel_wakeref *wf,
                         "wakeref.work", &key->work, 0);
 
 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_WAKEREF)
-       ref_tracker_dir_init(&wf->debug, INTEL_REFTRACK_DEAD_COUNT, name);
+       if (!wf->debug.class)
+               ref_tracker_dir_init(&wf->debug, INTEL_REFTRACK_DEAD_COUNT, "intel_wakeref", name);
 #endif
 }
 
index a0a1ee4..3968f99 100644 (file)
@@ -19,6 +19,7 @@ struct ref_tracker_dir {
        bool                    dead;
        struct list_head        list; /* List of active trackers */
        struct list_head        quarantine; /* List of dead trackers */
+       const char              *class; /* object classname */
        char                    name[32];
 #endif
 };
@@ -27,6 +28,7 @@ struct ref_tracker_dir {
 
 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
                                        unsigned int quarantine_count,
+                                       const char *class,
                                        const char *name)
 {
        INIT_LIST_HEAD(&dir->list);
@@ -36,6 +38,7 @@ static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
        dir->dead = false;
        refcount_set(&dir->untracked, 1);
        refcount_set(&dir->no_tracker, 1);
+       dir->class = class;
        strscpy(dir->name, name, sizeof(dir->name));
        stack_depot_init();
 }
@@ -60,6 +63,7 @@ int ref_tracker_free(struct ref_tracker_dir *dir,
 
 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
                                        unsigned int quarantine_count,
+                                       const char *class,
                                        const char *name)
 {
 }
index b983ceb..d263502 100644 (file)
@@ -64,7 +64,7 @@ static int __init test_ref_tracker_init(void)
 {
        int i;
 
-       ref_tracker_dir_init(&ref_dir, 100, "selftest");
+       ref_tracker_dir_init(&ref_dir, 100, "selftest", "selftest");
 
        timer_setup(&test_ref_tracker_timer, test_ref_tracker_timer_func, 0);
        mod_timer(&test_ref_tracker_timer, jiffies + 1);
index be97c44..12cf4e5 100644 (file)
@@ -11715,7 +11715,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
 
        dev->priv_len = sizeof_priv;
 
-       ref_tracker_dir_init(&dev->refcnt_tracker, 128, name);
+       ref_tracker_dir_init(&dev->refcnt_tracker, 128, "netdev", name);
 #ifdef CONFIG_PCPU_DEV_REFCNT
        dev->pcpu_refcnt = alloc_percpu(int);
        if (!dev->pcpu_refcnt)
index ae54f26..aa1e341 100644 (file)
@@ -403,8 +403,8 @@ static __net_init void preinit_net(struct net *net, struct user_namespace *user_
 {
        refcount_set(&net->passive, 1);
        refcount_set(&net->ns.count, 1);
-       ref_tracker_dir_init(&net->refcnt_tracker, 128, "net refcnt");
-       ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net notrefcnt");
+       ref_tracker_dir_init(&net->refcnt_tracker, 128, "net_refcnt", "net_refcnt");
+       ref_tracker_dir_init(&net->notrefcnt_tracker, 128, "net_notrefcnt", "net_notrefcnt");
 
        get_random_bytes(&net->hash_mix, sizeof(u32));
        net->dev_base_seq = 1;