net/devlink/core.c | 2 ++ 1 file changed, 2 insertions(+)
devlink relation state is normally released from devl_unregister(), which
calls devlink_rel_put(). This misses devlink instances that get a nested
relation before registration and then fail probe before devl_register() is
reached.
That flow can happen for SFs. The child devlink gets linked to its
parent before registration, then a later probe error calls devlink_free()
directly. Since the instance was never registered, devl_unregister() is not
called and devlink->rel is leaked.
Release any pending relation from devlink_free() as well. The registered
path is unchanged because devl_unregister() already clears devlink->rel
before devlink_free() runs.
Fixes: c137743bce02 ("devlink: introduce object and nested devlink relationship infra")
Signed-off-by: Mark Bloch <mbloch@nvidia.com>
---
net/devlink/core.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/devlink/core.c b/net/devlink/core.c
index eeb6a71f5f56..fe9f6a0a67d5 100644
--- a/net/devlink/core.c
+++ b/net/devlink/core.c
@@ -518,6 +518,8 @@ void devlink_free(struct devlink *devlink)
{
ASSERT_DEVLINK_NOT_REGISTERED(devlink);
+ devlink_rel_put(devlink);
+
WARN_ON(!list_empty(&devlink->trap_policer_list));
WARN_ON(!list_empty(&devlink->trap_group_list));
WARN_ON(!list_empty(&devlink->trap_list));
base-commit: 8d26955ea5a4697c1e21a3869ceb36b90389b051
--
2.34.1
Thu, May 28, 2026 at 09:14:10PM +0200, mbloch@nvidia.com wrote:
>devlink relation state is normally released from devl_unregister(), which
>calls devlink_rel_put(). This misses devlink instances that get a nested
>relation before registration and then fail probe before devl_register() is
>reached.
>
>That flow can happen for SFs. The child devlink gets linked to its
>parent before registration, then a later probe error calls devlink_free()
>directly. Since the instance was never registered, devl_unregister() is not
>called and devlink->rel is leaked.
>
>Release any pending relation from devlink_free() as well. The registered
>path is unchanged because devl_unregister() already clears devlink->rel
>before devlink_free() runs.
>
>Fixes: c137743bce02 ("devlink: introduce object and nested devlink relationship infra")
>Signed-off-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
© 2016 - 2026 Red Hat, Inc.