diff options
| author | Eric Dumazet <edumazet@google.com> | 2022-07-29 09:12:33 +0000 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2022-08-01 11:59:23 -0700 | 
| commit | 2df91e397d85cd4c5206ab48d4e398e338db02d7 (patch) | |
| tree | 47aa3656295b6557a5c56ce4f037e4ffb42c2cdc /net/rose | |
| parent | 931027820e4dafabc78aff82af59f8c1c4bd3128 (diff) | |
net: rose: add netdev ref tracker to 'struct rose_sock'
This will help debugging netdevice refcount problems with
CONFIG_NET_DEV_REFCNT_TRACKER=y
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Tested-by: Bernard Pidoux <f6bvp@free.fr>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/rose')
| -rw-r--r-- | net/rose/af_rose.c | 12 | 
1 files changed, 9 insertions, 3 deletions
| diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index a8e3ec800a9c..36fefc3957d7 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c @@ -192,7 +192,7 @@ static void rose_kill_by_device(struct net_device *dev)  			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);  			if (rose->neighbour)  				rose->neighbour->use--; -			dev_put(rose->device); +			netdev_put(rose->device, &rose->dev_tracker);  			rose->device = NULL;  		}  	} @@ -594,7 +594,7 @@ static struct sock *rose_make_new(struct sock *osk)  	rose->defer	= orose->defer;  	rose->device	= orose->device;  	if (rose->device) -		dev_hold(rose->device); +		netdev_hold(rose->device, &rose->dev_tracker, GFP_ATOMIC);  	rose->qbitincl	= orose->qbitincl;  	return sk; @@ -648,7 +648,7 @@ static int rose_release(struct socket *sock)  		break;  	} -	dev_put(rose->device); +	netdev_put(rose->device, &rose->dev_tracker);  	sock->sk = NULL;  	release_sock(sk);  	sock_put(sk); @@ -700,6 +700,7 @@ static int rose_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)  	rose->source_addr   = addr->srose_addr;  	rose->device        = dev; +	netdev_tracker_alloc(rose->device, &rose->dev_tracker, GFP_KERNEL);  	rose->source_ndigis = addr->srose_ndigis;  	if (addr_len == sizeof(struct full_sockaddr_rose)) { @@ -801,6 +802,8 @@ static int rose_connect(struct socket *sock, struct sockaddr *uaddr, int addr_le  		memcpy(&rose->source_addr, dev->dev_addr, ROSE_ADDR_LEN);  		rose->source_call = user->call;  		rose->device      = dev; +		netdev_tracker_alloc(rose->device, &rose->dev_tracker, +				     GFP_KERNEL);  		ax25_uid_put(user);  		rose_insert_socket(sk);		/* Finish the bind */ @@ -1024,6 +1027,9 @@ int rose_rx_call_request(struct sk_buff *skb, struct net_device *dev, struct ros  		make_rose->source_digis[n] = facilities.source_digis[n];  	make_rose->neighbour     = neigh;  	make_rose->device        = dev; +	/* Caller got a reference for us. */ +	netdev_tracker_alloc(make_rose->device, &make_rose->dev_tracker, +			     GFP_ATOMIC);  	make_rose->facilities    = facilities;  	make_rose->neighbour->use++; | 
