ax25: add net device refcount tracker
authorEric Dumazet <edumazet@google.com>
Tue, 7 Dec 2021 01:30:33 +0000 (17:30 -0800)
committerJakub Kicinski <kuba@kernel.org>
Wed, 8 Dec 2021 04:44:59 +0000 (20:44 -0800)
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/ax25.h
net/ax25/ax25_dev.c

index 03d409d..526e495 100644 (file)
@@ -229,7 +229,10 @@ struct ctl_table;
 
 typedef struct ax25_dev {
        struct ax25_dev         *next;
+
        struct net_device       *dev;
+       netdevice_tracker       dev_tracker;
+
        struct net_device       *forward;
        struct ctl_table_header *sysheader;
        int                     values[AX25_MAX_VALUES];
index d0a043a..256fadb 100644 (file)
@@ -58,7 +58,7 @@ void ax25_dev_device_up(struct net_device *dev)
 
        dev->ax25_ptr     = ax25_dev;
        ax25_dev->dev     = dev;
-       dev_hold(dev);
+       dev_hold_track(dev, &ax25_dev->dev_tracker, GFP_ATOMIC);
        ax25_dev->forward = NULL;
 
        ax25_dev->values[AX25_VALUES_IPDEFMODE] = AX25_DEF_IPDEFMODE;
@@ -114,7 +114,7 @@ void ax25_dev_device_down(struct net_device *dev)
                ax25_dev_list = s->next;
                spin_unlock_bh(&ax25_dev_lock);
                dev->ax25_ptr = NULL;
-               dev_put(dev);
+               dev_put_track(dev, &ax25_dev->dev_tracker);
                kfree(ax25_dev);
                return;
        }
@@ -124,7 +124,7 @@ void ax25_dev_device_down(struct net_device *dev)
                        s->next = ax25_dev->next;
                        spin_unlock_bh(&ax25_dev_lock);
                        dev->ax25_ptr = NULL;
-                       dev_put(dev);
+                       dev_put_track(dev, &ax25_dev->dev_tracker);
                        kfree(ax25_dev);
                        return;
                }
@@ -188,7 +188,7 @@ void __exit ax25_dev_free(void)
        ax25_dev = ax25_dev_list;
        while (ax25_dev != NULL) {
                s        = ax25_dev;
-               dev_put(ax25_dev->dev);
+               dev_put_track(ax25_dev->dev, &ax25_dev->dev_tracker);
                ax25_dev = ax25_dev->next;
                kfree(s);
        }