* [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9)
@ 2026-05-10 20:18 syzbot
2026-05-14 1:51 ` Forwarded: [syzbot] test patch for unregister_netdevice syzbot
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: syzbot @ 2026-05-10 20:18 UTC (permalink / raw)
To: davem, dsahern, edumazet, horms, kuba, linux-kernel, netdev,
pabeni, syzkaller-bugs
Hello,
syzbot found the following issue on:
HEAD commit: 5cbb61bf4168 arm64/fpsimd: ptrace: zero target's fpsimd_st..
git tree: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-kernelci
console output: https://syzkaller.appspot.com/x/log.txt?x=142f40ec580000
kernel config: https://syzkaller.appspot.com/x/.config?x=a834c6344141a58b
dashboard link: https://syzkaller.appspot.com/bug?extid=e2af46126e0644cbebdd
compiler: Debian clang version 21.1.8 (++20251221033036+2078da43e25a-1~exp1~20251221153213.50), Debian LLD 21.1.8
userspace arch: arm64
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=103f3dba580000
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/04156ec16593/disk-5cbb61bf.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/6bfa041e2c79/vmlinux-5cbb61bf.xz
kernel image: https://storage.googleapis.com/syzbot-assets/a92d82d8a79e/Image-5cbb61bf.gz.xz
mounted in repro: https://storage.googleapis.com/syzbot-assets/7915d7230a1d/mount_6.gz
fsck result: failed (log: https://syzkaller.appspot.com/x/fsck.log?x=15005a73980000)
IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+e2af46126e0644cbebdd@syzkaller.appspotmail.com
unregister_netdevice: waiting for netdevsim1 to become free. Usage count = 2
ref_tracker: netdev@00000000f11a2c54 has 1/1 users at
__netdev_tracker_alloc include/linux/netdevice.h:4471 [inline]
netdev_tracker_alloc include/linux/netdevice.h:4483 [inline]
netdev_get_by_index+0x88/0xe0 net/core/dev.c:1027
fib6_nh_init+0x258/0x14bc net/ipv6/route.c:3606
ip6_route_info_create_nh+0x120/0x9a8 net/ipv6/route.c:3905
addrconf_f6i_alloc+0x1e4/0x3b4 net/ipv6/route.c:4697
ipv6_add_addr+0x458/0xd70 net/ipv6/addrconf.c:1126
addrconf_add_linklocal+0x1e0/0x378 net/ipv6/addrconf.c:3311
addrconf_addr_gen+0x27c/0x2e0 net/ipv6/addrconf.c:-1
addrconf_init_auto_addrs+0x390/0x764 net/ipv6/addrconf.c:-1
addrconf_notify+0x7a0/0xbe4 net/ipv6/addrconf.c:3752
notifier_call_chain+0x194/0x60c kernel/notifier.c:85
raw_notifier_call_chain+0x3c/0x50 kernel/notifier.c:453
call_netdevice_notifiers_info+0xb8/0x120 net/core/dev.c:2249
call_netdevice_notifiers_extack net/core/dev.c:2287 [inline]
call_netdevice_notifiers net/core/dev.c:2301 [inline]
__dev_notify_flags+0x160/0x27c net/core/dev.c:9794
netif_change_flags+0xd0/0x15c net/core/dev.c:9823
do_setlink+0xab0/0x31c0 net/core/rtnetlink.c:3180
rtnl_changelink net/core/rtnetlink.c:3799 [inline]
__rtnl_newlink net/core/rtnetlink.c:3972 [inline]
rtnl_newlink+0xd24/0x113c net/core/rtnetlink.c:4109
netdevsim netdevsim2 netdevsim0 (unregistering): unset [1, 0] type 2 family 0 port 6081 - 0
---
This report is generated by a bot. It may contain errors.
See https://goo.gl/tpsmEJ for more information about syzbot.
syzbot engineers can be reached at syzkaller@googlegroups.com.
syzbot will keep track of this issue. See:
https://goo.gl/tpsmEJ#status for how to communicate with syzbot.
If the report is already addressed, let syzbot know by replying with:
#syz fix: exact-commit-title
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.
If you want to overwrite report's subsystems, reply with:
#syz set subsystems: new-subsystem
(See the list of subsystem names on the web dashboard)
If the report is a duplicate of another one, reply with:
#syz dup: exact-subject-of-another-report
If you want to undo deduplication, reply with:
#syz undup
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test patch for unregister_netdevice
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
@ 2026-05-14 1:51 ` syzbot
2026-05-14 2:08 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 1:51 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test patch for unregister_netdevice
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git main
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5476b6536eb7..a517e57cf86a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3666,6 +3666,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
break;
case NETDEV_CHANGEMTU:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
if (dev->mtu < IPV6_MIN_MTU) {
addrconf_ifdown(dev, dev != net->loopback_dev);
@@ -3691,6 +3694,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
fallthrough;
case NETDEV_UP:
case NETDEV_CHANGE:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
if (idev && idev->cnf.disable_ipv6)
break;
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
2026-05-14 1:51 ` Forwarded: [syzbot] test patch for unregister_netdevice syzbot
@ 2026-05-14 2:08 ` syzbot
2026-05-14 2:36 ` syzbot
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 2:08 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git main
From: Xu Rao <raoxu@uniontech.com>
Date: Tue, 12 May 2026 20:44:10 +0800
Subject: [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
syzbot reports that unregister_netdevice() can wait forever for a
netdevsim device whose reference count never drops to zero.
The leaked reference is held by an IPv6 local route created from
addrconf. A late NETDEV_CHANGE notification can still reach
addrconf_notify() after the device has entered NETREG_UNREGISTERING.
The handler can then run automatic address configuration, add a
link-local address and install its host route after unregister teardown
has already started. The route nexthop takes a netdev reference in
fib6_nh_init(), and there might not be a later ifdown pass to remove
the newly created address and route.
Do not run MTU, UP or CHANGE based IPv6 autoconfiguration once the
device is unregistering. Keep NETDEV_DOWN and NETDEV_UNREGISTER
handling unchanged so the teardown path can still remove existing IPv6
state.
Reported-by: syzbot+e2af46126e0644cbebdd@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=e2af46126e0644cbebdd
Signed-off-by: Xu Rao <raoxu@uniontech.com>
---
v2:
- Drop READ_ONCE() around dev->reg_state. addrconf_notify() is called
from the netdevice notifier path, so a plain load is sufficient.
- Do not add a Fixes tag. The issue does not appear to be caused by a
single commit, but by a long-standing unregister-time lifecycle gap.
net/ipv6/addrconf.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5476b6536eb7..a517e57cf86a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3666,6 +3666,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
break;
case NETDEV_CHANGEMTU:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
if (dev->mtu < IPV6_MIN_MTU) {
addrconf_ifdown(dev, dev != net->loopback_dev);
@@ -3691,6 +3694,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
fallthrough;
case NETDEV_UP:
case NETDEV_CHANGE:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
if (idev && idev->cnf.disable_ipv6)
break;
--
2.50.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
2026-05-14 1:51 ` Forwarded: [syzbot] test patch for unregister_netdevice syzbot
2026-05-14 2:08 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
@ 2026-05-14 2:36 ` syzbot
2026-05-14 4:02 ` syzbot
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 2:36 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git main
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (2 preceding siblings ...)
2026-05-14 2:36 ` syzbot
@ 2026-05-14 4:02 ` syzbot
2026-05-14 6:48 ` Forwarded: [syzbot] test net main baseline syzbot
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 4:02 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git main
From: Xu Rao <raoxu@uniontech.com>
Subject: [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
syzbot reports that unregister_netdevice() can wait forever for a
netdevsim device whose reference count never drops to zero.
The leaked reference is held by an IPv6 local route created from
addrconf. A late NETDEV_CHANGE notification can still reach
addrconf_notify() after the device has entered NETREG_UNREGISTERING.
The handler can then run automatic address configuration, add a
link-local address and install its host route after unregister teardown
has already started. The route nexthop takes a netdev reference in
fib6_nh_init(), and there might not be a later ifdown pass to remove
the newly created address and route.
Do not run MTU, UP or CHANGE based IPv6 autoconfiguration once the
device is unregistering. Keep NETDEV_DOWN and NETDEV_UNREGISTER
handling unchanged so the teardown path can still remove existing IPv6
state.
Reported-by: syzbot+e2af46126e0644cbebdd@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=e2af46126e0644cbebdd
Signed-off-by: Xu Rao <raoxu@uniontech.com>
---
v2:
- Drop READ_ONCE() around dev->reg_state. addrconf_notify() is called
from the netdevice notifier path, so a plain load is sufficient.
- Do not add a Fixes tag. The issue does not appear to be caused by a
single commit, but by a long-standing unregister-time lifecycle gap.
net/ipv6/addrconf.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5476b6536eb7..a517e57cf86a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3666,6 +3666,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
break;
case NETDEV_CHANGEMTU:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
if (dev->mtu < IPV6_MIN_MTU) {
addrconf_ifdown(dev, dev != net->loopback_dev);
@@ -3691,12 +3694,15 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
fallthrough;
case NETDEV_UP:
case NETDEV_CHANGE:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
if (idev && idev->cnf.disable_ipv6)
break;
if (dev->priv_flags & IFF_NO_ADDRCONF) {
if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
ipv6_mc_up(idev);
break;
}
--
2.50.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test net main baseline
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (3 preceding siblings ...)
2026-05-14 4:02 ` syzbot
@ 2026-05-14 6:48 ` syzbot
2026-05-14 8:24 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 6:48 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test net main baseline
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git main
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (4 preceding siblings ...)
2026-05-14 6:48 ` Forwarded: [syzbot] test net main baseline syzbot
@ 2026-05-14 8:24 ` syzbot
2026-05-14 11:12 ` Forwarded: [syzbot] test WARN_ON for addrconf " syzbot
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 8:24 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-kernelci
From: Xu Rao <raoxu@uniontech.com>
Subject: [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices
syzbot reports that unregister_netdevice() can wait forever for a
netdevsim device whose reference count never drops to zero.
The leaked reference is held by an IPv6 local route created from
addrconf. A late NETDEV_CHANGE notification can still reach
addrconf_notify() after the device has entered NETREG_UNREGISTERING.
The handler can then run automatic address configuration, add a
link-local address and install its host route after unregister teardown
has already started. The route nexthop takes a netdev reference in
fib6_nh_init(), and there might not be a later ifdown pass to remove
the newly created address and route.
Do not run MTU, UP or CHANGE based IPv6 autoconfiguration once the
device is unregistering. Keep NETDEV_DOWN and NETDEV_UNREGISTER
handling unchanged so the teardown path can still remove existing IPv6
state.
Reported-by: syzbot+e2af46126e0644cbebdd@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=e2af46126e0644cbebdd
Signed-off-by: Xu Rao <raoxu@uniontech.com>
---
v2:
- Drop READ_ONCE() around dev->reg_state. addrconf_notify() is called
from the netdevice notifier path, so a plain load is sufficient.
- Do not add a Fixes tag. The issue does not appear to be caused by a
single commit, but by a long-standing unregister-time lifecycle gap.
net/ipv6/addrconf.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5476b6536eb7..a517e57cf86a 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3666,6 +3666,9 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
break;
case NETDEV_CHANGEMTU:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
if (dev->mtu < IPV6_MIN_MTU) {
addrconf_ifdown(dev, dev != net->loopback_dev);
@@ -3691,12 +3694,15 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
fallthrough;
case NETDEV_UP:
case NETDEV_CHANGE:
+ if (dev->reg_state == NETREG_UNREGISTERING)
+ break;
+
if (idev && idev->cnf.disable_ipv6)
break;
if (dev->priv_flags & IFF_NO_ADDRCONF) {
if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
ipv6_mc_up(idev);
break;
}
--
2.50.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test WARN_ON for addrconf on unregistering devices
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (5 preceding siblings ...)
2026-05-14 8:24 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
@ 2026-05-14 11:12 ` syzbot
2026-05-14 11:58 ` Forwarded: [syzbot] test baseline for unregister_netdevice ref leak syzbot
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 11:12 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test WARN_ON for addrconf on unregistering devices
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-kernelci
From: Xu Rao <raoxu@uniontech.com>
Subject: [PATCH debug] ipv6: addrconf: warn on autoconf for unregistering devices
Add WARN_ON() checks where the proposed fix skips IPv6 autoconf on
unregistering devices. This is a diagnostic patch to confirm whether
the syzbot reproducer reaches the MTU / UP / CHANGE paths after the
netdevice has entered NETREG_UNREGISTERING.
Signed-off-by: Xu Rao <raoxu@uniontech.com>
---
net/ipv6/addrconf.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 5476b6536eb7..72a3b17d30a1 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -3666,6 +3666,8 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
break;
case NETDEV_CHANGEMTU:
+ WARN_ON(dev->reg_state == NETREG_UNREGISTERING);
+
/* if MTU under IPV6_MIN_MTU stop IPv6 on this interface. */
if (dev->mtu < IPV6_MIN_MTU) {
addrconf_ifdown(dev, dev != net->loopback_dev);
@@ -3691,12 +3693,14 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
fallthrough;
case NETDEV_UP:
case NETDEV_CHANGE:
+ WARN_ON(dev->reg_state == NETREG_UNREGISTERING);
+
if (idev && idev->cnf.disable_ipv6)
break;
if (dev->priv_flags & IFF_NO_ADDRCONF) {
if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
ipv6_mc_up(idev);
break;
}
--
2.50.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: [syzbot] test baseline for unregister_netdevice ref leak
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (6 preceding siblings ...)
2026-05-14 11:12 ` Forwarded: [syzbot] test WARN_ON for addrconf " syzbot
@ 2026-05-14 11:58 ` syzbot
2026-09-15 12:14 ` [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
2026-09-15 12:29 ` Forwarded: " syzbot
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-05-14 11:58 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [syzbot] test baseline for unregister_netdevice ref leak
Author: raoxu@uniontech.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-kernelci
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9)
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (7 preceding siblings ...)
2026-05-14 11:58 ` Forwarded: [syzbot] test baseline for unregister_netdevice ref leak syzbot
@ 2026-09-15 12:14 ` syzbot
2026-09-15 12:29 ` Forwarded: " syzbot
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-09-15 12:14 UTC (permalink / raw)
To: davem, dsahern, edumazet, horms, idosch, kuba, kuniyu,
linux-kernel, netdev, pabeni, penguin-kernel, raoxu,
syzkaller-bugs, willemb
syzbot has found a reproducer for the following issue on:
HEAD commit: 5445d6419962 arm64: Don't read GMID_EL1 when MTE is disabled
git tree: git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-kernelci
console output: https://syzkaller.appspot.com/x/log.txt?x=1250428e580000
kernel config: https://syzkaller.appspot.com/x/.config?x=56ed23170c168d4c
dashboard link: https://syzkaller.appspot.com/bug?extid=e2af46126e0644cbebdd
compiler: Debian clang version 22.1.8 (++20260613092233+e80beda6e255-1~exp1~20260613092250.77), Debian LLD 22.1.8
userspace arch: arm64
syz repro: https://syzkaller.appspot.com/x/repro.syz?x=15b32471580000
C reproducer: https://syzkaller.appspot.com/x/repro.c?x=16d742d1580000
Downloadable assets:
disk image: https://storage.googleapis.com/syzbot-assets/e8b70e3bd109/disk-5445d641.raw.xz
vmlinux: https://storage.googleapis.com/syzbot-assets/e5227e56ac93/vmlinux-5445d641.xz
kernel image: https://storage.googleapis.com/syzbot-assets/54905f78be59/Image-5445d641.gz.xz
IMPORTANT: if you fix the issue, please add the following tag to the commit:
Reported-by: syzbot+e2af46126e0644cbebdd@syzkaller.appspotmail.com
unregister_netdevice: waiting for netdevsim2 to become free. Usage count = 2
ref_tracker: netdev@000000004118ac35 has 1/1 users at
__netdev_tracker_alloc include/linux/netdevice.h:4528 [inline]
netdev_tracker_alloc+0x68/0xb4 include/linux/netdevice.h:4540
fib_create_info+0x15cc/0x2184 net/ipv4/fib_semantics.c:1524
fib_table_insert+0xa4/0x12bc net/ipv4/fib_trie.c:1212
fib_magic+0x26c/0x344 net/ipv4/fib_frontend.c:1147
fib_add_ifaddr+0x114/0x500 net/ipv4/fib_frontend.c:1169
fib_inetaddr_event+0x114/0x1c0 net/ipv4/fib_frontend.c:1483
notifier_call_chain+0x1a4/0x624 kernel/notifier.c:85
blocking_notifier_call_chain+0x70/0xa0 kernel/notifier.c:380
__inet_insert_ifa+0x87c/0xa74 net/ipv4/devinet.c:566
inet_rtm_newaddr+0xba4/0x1140 net/ipv4/devinet.c:1001
rtnetlink_rcv_msg+0x66c/0x9bc net/core/rtnetlink.c:7132
netlink_rcv_skb+0x238/0x414 net/netlink/af_netlink.c:2556
rtnetlink_rcv+0x28/0x38 net/core/rtnetlink.c:7159
netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline]
netlink_unicast+0x600/0x7f8 net/netlink/af_netlink.c:1345
netlink_sendmsg+0x648/0x948 net/netlink/af_netlink.c:1900
sock_sendmsg_nosec net/socket.c:800 [inline]
__sock_sendmsg+0xc8/0x17c net/socket.c:815
netdevsim netdevsim2 netdevsim1 (unregistering): unset [1, 0] type 2 family 0 port 6081 - 0
---
If you want syzbot to run the reproducer, reply with:
#syz test: git://repo/address.git branch-or-commit-hash
If you attach or paste a git patch, syzbot will apply it before testing.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Forwarded: Re: [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9)
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
` (8 preceding siblings ...)
2026-09-15 12:14 ` [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
@ 2026-09-15 12:29 ` syzbot
9 siblings, 0 replies; 11+ messages in thread
From: syzbot @ 2026-09-15 12:29 UTC (permalink / raw)
To: linux-kernel, syzkaller-bugs
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: Re: [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9)
Author: penguin-kernel@i-love.sakura.ne.jp
#syz test
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 87cafc932e9e..d518338cd074 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2153,6 +2153,8 @@ enum netdev_reg_state {
*
* FIXME: cleanup struct net_device such that network protocol info
* moves out.
+ *
+ * @netdev_trace_buffer_list: Linked list for debugging refcount leak.
*/
struct net_device {
@@ -2312,6 +2314,9 @@ struct net_device {
#if IS_ENABLED(CONFIG_TLS_DEVICE)
const struct tlsdev_ops *tlsdev_ops;
#endif
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+ struct list_head netdev_trace_buffer_list;
+#endif
unsigned int operstate;
unsigned char link_mode;
@@ -4498,9 +4503,16 @@ static inline bool dev_nit_active(const struct net_device *dev)
void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev);
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+void save_netdev_trace_buffer(struct net_device *dev, int delta);
+#else
+static inline void save_netdev_trace_buffer(struct net_device *dev, int delta) { }
+#endif
+
static inline void __dev_put(struct net_device *dev)
{
if (dev) {
+ save_netdev_trace_buffer(dev, -1);
#ifdef CONFIG_PCPU_DEV_REFCNT
this_cpu_dec(*dev->pcpu_refcnt);
#else
@@ -4512,6 +4524,7 @@ static inline void __dev_put(struct net_device *dev)
static inline void __dev_hold(struct net_device *dev)
{
if (dev) {
+ save_netdev_trace_buffer(dev, 1);
#ifdef CONFIG_PCPU_DEV_REFCNT
this_cpu_inc(*dev->pcpu_refcnt);
#else
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index 96848fc1f02b..20c4c92708b8 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -2566,6 +2566,10 @@ static bool rcu_do_batch_check_time(long count, long tlimit,
local_clock() >= tlimit;
}
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+static noinline void rcu_do_batch(struct rcu_data *rdp);
+#endif
+
/*
* Invoke any RCU callbacks that have made it to the end of their grace
* period. Throttle as specified by rdp->blimit.
diff --git a/kernel/softirq.c b/kernel/softirq.c
index 7980a4a232f9..ad9889563288 100644
--- a/kernel/softirq.c
+++ b/kernel/softirq.c
@@ -599,6 +599,10 @@ static inline bool lockdep_softirq_start(void) { return false; }
static inline void lockdep_softirq_end(bool in_hardirq) { }
#endif
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+static noinline void handle_softirqs(bool ksirqd);
+#endif
+
static void handle_softirqs(bool ksirqd)
{
unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 3c034cbc5bb3..60daae1c6f17 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -3259,6 +3259,10 @@ static bool manage_workers(struct worker *worker)
return true;
}
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+static noinline void process_one_work(struct worker *worker, struct work_struct *work);
+#endif
+
/**
* process_one_work - process single work
* @worker: self
diff --git a/net/core/dev.c b/net/core/dev.c
index 38336858c168..93a7594d586e 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -11639,6 +11639,14 @@ int netdev_refcnt_read(const struct net_device *dev)
}
EXPORT_SYMBOL(netdev_refcnt_read);
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+static void dump_netdev_trace_buffer(const struct net_device *dev);
+static void erase_netdev_trace_buffer(const struct net_device *dev);
+#else
+static inline void dump_netdev_trace_buffer(const struct net_device *dev) { }
+static inline void erase_netdev_trace_buffer(const struct net_device *dev) { }
+#endif
+
int netdev_unregister_timeout_secs __read_mostly = 10;
#define WAIT_REFS_MIN_MSECS 1
@@ -11721,6 +11729,7 @@ static struct net_device *netdev_wait_allrefs_any(struct list_head *list)
pr_emerg("unregister_netdevice: waiting for %s to become free. Usage count = %d\n",
dev->name, netdev_refcnt_read(dev));
ref_tracker_dir_print(&dev->refcnt_tracker, 10);
+ dump_netdev_trace_buffer(dev);
}
warning_time = jiffies;
@@ -12121,6 +12130,9 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
dev->priv_len = sizeof_priv;
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+ INIT_LIST_HEAD(&dev->netdev_trace_buffer_list);
+#endif
ref_tracker_dir_init(&dev->refcnt_tracker, 128, "netdev");
#ifdef CONFIG_PCPU_DEV_REFCNT
dev->pcpu_refcnt = alloc_percpu(int);
@@ -12223,6 +12235,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
free_pcpu:
#ifdef CONFIG_PCPU_DEV_REFCNT
free_percpu(dev->pcpu_refcnt);
+ erase_netdev_trace_buffer(dev);
free_dev:
#endif
ref_tracker_dir_exit(&dev->refcnt_tracker);
@@ -12292,6 +12305,7 @@ void free_netdev(struct net_device *dev)
free_percpu(dev->pcpu_refcnt);
dev->pcpu_refcnt = NULL;
#endif
+ erase_netdev_trace_buffer(dev);
free_percpu(dev->core_stats);
dev->core_stats = NULL;
free_percpu(dev->xdp_bulkq);
@@ -13418,6 +13432,12 @@ static struct smp_hotplug_thread backlog_threads = {
.setup = backlog_napi_setup,
};
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+static void __init net_dev_refcnt_tracker_init(void);
+#else
+static void __init net_dev_refcnt_tracker_init(void) { };
+#endif
+
/*
* This is called single threaded during boot, so no need
* to take the rtnl semaphore.
@@ -13426,6 +13446,7 @@ static int __init net_dev_init(void)
{
int i, rc = -ENOMEM;
+ net_dev_refcnt_tracker_init();
BUG_ON(!dev_boot_phase);
net_dev_struct_check();
@@ -13529,3 +13550,254 @@ static int __init net_dev_init(void)
}
subsys_initcall(net_dev_init);
+
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+
+#define NETDEV_TRACE_BUFFER_SIZE 32768
+static struct netdev_trace_buffer {
+ struct list_head list;
+ atomic_t count;
+ int trimmed_entries;
+ int nr_entries;
+ unsigned long entries[20];
+} netdev_trace_buffer[NETDEV_TRACE_BUFFER_SIZE];
+static LIST_HEAD(netdev_trace_buffer_list);
+static DEFINE_RAW_SPINLOCK(netdev_trace_buffer_lock);
+static bool netdev_trace_buffer_exhausted;
+static unsigned long start_of_handle_softirqs __ro_after_init;
+static unsigned long end_of_handle_softirqs __ro_after_init;
+
+static int netdev_trace_buffer_init(void)
+{
+ int i;
+
+ for (i = 0; i < NETDEV_TRACE_BUFFER_SIZE; i++)
+ list_add_tail(&netdev_trace_buffer[i].list, &netdev_trace_buffer_list);
+ return 0;
+}
+pure_initcall(netdev_trace_buffer_init);
+
+static int trim_netdev_trace(unsigned long *entries, int nr_entries)
+{
+ char buffer[KSYM_SYMBOL_LEN] = { };
+ char *cp;
+ int i;
+
+ for (i = 0; i < nr_entries; i++) {
+ sprint_symbol_no_offset(buffer, entries[i]);
+ cp = strchr(buffer, ' ');
+ if (cp)
+ *cp = '\0';
+ if (buffer[0] == 'p') {
+ if (!strcmp(buffer, "process_one_work"))
+ return i + 1;
+ } else if (buffer[0] == 'k') {
+ if (!strcmp(buffer, "ksys_unshare"))
+ return i + 1;
+ } else if (buffer[0] == 's') {
+ if (!strcmp(buffer, "sock_sendmsg_nosec") ||
+ !strcmp(buffer, "sock_recvmsg_nosec"))
+ return i + 1;
+ } else if (buffer[0] == 'r') {
+ if (!strcmp(buffer, "rcu_do_batch"))
+ return i + 1;
+ } else if (buffer[0] == '_') {
+ if (!strcmp(buffer, "__sys_bind") ||
+ !strcmp(buffer, "__sock_release") ||
+ !strcmp(buffer, "__sys_bpf"))
+ return i + 1;
+ } else {
+ if (!strcmp(buffer, "do_sock_setsockopt"))
+ return i + 1;
+ }
+ }
+ return nr_entries;
+}
+
+static void dump_netdev_trace_buffer(const struct net_device *dev)
+{
+ struct netdev_trace_buffer *ptr, *tmp;
+ int count, balance = 0, pos = 0;
+
+ /* Update trimmed_entries field. Do not modify nr_entries field
+ * in case save_netdev_trace_buffer() is called again.
+ */
+ list_for_each_entry_rcu(ptr, &dev->netdev_trace_buffer_list, list,
+ /* list elements can't go away. */ 1) {
+ if (ptr->trimmed_entries == ptr->nr_entries)
+ ptr->trimmed_entries = trim_netdev_trace(ptr->entries, ptr->nr_entries);
+ }
+ /* Merge duplicated entries using trimmed_entries field. */
+ list_for_each_entry_rcu(ptr, &dev->netdev_trace_buffer_list, list,
+ /* list elements can't go away. */ 1) {
+ /* Skip empty entries. */
+ if (!atomic_read(&ptr->count))
+ continue;
+ tmp = ptr;
+ list_for_each_entry_continue_rcu(tmp, &dev->netdev_trace_buffer_list, list) {
+ if (ptr->trimmed_entries != tmp->trimmed_entries ||
+ memcmp(ptr->entries, tmp->entries,
+ ptr->trimmed_entries * sizeof(unsigned long)))
+ continue;
+ /* Skip empty entries. */
+ count = atomic_read(&tmp->count);
+ if (!count)
+ continue;
+ /* Move count from non-first entry to first entry. */
+ atomic_add(count, &ptr->count);
+ atomic_sub(count, &tmp->count);
+ }
+ /* It is safe to call cond_resched() because this function is
+ * called from schedulable context.
+ */
+ cond_resched();
+ }
+ /* Report all entries for this device. */
+ list_for_each_entry_rcu(ptr, &dev->netdev_trace_buffer_list, list,
+ /* list elements can't go away. */ 1) {
+ /* Skip empty entries. */
+ count = atomic_read(&ptr->count);
+ if (!count)
+ continue;
+ /* Report this entry. It is safe to call cond_resched() because
+ * this function is called from schedulable context.
+ */
+ pos++;
+ balance += count;
+ pr_info("Call trace for %s[%d] %+d at\n", dev->name, pos, count);
+ stack_trace_print(ptr->entries, ptr->trimmed_entries, 4);
+ cond_resched();
+ }
+ if (!netdev_trace_buffer_exhausted)
+ pr_info("balance as of %s[%d] is %d\n", dev->name, pos, balance);
+}
+
+static void erase_netdev_trace_buffer(const struct net_device *dev)
+{
+ struct netdev_trace_buffer *ptr;
+ unsigned long flags;
+
+ /* This function is called after free_percpu(dev->pcpu_refcnt) was already
+ * called, which means that no more __dev_put()/__dev_hold() call can be made.
+ * Therefore, no more save_netdev_trace_buffer() call will be made, and we can
+ * safely return list elements to netdev_trace_buffer_list.
+ */
+ raw_spin_lock_irqsave(&netdev_trace_buffer_lock, flags);
+ while (!list_empty(&dev->netdev_trace_buffer_list)) {
+ ptr = list_first_entry(&dev->netdev_trace_buffer_list, typeof(*ptr), list);
+ list_del(&ptr->list);
+ list_add_tail(&ptr->list, &netdev_trace_buffer_list);
+ }
+ raw_spin_unlock_irqrestore(&netdev_trace_buffer_lock, flags);
+}
+
+void save_netdev_trace_buffer(struct net_device *dev, int delta)
+{
+ struct netdev_trace_buffer *ptr;
+ unsigned long entries[ARRAY_SIZE(ptr->entries)];
+ int nr_entries;
+ unsigned long flags;
+
+ /* This function is not NMI-safe. Give up if called from NMI context. */
+ if (in_nmi())
+ return;
+ /* Get stack traces. */
+ nr_entries = stack_trace_save(entries, ARRAY_SIZE(ptr->entries), 1);
+ /* Trim traces of process context now if called from softirq context, for
+ * we will easily exhaust netdev_trace_buffer_list if we don't trim traces
+ * of process context when trying to compare with existing entries.
+ *
+ * Avoid kallsyms lookup, by using cached address resolved upon boot.
+ */
+ if (in_softirq()) {
+ int i;
+
+ for (i = 0; i < nr_entries; i++) {
+ if (entries[i] >= start_of_handle_softirqs &&
+ entries[i] < end_of_handle_softirqs) {
+ nr_entries = i + 1;
+ break;
+ }
+ }
+ }
+ /* Compare with existing entries at best-effort basis. Since duplicated entries
+ * created by race condition will be merged when reporting, we don't use lock here.
+ */
+ list_for_each_entry_rcu(ptr, &dev->netdev_trace_buffer_list, list,
+ /* list elements can't go away. */ 1) {
+ if (ptr->nr_entries == nr_entries &&
+ !memcmp(ptr->entries, entries, nr_entries * sizeof(unsigned long))) {
+ atomic_add(delta, &ptr->count);
+ return;
+ }
+ }
+ /* Add a new entry. We don't re-compare with existing entries with lock held, for
+ * duplicated entries created by race condition will be merged when reporting.
+ * But we use raw spinlock here in case this function is called with some other
+ * raw spinlock already held.
+ */
+ raw_spin_lock_irqsave(&netdev_trace_buffer_lock, flags);
+ if (!list_empty(&netdev_trace_buffer_list)) {
+ /* Remove one entry from netdev_trace_buffer_list and initialize it. */
+ ptr = list_first_entry(&netdev_trace_buffer_list, typeof(*ptr), list);
+ list_del(&ptr->list);
+ atomic_set(&ptr->count, delta);
+ ptr->nr_entries = nr_entries;
+ ptr->trimmed_entries = nr_entries;
+ memmove(ptr->entries, entries, nr_entries * sizeof(unsigned long));
+ /* Append it in RCU manner, for readers are lockless. */
+ list_add_tail_rcu(&ptr->list, &dev->netdev_trace_buffer_list);
+ } else {
+ netdev_trace_buffer_exhausted = true;
+ }
+ raw_spin_unlock_irqrestore(&netdev_trace_buffer_lock, flags);
+}
+EXPORT_SYMBOL(save_netdev_trace_buffer);
+
+struct timer_completion_struct {
+ struct timer_list timer;
+ struct completion completion;
+};
+
+/* Resolve address of handle_softirqs() and cache it, in order to avoid looking up
+ * kallsyms every time.
+ */
+static void __init netdev_addr_resolve_func(struct timer_list *timer)
+{
+ unsigned long entries[40];
+ int nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
+ char buffer[KSYM_SYMBOL_LEN] = { };
+ unsigned long offset, size;
+ char *cp;
+ int i;
+
+ for (i = 0; i < nr_entries; i++) {
+ sprint_symbol(buffer, entries[i]);
+ if (strncmp(buffer, "handle_softirqs", 15))
+ continue;
+ cp = strchr(buffer, '+');
+ if (!cp || sscanf(cp, "+%lx/%lx", &offset, &size) != 2)
+ continue;
+ start_of_handle_softirqs = entries[i] - offset;
+ end_of_handle_softirqs = start_of_handle_softirqs + size;
+ break;
+ }
+ complete(&container_of(timer, struct timer_completion_struct, timer)->completion);
+}
+
+static void __init net_dev_refcnt_tracker_init(void)
+{
+ struct timer_completion_struct tc;
+
+ timer_setup_on_stack(&tc.timer, netdev_addr_resolve_func, 0);
+ init_completion(&tc.completion);
+ /* Schedule a call to netdev_addr_resolve_func(). */
+ mod_timer(&tc.timer, jiffies);
+ /* Wait for netdev_addr_resolve_func() to be called. */
+ wait_for_completion(&tc.completion);
+ /* Wait for netdev_addr_resolve_func() to complete. */
+ timer_delete_sync(&tc.timer);
+ timer_destroy_on_stack(&tc.timer);
+}
+
+#endif
diff --git a/net/socket.c b/net/socket.c
index c05d86e63abf..b3ddcc283cbb 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -723,7 +723,11 @@ struct socket *sock_alloc(void)
}
EXPORT_SYMBOL(sock_alloc);
-static void __sock_release(struct socket *sock, struct inode *inode)
+static
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+noinline
+#endif
+void __sock_release(struct socket *sock, struct inode *inode)
{
const struct proto_ops *ops = READ_ONCE(sock->ops);
@@ -795,7 +799,13 @@ static noinline void call_trace_sock_send_length(struct sock *sk, int ret,
trace_sock_send_length(sk, ret, 0);
}
-static inline int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
+static
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+noinline
+#else
+inline
+#endif
+int sock_sendmsg_nosec(struct socket *sock, struct msghdr *msg)
{
int ret = INDIRECT_CALL_INET(READ_ONCE(sock->ops)->sendmsg, inet6_sendmsg,
inet_sendmsg, sock, msg,
@@ -1145,8 +1155,13 @@ static noinline void call_trace_sock_recv_length(struct sock *sk, int ret, int f
trace_sock_recv_length(sk, ret, flags);
}
-static inline int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg,
- int flags)
+static
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+noinline
+#else
+inline
+#endif
+int sock_recvmsg_nosec(struct socket *sock, struct msghdr *msg, int flags)
{
int ret = INDIRECT_CALL_INET(READ_ONCE(sock->ops)->recvmsg,
inet6_recvmsg,
@@ -2653,9 +2668,12 @@ static int copy_msghdr_from_user(struct msghdr *kmsg,
return err < 0 ? err : 0;
}
-static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys,
- unsigned int flags, struct used_address *used_address,
- unsigned int allowed_msghdr_flags)
+static
+#if defined(CONFIG_NET_DEV_REFCNT_TRACKER) && defined(CONFIG_KALLSYMS)
+noinline
+#endif
+int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys, unsigned int flags,
+ struct used_address *used_address, unsigned int allowed_msghdr_flags)
{
unsigned char ctl[sizeof(struct cmsghdr) + 20]
__aligned(sizeof(__kernel_size_t));
--
2.52.0
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2026-09-15 12:29 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-10 20:18 [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
2026-05-14 1:51 ` Forwarded: [syzbot] test patch for unregister_netdevice syzbot
2026-05-14 2:08 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
2026-05-14 2:36 ` syzbot
2026-05-14 4:02 ` syzbot
2026-05-14 6:48 ` Forwarded: [syzbot] test net main baseline syzbot
2026-05-14 8:24 ` Forwarded: [syzbot] test [PATCH net v2] ipv6: addrconf: skip autoconf on unregistering devices syzbot
2026-05-14 11:12 ` Forwarded: [syzbot] test WARN_ON for addrconf " syzbot
2026-05-14 11:58 ` Forwarded: [syzbot] test baseline for unregister_netdevice ref leak syzbot
2026-09-15 12:14 ` [syzbot] [net?] unregister_netdevice: waiting for DEV to become free (9) syzbot
2026-09-15 12:29 ` Forwarded: " syzbot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®