Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Eric Dumazet and committed by
Jakub Kicinski
2df91e39 93102782

+11 -4
+2 -1
include/net/rose.h
··· 132 132 ax25_address source_digis[ROSE_MAX_DIGIS]; 133 133 ax25_address dest_digis[ROSE_MAX_DIGIS]; 134 134 struct rose_neigh *neighbour; 135 - struct net_device *device; 135 + struct net_device *device; 136 + netdevice_tracker dev_tracker; 136 137 unsigned int lci, rand; 137 138 unsigned char state, condition, qbitincl, defer; 138 139 unsigned char cause, diagnostic;
+9 -3
net/rose/af_rose.c
··· 192 192 rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0); 193 193 if (rose->neighbour) 194 194 rose->neighbour->use--; 195 - dev_put(rose->device); 195 + netdev_put(rose->device, &rose->dev_tracker); 196 196 rose->device = NULL; 197 197 } 198 198 } ··· 594 594 rose->defer = orose->defer; 595 595 rose->device = orose->device; 596 596 if (rose->device) 597 - dev_hold(rose->device); 597 + netdev_hold(rose->device, &rose->dev_tracker, GFP_ATOMIC); 598 598 rose->qbitincl = orose->qbitincl; 599 599 600 600 return sk; ··· 648 648 break; 649 649 } 650 650 651 - dev_put(rose->device); 651 + netdev_put(rose->device, &rose->dev_tracker); 652 652 sock->sk = NULL; 653 653 release_sock(sk); 654 654 sock_put(sk); ··· 700 700 701 701 rose->source_addr = addr->srose_addr; 702 702 rose->device = dev; 703 + netdev_tracker_alloc(rose->device, &rose->dev_tracker, GFP_KERNEL); 703 704 rose->source_ndigis = addr->srose_ndigis; 704 705 705 706 if (addr_len == sizeof(struct full_sockaddr_rose)) { ··· 802 801 memcpy(&rose->source_addr, dev->dev_addr, ROSE_ADDR_LEN); 803 802 rose->source_call = user->call; 804 803 rose->device = dev; 804 + netdev_tracker_alloc(rose->device, &rose->dev_tracker, 805 + GFP_KERNEL); 805 806 ax25_uid_put(user); 806 807 807 808 rose_insert_socket(sk); /* Finish the bind */ ··· 1027 1024 make_rose->source_digis[n] = facilities.source_digis[n]; 1028 1025 make_rose->neighbour = neigh; 1029 1026 make_rose->device = dev; 1027 + /* Caller got a reference for us. */ 1028 + netdev_tracker_alloc(make_rose->device, &make_rose->dev_tracker, 1029 + GFP_ATOMIC); 1030 1030 make_rose->facilities = facilities; 1031 1031 1032 1032 make_rose->neighbour->use++;