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

index 41a5183..8420fe5 100644 (file)
@@ -162,6 +162,7 @@ struct netpoll;
  *     @vlan_id: VLAN identifier
  *     @flags: device flags
  *     @real_dev: underlying netdevice
+ *     @dev_tracker: refcount tracker for @real_dev reference
  *     @real_dev_addr: address of underlying netdevice
  *     @dent: proc dir entry
  *     @vlan_pcpu_stats: ptr to percpu rx stats
@@ -177,6 +178,8 @@ struct vlan_dev_priv {
        u16                                     flags;
 
        struct net_device                       *real_dev;
+       netdevice_tracker                       dev_tracker;
+
        unsigned char                           real_dev_addr[ETH_ALEN];
 
        struct proc_dir_entry                   *dent;
index 866556e..26d031a 100644 (file)
@@ -616,7 +616,7 @@ static int vlan_dev_init(struct net_device *dev)
                return -ENOMEM;
 
        /* Get vlan's reference to real_dev */
-       dev_hold(real_dev);
+       dev_hold_track(real_dev, &vlan->dev_tracker, GFP_KERNEL);
 
        return 0;
 }
@@ -848,7 +848,7 @@ static void vlan_dev_free(struct net_device *dev)
        vlan->vlan_pcpu_stats = NULL;
 
        /* Get rid of the vlan's reference to real_dev */
-       dev_put(vlan->real_dev);
+       dev_put_track(vlan->real_dev, &vlan->dev_tracker);
 }
 
 void vlan_setup(struct net_device *dev)