[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <8b8ef7aac1827f75714ea48c5d9b3898b49e4103.1636390483.git.leonro@nvidia.com>
Date: Mon, 8 Nov 2021 19:05:34 +0200
From: Leon Romanovsky <leon@...nel.org>
To: "David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>
Cc: Leon Romanovsky <leonro@...dia.com>,
Ido Schimmel <idosch@...dia.com>, Jiri Pirko <jiri@...dia.com>,
netdev <netdev@...r.kernel.org>
Subject: [RFC PATCH 12/16] devlink: Protect all sb operations with specialized lock
From: Leon Romanovsky <leonro@...dia.com>
Separate sb related list protection from main devlink instance lock
to rely on specialized lock.
Signed-off-by: Leon Romanovsky <leonro@...dia.com>
---
net/core/devlink.c | 36 ++++++++++++++++++++----------------
1 file changed, 20 insertions(+), 16 deletions(-)
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 008826bc108d..19f1802f1e5d 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -45,6 +45,7 @@ struct devlink {
struct list_head rate_list;
struct mutex rate_list_lock; /* protects rate_list */
struct list_head sb_list;
+ struct mutex sb_list_lock; /* protects sb_list */
struct list_head dpipe_table_list;
struct list_head resource_list;
struct mutex resource_list_lock; /* protects resource_list */
@@ -1985,7 +1986,7 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
goto retry;
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
if (idx < start) {
idx++;
@@ -1997,13 +1998,13 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
cb->nlh->nlmsg_seq,
NLM_F_MULTI);
if (err) {
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
devlink_put(devlink);
goto out;
}
idx++;
}
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
retry:
devlink_put(devlink);
}
@@ -2138,7 +2139,7 @@ static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
!devlink->ops->sb_pool_get)
goto retry;
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
err = __sb_pool_get_dumpit(msg, start, &idx, devlink,
devlink_sb,
@@ -2147,12 +2148,12 @@ static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
if (err == -EOPNOTSUPP) {
err = 0;
} else if (err) {
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
devlink_put(devlink);
goto out;
}
}
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
retry:
devlink_put(devlink);
}
@@ -2359,7 +2360,7 @@ static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
!devlink->ops->sb_port_pool_get)
goto retry;
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
err = __sb_port_pool_get_dumpit(msg, start, &idx,
devlink, devlink_sb,
@@ -2368,12 +2369,12 @@ static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
if (err == -EOPNOTSUPP) {
err = 0;
} else if (err) {
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
devlink_put(devlink);
goto out;
}
}
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
retry:
devlink_put(devlink);
}
@@ -2611,7 +2612,7 @@ devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
!devlink->ops->sb_tc_pool_bind_get)
goto retry;
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
err = __sb_tc_pool_bind_get_dumpit(msg, start, &idx,
devlink,
@@ -2621,12 +2622,12 @@ devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
if (err == -EOPNOTSUPP) {
err = 0;
} else if (err) {
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
devlink_put(devlink);
goto out;
}
}
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
retry:
devlink_put(devlink);
}
@@ -9022,6 +9023,8 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
mutex_init(&devlink->rate_list_lock);
INIT_LIST_HEAD(&devlink->sb_list);
+ mutex_init(&devlink->sb_list_lock);
+
INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list);
INIT_LIST_HEAD(&devlink->resource_list);
@@ -9201,6 +9204,7 @@ void devlink_free(struct devlink *devlink)
mutex_destroy(&devlink->traps_lock);
mutex_destroy(&devlink->region_list_lock);
mutex_destroy(&devlink->rate_list_lock);
+ mutex_destroy(&devlink->sb_list_lock);
mutex_destroy(&devlink->lock);
WARN_ON(!list_empty(&devlink->trap_policer_list));
WARN_ON(!list_empty(&devlink->trap_group_list));
@@ -9715,9 +9719,9 @@ int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
devlink_sb->ingress_tc_count = ingress_tc_count;
devlink_sb->egress_tc_count = egress_tc_count;
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_add_tail(&devlink_sb->list, &devlink->sb_list);
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
return 0;
}
EXPORT_SYMBOL_GPL(devlink_sb_register);
@@ -9729,9 +9733,9 @@ void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index)
devlink_sb = devlink_sb_get_by_index(devlink, sb_index);
WARN_ON(!devlink_sb);
- mutex_lock(&devlink->lock);
+ mutex_lock(&devlink->sb_list_lock);
list_del(&devlink_sb->list);
- mutex_unlock(&devlink->lock);
+ mutex_unlock(&devlink->sb_list_lock);
kfree(devlink_sb);
}
EXPORT_SYMBOL_GPL(devlink_sb_unregister);
--
2.33.1
Powered by blists - more mailing lists