Skip to content

Commit

Permalink
devlink: convert linecard nested devlink to new rel infrastructure
Browse files Browse the repository at this point in the history
Benefit from the newly introduced rel infrastructure, treat the linecard
nested devlink instances in the same way as port function instances.
Convert the code to use the rel infrastructure.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jiri Pirko authored and David S. Miller committed Sep 17, 2023
1 parent ac5f395 commit 9473bc0
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 18 deletions.
9 changes: 6 additions & 3 deletions drivers/net/ethernet/mellanox/mlxsw/core_linecard_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ static int mlxsw_linecard_bdev_probe(struct auxiliary_device *adev,
struct mlxsw_linecard *linecard = linecard_bdev->linecard;
struct mlxsw_linecard_dev *linecard_dev;
struct devlink *devlink;
int err;

devlink = devlink_alloc(&mlxsw_linecard_dev_devlink_ops,
sizeof(*linecard_dev), &adev->dev);
Expand All @@ -141,8 +142,12 @@ static int mlxsw_linecard_bdev_probe(struct auxiliary_device *adev,
linecard_dev->linecard = linecard_bdev->linecard;
linecard_bdev->linecard_dev = linecard_dev;

err = devlink_linecard_nested_dl_set(linecard->devlink_linecard, devlink);
if (err) {
devlink_free(devlink);
return err;
}
devlink_register(devlink);
devlink_linecard_nested_dl_set(linecard->devlink_linecard, devlink);
return 0;
}

Expand All @@ -151,9 +156,7 @@ static void mlxsw_linecard_bdev_remove(struct auxiliary_device *adev)
struct mlxsw_linecard_bdev *linecard_bdev =
container_of(adev, struct mlxsw_linecard_bdev, adev);
struct devlink *devlink = priv_to_devlink(linecard_bdev->linecard_dev);
struct mlxsw_linecard *linecard = linecard_bdev->linecard;

devlink_linecard_nested_dl_set(linecard->devlink_linecard, NULL);
devlink_unregister(devlink);
devlink_free(devlink);
}
Expand Down
4 changes: 2 additions & 2 deletions include/net/devlink.h
Original file line number Diff line number Diff line change
Expand Up @@ -1720,8 +1720,8 @@ void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
void devlink_linecard_activate(struct devlink_linecard *linecard);
void devlink_linecard_deactivate(struct devlink_linecard *linecard);
void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
struct devlink *nested_devlink);
int devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
struct devlink *nested_devlink);
int devl_sb_register(struct devlink *devlink, unsigned int sb_index,
u32 size, u16 ingress_pools_count,
u16 egress_pools_count, u16 ingress_tc_count,
Expand Down
47 changes: 34 additions & 13 deletions net/devlink/linecard.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ struct devlink_linecard {
const char *type;
struct devlink_linecard_type *types;
unsigned int types_count;
struct devlink *nested_devlink;
u32 rel_index;
};

unsigned int devlink_linecard_index(struct devlink_linecard *linecard)
Expand Down Expand Up @@ -112,10 +112,10 @@ static int devlink_nl_linecard_fill(struct sk_buff *msg,
nla_nest_end(msg, attr);
}

if (linecard->nested_devlink &&
devlink_nl_put_nested_handle(msg, devlink_net(devlink),
linecard->nested_devlink,
DEVLINK_ATTR_NESTED_DEVLINK))
if (devlink_rel_devlink_handle_put(msg, devlink,
linecard->rel_index,
DEVLINK_ATTR_NESTED_DEVLINK,
NULL))
goto nla_put_failure;

genlmsg_end(msg, hdr);
Expand Down Expand Up @@ -524,7 +524,6 @@ EXPORT_SYMBOL_GPL(devlink_linecard_provision_set);
void devlink_linecard_provision_clear(struct devlink_linecard *linecard)
{
mutex_lock(&linecard->state_lock);
WARN_ON(linecard->nested_devlink);
linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED;
linecard->type = NULL;
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
Expand All @@ -543,7 +542,6 @@ EXPORT_SYMBOL_GPL(devlink_linecard_provision_clear);
void devlink_linecard_provision_fail(struct devlink_linecard *linecard)
{
mutex_lock(&linecard->state_lock);
WARN_ON(linecard->nested_devlink);
linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING_FAILED;
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
mutex_unlock(&linecard->state_lock);
Expand Down Expand Up @@ -591,19 +589,42 @@ void devlink_linecard_deactivate(struct devlink_linecard *linecard)
}
EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);

static void devlink_linecard_rel_notify_cb(struct devlink *devlink,
u32 linecard_index)
{
struct devlink_linecard *linecard;

linecard = devlink_linecard_get_by_index(devlink, linecard_index);
if (!linecard)
return;
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
}

static void devlink_linecard_rel_cleanup_cb(struct devlink *devlink,
u32 linecard_index, u32 rel_index)
{
struct devlink_linecard *linecard;

linecard = devlink_linecard_get_by_index(devlink, linecard_index);
if (linecard && linecard->rel_index == rel_index)
linecard->rel_index = 0;
}

/**
* devlink_linecard_nested_dl_set - Attach/detach nested devlink
* instance to linecard.
*
* @linecard: devlink linecard
* @nested_devlink: devlink instance to attach or NULL to detach
*/
void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
struct devlink *nested_devlink)
int devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
struct devlink *nested_devlink)
{
mutex_lock(&linecard->state_lock);
linecard->nested_devlink = nested_devlink;
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
mutex_unlock(&linecard->state_lock);
return devlink_rel_nested_in_add(&linecard->rel_index,
linecard->devlink->index,
linecard->index,
devlink_linecard_rel_notify_cb,
devlink_linecard_rel_cleanup_cb,
nested_devlink);
}
EXPORT_SYMBOL_GPL(devlink_linecard_nested_dl_set);

0 comments on commit 9473bc0

Please sign in to comment.