devlink: remove linecards lock
Similar to other devlink objects, convert the linecards list to be protected by devlink instance lock. Alongside with that rename the create/destroy() functions to devl_* to indicate the devlink instance lock needs to be held while calling them. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
854617f52a
commit
5cc9049cb9
|
@ -1259,9 +1259,9 @@ static int mlxsw_linecard_init(struct mlxsw_core *mlxsw_core,
|
|||
linecard->linecards = linecards;
|
||||
mutex_init(&linecard->lock);
|
||||
|
||||
devlink_linecard = devlink_linecard_create(priv_to_devlink(mlxsw_core),
|
||||
slot_index, &mlxsw_linecard_ops,
|
||||
linecard);
|
||||
devlink_linecard = devl_linecard_create(priv_to_devlink(mlxsw_core),
|
||||
slot_index, &mlxsw_linecard_ops,
|
||||
linecard);
|
||||
if (IS_ERR(devlink_linecard))
|
||||
return PTR_ERR(devlink_linecard);
|
||||
|
||||
|
@ -1285,7 +1285,7 @@ static void mlxsw_linecard_fini(struct mlxsw_core *mlxsw_core,
|
|||
if (linecard->active)
|
||||
mlxsw_linecard_active_clear(linecard);
|
||||
mlxsw_linecard_bdev_del(linecard);
|
||||
devlink_linecard_destroy(linecard->devlink_linecard);
|
||||
devl_linecard_destroy(linecard->devlink_linecard);
|
||||
mutex_destroy(&linecard->lock);
|
||||
}
|
||||
|
||||
|
|
|
@ -1687,9 +1687,9 @@ void devl_rate_nodes_destroy(struct devlink *devlink);
|
|||
void devlink_port_linecard_set(struct devlink_port *devlink_port,
|
||||
struct devlink_linecard *linecard);
|
||||
struct devlink_linecard *
|
||||
devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
||||
const struct devlink_linecard_ops *ops, void *priv);
|
||||
void devlink_linecard_destroy(struct devlink_linecard *linecard);
|
||||
devl_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
||||
const struct devlink_linecard_ops *ops, void *priv);
|
||||
void devl_linecard_destroy(struct devlink_linecard *linecard);
|
||||
void devlink_linecard_provision_set(struct devlink_linecard *linecard,
|
||||
const char *type);
|
||||
void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
|
||||
|
|
|
@ -247,7 +247,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
|
|||
mutex_init(&devlink->lock);
|
||||
lockdep_set_class(&devlink->lock, &devlink->lock_key);
|
||||
mutex_init(&devlink->reporters_lock);
|
||||
mutex_init(&devlink->linecards_lock);
|
||||
refcount_set(&devlink->refcount, 1);
|
||||
|
||||
return devlink;
|
||||
|
@ -269,7 +268,6 @@ void devlink_free(struct devlink *devlink)
|
|||
{
|
||||
ASSERT_DEVLINK_NOT_REGISTERED(devlink);
|
||||
|
||||
mutex_destroy(&devlink->linecards_lock);
|
||||
mutex_destroy(&devlink->reporters_lock);
|
||||
WARN_ON(!list_empty(&devlink->trap_policer_list));
|
||||
WARN_ON(!list_empty(&devlink->trap_group_list));
|
||||
|
|
|
@ -38,7 +38,6 @@ struct devlink {
|
|||
struct list_head trap_group_list;
|
||||
struct list_head trap_policer_list;
|
||||
struct list_head linecard_list;
|
||||
struct mutex linecards_lock; /* protects linecard_list */
|
||||
const struct devlink_ops *ops;
|
||||
u64 features;
|
||||
struct xarray snapshot_ids;
|
||||
|
|
|
@ -282,13 +282,10 @@ devlink_linecard_get_from_attrs(struct devlink *devlink, struct nlattr **attrs)
|
|||
u32 linecard_index = nla_get_u32(attrs[DEVLINK_ATTR_LINECARD_INDEX]);
|
||||
struct devlink_linecard *linecard;
|
||||
|
||||
mutex_lock(&devlink->linecards_lock);
|
||||
linecard = devlink_linecard_get_by_index(devlink, linecard_index);
|
||||
if (linecard)
|
||||
refcount_inc(&linecard->refcount);
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
if (!linecard)
|
||||
return ERR_PTR(-ENODEV);
|
||||
refcount_inc(&linecard->refcount);
|
||||
return linecard;
|
||||
}
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
@ -2129,7 +2126,7 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
|
|||
devlink_dump_for_each_instance_get(msg, state, devlink) {
|
||||
int idx = 0;
|
||||
|
||||
mutex_lock(&devlink->linecards_lock);
|
||||
devl_lock(devlink);
|
||||
if (!devl_is_registered(devlink))
|
||||
goto next_devlink;
|
||||
|
||||
|
@ -2147,7 +2144,7 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
|
|||
cb->extack);
|
||||
mutex_unlock(&linecard->state_lock);
|
||||
if (err) {
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
devl_unlock(devlink);
|
||||
devlink_put(devlink);
|
||||
state->idx = idx;
|
||||
goto out;
|
||||
|
@ -2155,7 +2152,7 @@ static int devlink_nl_cmd_linecard_get_dumpit(struct sk_buff *msg,
|
|||
idx++;
|
||||
}
|
||||
next_devlink:
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
devl_unlock(devlink);
|
||||
devlink_put(devlink);
|
||||
}
|
||||
out:
|
||||
|
@ -10223,7 +10220,7 @@ static void devlink_linecard_types_fini(struct devlink_linecard *linecard)
|
|||
}
|
||||
|
||||
/**
|
||||
* devlink_linecard_create - Create devlink linecard
|
||||
* devl_linecard_create - Create devlink linecard
|
||||
*
|
||||
* @devlink: devlink
|
||||
* @linecard_index: driver-specific numerical identifier of the linecard
|
||||
|
@ -10236,8 +10233,8 @@ static void devlink_linecard_types_fini(struct devlink_linecard *linecard)
|
|||
* Return: Line card structure or an ERR_PTR() encoded error code.
|
||||
*/
|
||||
struct devlink_linecard *
|
||||
devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
||||
const struct devlink_linecard_ops *ops, void *priv)
|
||||
devl_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
||||
const struct devlink_linecard_ops *ops, void *priv)
|
||||
{
|
||||
struct devlink_linecard *linecard;
|
||||
int err;
|
||||
|
@ -10246,17 +10243,12 @@ devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
|||
!ops->types_count || !ops->types_get))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
mutex_lock(&devlink->linecards_lock);
|
||||
if (devlink_linecard_index_exists(devlink, linecard_index)) {
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
if (devlink_linecard_index_exists(devlink, linecard_index))
|
||||
return ERR_PTR(-EEXIST);
|
||||
}
|
||||
|
||||
linecard = kzalloc(sizeof(*linecard), GFP_KERNEL);
|
||||
if (!linecard) {
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
if (!linecard)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
linecard->devlink = devlink;
|
||||
linecard->index = linecard_index;
|
||||
|
@ -10269,35 +10261,29 @@ devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
|
|||
if (err) {
|
||||
mutex_destroy(&linecard->state_lock);
|
||||
kfree(linecard);
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
list_add_tail(&linecard->list, &devlink->linecard_list);
|
||||
refcount_set(&linecard->refcount, 1);
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
|
||||
return linecard;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_linecard_create);
|
||||
EXPORT_SYMBOL_GPL(devl_linecard_create);
|
||||
|
||||
/**
|
||||
* devlink_linecard_destroy - Destroy devlink linecard
|
||||
* devl_linecard_destroy - Destroy devlink linecard
|
||||
*
|
||||
* @linecard: devlink linecard
|
||||
*/
|
||||
void devlink_linecard_destroy(struct devlink_linecard *linecard)
|
||||
void devl_linecard_destroy(struct devlink_linecard *linecard)
|
||||
{
|
||||
struct devlink *devlink = linecard->devlink;
|
||||
|
||||
devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL);
|
||||
mutex_lock(&devlink->linecards_lock);
|
||||
list_del(&linecard->list);
|
||||
devlink_linecard_types_fini(linecard);
|
||||
mutex_unlock(&devlink->linecards_lock);
|
||||
devlink_linecard_put(linecard);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devlink_linecard_destroy);
|
||||
EXPORT_SYMBOL_GPL(devl_linecard_destroy);
|
||||
|
||||
/**
|
||||
* devlink_linecard_provision_set - Set provisioning on linecard
|
||||
|
|
Loading…
Reference in New Issue