net: add net device refcount tracker to struct neighbour
authorEric Dumazet <edumazet@google.com>
Sun, 5 Dec 2021 04:22:07 +0000 (20:22 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 00:05:11 +0000 (16:05 -0800)
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/neighbour.h
net/core/neighbour.c

index 55af812..190b07f 100644 (file)
@@ -158,6 +158,7 @@ struct neighbour {
        struct list_head        managed_list;
        struct rcu_head         rcu;
        struct net_device       *dev;
+       netdevice_tracker       dev_tracker;
        u8                      primary_key[0];
 } __randomize_layout;
 
index 72ba027..fb34034 100644 (file)
@@ -624,7 +624,7 @@ ___neigh_create(struct neigh_table *tbl, const void *pkey,
 
        memcpy(n->primary_key, pkey, key_len);
        n->dev = dev;
-       dev_hold(dev);
+       dev_hold_track(dev, &n->dev_tracker, GFP_ATOMIC);
 
        /* Protocol specific setup. */
        if (tbl->constructor && (error = tbl->constructor(n)) < 0) {
@@ -880,7 +880,7 @@ void neigh_destroy(struct neighbour *neigh)
        if (dev->netdev_ops->ndo_neigh_destroy)
                dev->netdev_ops->ndo_neigh_destroy(dev, neigh);
 
-       dev_put(dev);
+       dev_put_track(dev, &neigh->dev_tracker);
        neigh_parms_put(neigh->parms);
 
        neigh_dbg(2, "neigh %p is destroyed\n", neigh);