devlink: remove linecards lock
authorJiri Pirko <jiri@nvidia.com>
Wed, 18 Jan 2023 15:21:04 +0000 (16:21 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 Jan 2023 03:08:37 +0000 (19:08 -0800)
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>
drivers/net/ethernet/mellanox/mlxsw/core_linecards.c
include/net/devlink.h
net/devlink/core.c
net/devlink/devl_internal.h
net/devlink/leftover.c

index 83d2dc91ba2c8a814c2750754aa5ea398dc4f47b..025e0db983feba42e9bdf4ff3e1acb095f43e0b5 100644 (file)
@@ -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);
 }
 
index 425ecef431b75ffaafe75a79e0572c5b5a3e5079..d7c9572e5bea86459158326899a7f93ef1c67bf3 100644 (file)
@@ -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);
index 60beca2df7ccb3ff42374fbe1cfbbbb2bb6fc728..dfc5b58c0464a85e74250b5948af347d3d607f7e 100644 (file)
@@ -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));
index e724e4c2a4ffdbe3266a7495f6072ea665eca33a..32f0adc40c181dcdca3746575fdd4350e34c72c4 100644 (file)
@@ -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;
index bf5e0b1c04222b17cd3e60720ec8e66ded7b0921..44f308d456978741e1773de6f3fa9409dcf850fa 100644 (file)
@@ -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