* [PATCH net] can: j1939: use netdevice_tracker for j1939_priv tracking
@ 2026-05-17 12:17 Tetsuo Handa
2026-05-19 1:21 ` [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking Tetsuo Handa
0 siblings, 1 reply; 5+ messages in thread
From: Tetsuo Handa @ 2026-05-17 12:17 UTC (permalink / raw)
To: Robin van der Gracht, Oleksij Rempel, kernel, Oliver Hartkopp,
Marc Kleine-Budde, linux-can, Network Development
syzbot is still reporting
unregister_netdevice: waiting for vcan0 to become free. Usage count = 2
problem. A debug printk() patch in linux-next-20260508 identified that
there is dev_hold()/dev_put() imbalance in j1939_priv management.
Call trace for vcan0[26] +4 at
__dev_hold include/linux/netdevice.h:4470 [inline]
netdev_hold include/linux/netdevice.h:4513 [inline]
dev_hold include/linux/netdevice.h:4536 [inline]
j1939_priv_create net/can/j1939/main.c:140 [inline]
j1939_netdev_start+0x36b/0xc10 net/can/j1939/main.c:268
j1939_sk_bind+0x853/0xb30 net/can/j1939/socket.c:506
__sys_bind_socket net/socket.c:1948 [inline]
__sys_bind+0x2e9/0x410 net/socket.c:1979
Call trace for vcan0[28] -3 at
__dev_put include/linux/netdevice.h:4456 [inline]
netdev_put include/linux/netdevice.h:4523 [inline]
dev_put include/linux/netdevice.h:4548 [inline]
__j1939_priv_release net/can/j1939/main.c:166 [inline]
kref_put include/linux/kref.h:65 [inline]
j1939_priv_put+0x128/0x270 net/can/j1939/main.c:172
j1939_sk_sock_destruct+0x52/0x90 net/can/j1939/socket.c:388
__sk_destruct+0x8d/0x9d0 net/core/sock.c:2352
rcu_do_batch kernel/rcu/tree.c:2617 [inline]
rcu_core kernel/rcu/tree.c:2869 [inline]
rcu_cpu_kthread+0x99e/0x1470 kernel/rcu/tree.c:2957
smpboot_thread_fn+0x541/0xa50 kernel/smpboot.c:160
kthread+0x388/0x470 kernel/kthread.c:436
ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158
ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245
For further investigation using upstream kernels, enable netdevice_tracker
in j1939_priv management.
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
---
net/can/j1939/j1939-priv.h | 1 +
net/can/j1939/main.c | 8 ++++----
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/net/can/j1939/j1939-priv.h b/net/can/j1939/j1939-priv.h
index 81f58924b4ac..e92beb24b50b 100644
--- a/net/can/j1939/j1939-priv.h
+++ b/net/can/j1939/j1939-priv.h
@@ -60,6 +60,7 @@ struct j1939_priv {
rwlock_t lock;
struct net_device *ndev;
+ netdevice_tracker dev_tracker;
/* list of 256 ecu ptrs, that cache the claimed addresses.
* also protected by the above lock
diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c
index 9937c04241bc..5e5e6c228f22 100644
--- a/net/can/j1939/main.c
+++ b/net/can/j1939/main.c
@@ -137,7 +137,7 @@ static struct j1939_priv *j1939_priv_create(struct net_device *ndev)
priv->ndev = ndev;
kref_init(&priv->kref);
kref_init(&priv->rx_kref);
- dev_hold(ndev);
+ netdev_hold(ndev, &priv->dev_tracker, GFP_KERNEL);
netdev_dbg(priv->ndev, "%s : 0x%p\n", __func__, priv);
@@ -163,7 +163,7 @@ static void __j1939_priv_release(struct kref *kref)
WARN_ON_ONCE(!list_empty(&priv->ecus));
WARN_ON_ONCE(!list_empty(&priv->j1939_socks));
- dev_put(ndev);
+ netdev_put(ndev, &priv->dev_tracker);
kfree(priv);
}
@@ -281,7 +281,7 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev)
*/
kref_get(&priv_new->rx_kref);
mutex_unlock(&j1939_netdev_lock);
- dev_put(ndev);
+ netdev_put(ndev, &priv->dev_tracker);
kfree(priv);
return priv_new;
}
@@ -298,7 +298,7 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev)
j1939_priv_set(ndev, NULL);
mutex_unlock(&j1939_netdev_lock);
- dev_put(ndev);
+ netdev_put(ndev, &priv->dev_tracker);
kfree(priv);
return ERR_PTR(ret);
--
2.54.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking 2026-05-17 12:17 [PATCH net] can: j1939: use netdevice_tracker for j1939_priv tracking Tetsuo Handa @ 2026-05-19 1:21 ` Tetsuo Handa 2026-05-19 2:04 ` Jakub Kicinski 0 siblings, 1 reply; 5+ messages in thread From: Tetsuo Handa @ 2026-05-19 1:21 UTC (permalink / raw) To: Robin van der Gracht, Oleksij Rempel, kernel, Oliver Hartkopp, Marc Kleine-Budde, linux-can, Network Development syzbot is still reporting unregister_netdevice: waiting for vcan0 to become free. Usage count = 2 problem. A debug printk() patch in linux-next-20260508 identified that there is dev_hold()/dev_put() imbalance in j1939_priv management. Call trace for vcan0[26] +4 at __dev_hold include/linux/netdevice.h:4470 [inline] netdev_hold include/linux/netdevice.h:4513 [inline] dev_hold include/linux/netdevice.h:4536 [inline] j1939_priv_create net/can/j1939/main.c:140 [inline] j1939_netdev_start+0x36b/0xc10 net/can/j1939/main.c:268 j1939_sk_bind+0x853/0xb30 net/can/j1939/socket.c:506 __sys_bind_socket net/socket.c:1948 [inline] __sys_bind+0x2e9/0x410 net/socket.c:1979 Call trace for vcan0[28] -3 at __dev_put include/linux/netdevice.h:4456 [inline] netdev_put include/linux/netdevice.h:4523 [inline] dev_put include/linux/netdevice.h:4548 [inline] __j1939_priv_release net/can/j1939/main.c:166 [inline] kref_put include/linux/kref.h:65 [inline] j1939_priv_put+0x128/0x270 net/can/j1939/main.c:172 j1939_sk_sock_destruct+0x52/0x90 net/can/j1939/socket.c:388 __sk_destruct+0x8d/0x9d0 net/core/sock.c:2352 rcu_do_batch kernel/rcu/tree.c:2617 [inline] rcu_core kernel/rcu/tree.c:2869 [inline] rcu_cpu_kthread+0x99e/0x1470 kernel/rcu/tree.c:2957 smpboot_thread_fn+0x541/0xa50 kernel/smpboot.c:160 kthread+0x388/0x470 kernel/kthread.c:436 ret_from_fork+0x514/0xb70 arch/x86/kernel/process.c:158 ret_from_fork_asm+0x1a/0x30 arch/x86/entry/entry_64.S:245 This refcount leak in j1939_priv might be caused by a refcount leak in j1939_{session,ecu} because j1939_{session,ecu} holds a ref on j1939_priv. For further investigation using upstream kernels, enable netdevice_tracker in j1939_{priv,session,ecu} management. Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp> --- net/can/j1939/bus.c | 2 ++ net/can/j1939/j1939-priv.h | 3 +++ net/can/j1939/main.c | 8 ++++---- net/can/j1939/transport.c | 2 ++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/net/can/j1939/bus.c b/net/can/j1939/bus.c index dc374286eeb6..cdc3c0a71937 100644 --- a/net/can/j1939/bus.c +++ b/net/can/j1939/bus.c @@ -20,6 +20,7 @@ static void __j1939_ecu_release(struct kref *kref) struct j1939_priv *priv = ecu->priv; list_del(&ecu->list); + netdev_put(priv->ndev, &ecu->priv_dev_tracker); kfree(ecu); j1939_priv_put(priv); } @@ -155,6 +156,7 @@ struct j1939_ecu *j1939_ecu_create_locked(struct j1939_priv *priv, name_t name) if (!ecu) return ERR_PTR(-ENOMEM); kref_init(&ecu->kref); + netdev_hold(priv->ndev, &ecu->priv_dev_tracker, gfp_any()); ecu->addr = J1939_IDLE_ADDR; ecu->name = name; diff --git a/net/can/j1939/j1939-priv.h b/net/can/j1939/j1939-priv.h index 81f58924b4ac..cf26352d1d8c 100644 --- a/net/can/j1939/j1939-priv.h +++ b/net/can/j1939/j1939-priv.h @@ -38,6 +38,7 @@ struct j1939_ecu { struct hrtimer ac_timer; struct kref kref; struct j1939_priv *priv; + netdevice_tracker priv_dev_tracker; /* count users, to help transport protocol decide for interaction */ int nusers; @@ -60,6 +61,7 @@ struct j1939_priv { rwlock_t lock; struct net_device *ndev; + netdevice_tracker dev_tracker; /* list of 256 ecu ptrs, that cache the claimed addresses. * also protected by the above lock @@ -230,6 +232,7 @@ enum j1939_session_state { struct j1939_session { struct j1939_priv *priv; + netdevice_tracker priv_dev_tracker; struct list_head active_session_list_entry; struct list_head sk_session_queue_entry; struct kref kref; diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c index 9937c04241bc..5e5e6c228f22 100644 --- a/net/can/j1939/main.c +++ b/net/can/j1939/main.c @@ -137,7 +137,7 @@ static struct j1939_priv *j1939_priv_create(struct net_device *ndev) priv->ndev = ndev; kref_init(&priv->kref); kref_init(&priv->rx_kref); - dev_hold(ndev); + netdev_hold(ndev, &priv->dev_tracker, GFP_KERNEL); netdev_dbg(priv->ndev, "%s : 0x%p\n", __func__, priv); @@ -163,7 +163,7 @@ static void __j1939_priv_release(struct kref *kref) WARN_ON_ONCE(!list_empty(&priv->ecus)); WARN_ON_ONCE(!list_empty(&priv->j1939_socks)); - dev_put(ndev); + netdev_put(ndev, &priv->dev_tracker); kfree(priv); } @@ -281,7 +281,7 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev) */ kref_get(&priv_new->rx_kref); mutex_unlock(&j1939_netdev_lock); - dev_put(ndev); + netdev_put(ndev, &priv->dev_tracker); kfree(priv); return priv_new; } @@ -298,7 +298,7 @@ struct j1939_priv *j1939_netdev_start(struct net_device *ndev) j1939_priv_set(ndev, NULL); mutex_unlock(&j1939_netdev_lock); - dev_put(ndev); + netdev_put(ndev, &priv->dev_tracker); kfree(priv); return ERR_PTR(ret); diff --git a/net/can/j1939/transport.c b/net/can/j1939/transport.c index df93d57907da..158433511552 100644 --- a/net/can/j1939/transport.c +++ b/net/can/j1939/transport.c @@ -283,6 +283,7 @@ static void j1939_session_destroy(struct j1939_session *session) kfree_skb(skb); } __j1939_session_drop(session); + netdev_put(session->priv->ndev, &session->priv_dev_tracker); j1939_priv_put(session->priv); kfree(session); } @@ -1515,6 +1516,7 @@ static struct j1939_session *j1939_session_new(struct j1939_priv *priv, INIT_LIST_HEAD(&session->active_session_list_entry); INIT_LIST_HEAD(&session->sk_session_queue_entry); kref_init(&session->kref); + netdev_hold(priv->ndev, &session->priv_dev_tracker, gfp_any()); j1939_priv_get(priv); session->priv = priv; -- 2.54.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking 2026-05-19 1:21 ` [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking Tetsuo Handa @ 2026-05-19 2:04 ` Jakub Kicinski 2026-05-19 2:22 ` Tetsuo Handa 0 siblings, 1 reply; 5+ messages in thread From: Jakub Kicinski @ 2026-05-19 2:04 UTC (permalink / raw) To: Tetsuo Handa Cc: Robin van der Gracht, Oleksij Rempel, kernel, Oliver Hartkopp, Marc Kleine-Budde, linux-can, Network Development On Tue, 19 May 2026 10:21:32 +0900 Tetsuo Handa wrote: > net/can/j1939/bus.c | 2 ++ > net/can/j1939/j1939-priv.h | 3 +++ > net/can/j1939/main.c | 8 ++++---- > net/can/j1939/transport.c | 2 ++ Please follow the address list that get_maintainer produces for you. netdev@ is flooded by AI patches already we really don't need more. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking 2026-05-19 2:04 ` Jakub Kicinski @ 2026-05-19 2:22 ` Tetsuo Handa 2026-05-19 23:11 ` Jakub Kicinski 0 siblings, 1 reply; 5+ messages in thread From: Tetsuo Handa @ 2026-05-19 2:22 UTC (permalink / raw) To: Jakub Kicinski Cc: Robin van der Gracht, Oleksij Rempel, kernel, Oliver Hartkopp, Marc Kleine-Budde, linux-can, Network Development On 2026/05/19 11:04, Jakub Kicinski wrote: > On Tue, 19 May 2026 10:21:32 +0900 Tetsuo Handa wrote: >> net/can/j1939/bus.c | 2 ++ >> net/can/j1939/j1939-priv.h | 3 +++ >> net/can/j1939/main.c | 8 ++++---- >> net/can/j1939/transport.c | 2 ++ > > Please follow the address list that get_maintainer produces for you. > netdev@ is flooded by AI patches already we really don't need more. scripts/get_maintainer.pl produced the following output. Robin van der Gracht <robin@protonic.nl> (maintainer:CAN-J1939 NETWORK LAYER) Oleksij Rempel <o.rempel@pengutronix.de> (maintainer:CAN-J1939 NETWORK LAYER) kernel@pengutronix.de (reviewer:CAN-J1939 NETWORK LAYER) Oliver Hartkopp <socketcan@hartkopp.net> (maintainer:CAN NETWORK LAYER) Marc Kleine-Budde <mkl@pengutronix.de> (maintainer:CAN NETWORK LAYER) linux-can@vger.kernel.org (open list:CAN-J1939 NETWORK LAYER) linux-kernel@vger.kernel.org (open list) Do you mean that I should omit netdev@vger.kernel.org , and use "[PATCH v2]" so that automated process won't be involved before CAN maintainers send this patch to netdev@vger.kernel.org ? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking 2026-05-19 2:22 ` Tetsuo Handa @ 2026-05-19 23:11 ` Jakub Kicinski 0 siblings, 0 replies; 5+ messages in thread From: Jakub Kicinski @ 2026-05-19 23:11 UTC (permalink / raw) To: Tetsuo Handa Cc: Robin van der Gracht, Oleksij Rempel, kernel, Oliver Hartkopp, Marc Kleine-Budde, linux-can, Network Development On Tue, 19 May 2026 11:22:44 +0900 Tetsuo Handa wrote: > Do you mean that I should omit netdev@vger.kernel.org , and use "[PATCH v2]" > so that automated process won't be involved before CAN maintainers send this > patch to netdev@vger.kernel.org ? Yessir ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-05-19 23:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-17 12:17 [PATCH net] can: j1939: use netdevice_tracker for j1939_priv tracking Tetsuo Handa
2026-05-19 1:21 ` [PATCH net v2] can: j1939: use netdevice_tracker for j1939_{priv,session,ecu} tracking Tetsuo Handa
2026-05-19 2:04 ` Jakub Kicinski
2026-05-19 2:22 ` Tetsuo Handa
2026-05-19 23:11 ` Jakub Kicinski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox