virt_wifi: fix refcnt leak in module exit routine
virt_wifi_newlink() calls netdev_upper_dev_link() and it internally
holds reference count of lower interface.
Current code does not release a reference count of the lower interface
when the lower interface is being deleted.
So, reference count leaks occur.
Test commands:
ip link add dummy0 type dummy
ip link add vw1 link dummy0 type virt_wifi
ip link del dummy0
Splat looks like:
[ 133.787526][ T788] WARNING: CPU: 1 PID: 788 at net/core/dev.c:8274 rollback_registered_many+0x835/0xc80
[ 133.788355][ T788] Modules linked in: virt_wifi cfg80211 dummy team af_packet sch_fq_codel ip_tables x_tables unix
[ 133.789377][ T788] CPU: 1 PID: 788 Comm: ip Not tainted 5.4.0-rc3+ #96
[ 133.790069][ T788] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[ 133.791167][ T788] RIP: 0010:rollback_registered_many+0x835/0xc80
[ 133.791906][ T788] Code: 00 4d 85 ff 0f 84 b5 fd ff ff ba c0 0c 00 00 48 89 de 4c 89 ff e8 9b 58 04 00 48 89 df e8 30
[ 133.794317][ T788] RSP: 0018:
ffff88805ba3f338 EFLAGS:
00010202
[ 133.795080][ T788] RAX:
ffff88805e57e801 RBX:
ffff88805ba34000 RCX:
ffffffffa9294723
[ 133.796045][ T788] RDX:
1ffff1100b746816 RSI:
0000000000000008 RDI:
ffffffffabcc4240
[ 133.797006][ T788] RBP:
ffff88805ba3f4c0 R08:
fffffbfff5798849 R09:
fffffbfff5798849
[ 133.797993][ T788] R10:
0000000000000001 R11:
fffffbfff5798848 R12:
dffffc0000000000
[ 133.802514][ T788] R13:
ffff88805ba3f440 R14:
ffff88805ba3f400 R15:
ffff88805ed622c0
[ 133.803237][ T788] FS:
00007f2e9608c0c0(0000) GS:
ffff88806cc00000(0000) knlGS:
0000000000000000
[ 133.804002][ T788] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 133.804664][ T788] CR2:
00007f2e95610603 CR3:
000000005f68c004 CR4:
00000000000606e0
[ 133.805363][ T788] DR0:
0000000000000000 DR1:
0000000000000000 DR2:
0000000000000000
[ 133.806073][ T788] DR3:
0000000000000000 DR6:
00000000fffe0ff0 DR7:
0000000000000400
[ 133.806787][ T788] Call Trace:
[ 133.807069][ T788] ? generic_xdp_install+0x310/0x310
[ 133.807612][ T788] ? lock_acquire+0x164/0x3b0
[ 133.808077][ T788] ? is_bpf_text_address+0x5/0xf0
[ 133.808640][ T788] ? deref_stack_reg+0x9c/0xd0
[ 133.809138][ T788] ? __nla_validate_parse+0x98/0x1ab0
[ 133.809944][ T788] unregister_netdevice_many.part.122+0x13/0x1b0
[ 133.810599][ T788] rtnl_delete_link+0xbc/0x100
[ 133.811073][ T788] ? rtnl_af_register+0xc0/0xc0
[ 133.811672][ T788] rtnl_dellink+0x30e/0x8a0
[ 133.812205][ T788] ? is_bpf_text_address+0x5/0xf0
[ ... ]
[ 144.110530][ T788] unregister_netdevice: waiting for dummy0 to become free. Usage count = 1
This patch adds notifier routine to delete upper interface before deleting
lower interface.
Fixes:
c7cdba31ed8b ("mac80211-next: rtnetlink wifi simulation device")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>