devlink: Add a helper for getting a nested-in instance

Upcoming code will need to obtain references to locked nested-in
devlink instances. Add a helper to lock, reference and return the
nested-in instance.

Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260701073254.754518-3-tariqt@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Cosmin Ratiu 2026-07-01 10:32:42 +03:00 committed by Paolo Abeni
parent 3bf4c5970c
commit 9f2d908cc3
2 changed files with 20 additions and 0 deletions

View File

@ -67,6 +67,22 @@ static void __devlink_rel_put(struct devlink_rel *rel)
devlink_rel_free(rel);
}
struct devlink *__must_check devlink_nested_in_get_lock(struct devlink *devlink)
{
devl_assert_locked(devlink);
if (!devlink->rel)
return NULL;
devlink = devlinks_xa_get(devlink->rel->nested_in.devlink_index);
if (!devlink)
return NULL;
devl_lock(devlink);
if (devl_is_registered(devlink))
return devlink;
devl_unlock(devlink);
devlink_put(devlink);
return NULL;
}
static void devlink_rel_nested_in_notify_work(struct work_struct *work)
{
struct devlink_rel *rel = container_of(work, struct devlink_rel,

View File

@ -136,6 +136,10 @@ typedef void devlink_rel_notify_cb_t(struct devlink *devlink, u32 obj_index);
typedef void devlink_rel_cleanup_cb_t(struct devlink *devlink, u32 obj_index,
u32 rel_index);
/* Returns the locked+referenced nested-in instance or NULL. */
struct devlink *__must_check
devlink_nested_in_get_lock(struct devlink *devlink);
void devlink_rel_nested_in_clear(u32 rel_index);
int devlink_rel_nested_in_add(u32 *rel_index, u32 devlink_index,
u32 obj_index, devlink_rel_notify_cb_t *notify_cb,