sit: add net device refcount tracking to ip_tunnel
authorEric Dumazet <edumazet@google.com>
Sun, 5 Dec 2021 04:22:05 +0000 (20:22 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 7 Dec 2021 00:05:11 +0000 (16:05 -0800)
Note that other ip_tunnel users do not seem to hold a reference
on tunnel->dev. Probably needs some investigations.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/ip_tunnels.h
net/ipv6/sit.c

index bc3b13e..0219fe9 100644 (file)
@@ -104,7 +104,10 @@ struct metadata_dst;
 struct ip_tunnel {
        struct ip_tunnel __rcu  *next;
        struct hlist_node hash_node;
+
        struct net_device       *dev;
+       netdevice_tracker       dev_tracker;
+
        struct net              *net;   /* netns for packet i/o */
 
        unsigned long   err_time;       /* Time when the last ICMP error
index 1b57ee3..057c0f8 100644 (file)
@@ -521,7 +521,7 @@ static void ipip6_tunnel_uninit(struct net_device *dev)
                ipip6_tunnel_del_prl(tunnel, NULL);
        }
        dst_cache_reset(&tunnel->dst_cache);
-       dev_put(dev);
+       dev_put_track(dev, &tunnel->dev_tracker);
 }
 
 static int ipip6_err(struct sk_buff *skb, u32 info)
@@ -1463,7 +1463,7 @@ static int ipip6_tunnel_init(struct net_device *dev)
                dev->tstats = NULL;
                return err;
        }
-       dev_hold(dev);
+       dev_hold_track(dev, &tunnel->dev_tracker, GFP_KERNEL);
        return 0;
 }