* [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®