Skip to content

Commit a72e17b

Browse files
Jiri Pirkodavem330
authored andcommitted
devlink: convert param list to xarray
Loose the linked list for params and use xarray instead. Note that this is required to be eventually possible to call devl_param_driverinit_value_get() without holding instance lock. Signed-off-by: Jiri Pirko <[email protected]> Reviewed-by: Simon Horman <[email protected]> Acked-by: Jakub Kicinski <[email protected]> Reviewed-by: Jacob Keller <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent fbcf938 commit a72e17b

File tree

3 files changed

+39
-39
lines changed

3 files changed

+39
-39
lines changed

net/devlink/core.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,14 +212,14 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
212212
devlink->dev = dev;
213213
devlink->ops = ops;
214214
xa_init_flags(&devlink->ports, XA_FLAGS_ALLOC);
215+
xa_init_flags(&devlink->params, XA_FLAGS_ALLOC);
215216
xa_init_flags(&devlink->snapshot_ids, XA_FLAGS_ALLOC);
216217
write_pnet(&devlink->_net, net);
217218
INIT_LIST_HEAD(&devlink->rate_list);
218219
INIT_LIST_HEAD(&devlink->linecard_list);
219220
INIT_LIST_HEAD(&devlink->sb_list);
220221
INIT_LIST_HEAD_RCU(&devlink->dpipe_table_list);
221222
INIT_LIST_HEAD(&devlink->resource_list);
222-
INIT_LIST_HEAD(&devlink->param_list);
223223
INIT_LIST_HEAD(&devlink->region_list);
224224
INIT_LIST_HEAD(&devlink->reporter_list);
225225
INIT_LIST_HEAD(&devlink->trap_list);
@@ -255,7 +255,6 @@ void devlink_free(struct devlink *devlink)
255255
WARN_ON(!list_empty(&devlink->trap_list));
256256
WARN_ON(!list_empty(&devlink->reporter_list));
257257
WARN_ON(!list_empty(&devlink->region_list));
258-
WARN_ON(!list_empty(&devlink->param_list));
259258
WARN_ON(!list_empty(&devlink->resource_list));
260259
WARN_ON(!list_empty(&devlink->dpipe_table_list));
261260
WARN_ON(!list_empty(&devlink->sb_list));
@@ -264,6 +263,7 @@ void devlink_free(struct devlink *devlink)
264263
WARN_ON(!xa_empty(&devlink->ports));
265264

266265
xa_destroy(&devlink->snapshot_ids);
266+
xa_destroy(&devlink->params);
267267
xa_destroy(&devlink->ports);
268268

269269
WARN_ON_ONCE(unregister_netdevice_notifier(&devlink->netdevice_nb));

net/devlink/devl_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct devlink {
2929
struct list_head sb_list;
3030
struct list_head dpipe_table_list;
3131
struct list_head resource_list;
32-
struct list_head param_list;
32+
struct xarray params;
3333
struct list_head region_list;
3434
struct list_head reporter_list;
3535
struct devlink_dpipe_headers *dpipe_headers;

net/devlink/leftover.c

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3953,26 +3953,22 @@ static int devlink_param_driver_verify(const struct devlink_param *param)
39533953
}
39543954

39553955
static struct devlink_param_item *
3956-
devlink_param_find_by_name(struct list_head *param_list,
3957-
const char *param_name)
3956+
devlink_param_find_by_name(struct xarray *params, const char *param_name)
39583957
{
39593958
struct devlink_param_item *param_item;
3959+
unsigned long param_id;
39603960

3961-
list_for_each_entry(param_item, param_list, list)
3961+
xa_for_each(params, param_id, param_item) {
39623962
if (!strcmp(param_item->param->name, param_name))
39633963
return param_item;
3964+
}
39643965
return NULL;
39653966
}
39663967

39673968
static struct devlink_param_item *
3968-
devlink_param_find_by_id(struct list_head *param_list, u32 param_id)
3969+
devlink_param_find_by_id(struct xarray *params, u32 param_id)
39693970
{
3970-
struct devlink_param_item *param_item;
3971-
3972-
list_for_each_entry(param_item, param_list, list)
3973-
if (param_item->param->id == param_id)
3974-
return param_item;
3975-
return NULL;
3971+
return xa_load(params, param_id);
39763972
}
39773973

39783974
static bool
@@ -4201,14 +4197,10 @@ devlink_nl_cmd_param_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
42014197
{
42024198
struct devlink_nl_dump_state *state = devlink_dump_state(cb);
42034199
struct devlink_param_item *param_item;
4204-
int idx = 0;
4200+
unsigned long param_id;
42054201
int err = 0;
42064202

4207-
list_for_each_entry(param_item, &devlink->param_list, list) {
4208-
if (idx < state->idx) {
4209-
idx++;
4210-
continue;
4211-
}
4203+
xa_for_each_start(&devlink->params, param_id, param_item, state->idx) {
42124204
err = devlink_nl_param_fill(msg, devlink, 0, param_item,
42134205
DEVLINK_CMD_PARAM_GET,
42144206
NETLINK_CB(cb->skb).portid,
@@ -4217,10 +4209,9 @@ devlink_nl_cmd_param_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
42174209
if (err == -EOPNOTSUPP) {
42184210
err = 0;
42194211
} else if (err) {
4220-
state->idx = idx;
4212+
state->idx = param_id;
42214213
break;
42224214
}
4223-
idx++;
42244215
}
42254216

42264217
return err;
@@ -4306,16 +4297,15 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
43064297
}
43074298

43084299
static struct devlink_param_item *
4309-
devlink_param_get_from_info(struct list_head *param_list,
4310-
struct genl_info *info)
4300+
devlink_param_get_from_info(struct xarray *params, struct genl_info *info)
43114301
{
43124302
char *param_name;
43134303

43144304
if (GENL_REQ_ATTR_CHECK(info, DEVLINK_ATTR_PARAM_NAME))
43154305
return NULL;
43164306

43174307
param_name = nla_data(info->attrs[DEVLINK_ATTR_PARAM_NAME]);
4318-
return devlink_param_find_by_name(param_list, param_name);
4308+
return devlink_param_find_by_name(params, param_name);
43194309
}
43204310

43214311
static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
@@ -4326,7 +4316,7 @@ static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
43264316
struct sk_buff *msg;
43274317
int err;
43284318

4329-
param_item = devlink_param_get_from_info(&devlink->param_list, info);
4319+
param_item = devlink_param_get_from_info(&devlink->params, info);
43304320
if (!param_item)
43314321
return -EINVAL;
43324322

@@ -4347,7 +4337,7 @@ static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
43474337

43484338
static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
43494339
unsigned int port_index,
4350-
struct list_head *param_list,
4340+
struct xarray *params,
43514341
struct genl_info *info,
43524342
enum devlink_command cmd)
43534343
{
@@ -4359,7 +4349,7 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
43594349
union devlink_param_value value;
43604350
int err = 0;
43614351

4362-
param_item = devlink_param_get_from_info(param_list, info);
4352+
param_item = devlink_param_get_from_info(params, info);
43634353
if (!param_item)
43644354
return -EINVAL;
43654355
param = param_item->param;
@@ -4405,7 +4395,7 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
44054395
{
44064396
struct devlink *devlink = info->user_ptr[0];
44074397

4408-
return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->param_list,
4398+
return __devlink_nl_cmd_param_set_doit(devlink, 0, &devlink->params,
44094399
info, DEVLINK_CMD_PARAM_NEW);
44104400
}
44114401

@@ -8037,6 +8027,7 @@ void devlink_notify_register(struct devlink *devlink)
80378027
struct devlink_rate *rate_node;
80388028
struct devlink_region *region;
80398029
unsigned long port_index;
8030+
unsigned long param_id;
80408031

80418032
devlink_notify(devlink, DEVLINK_CMD_NEW);
80428033
list_for_each_entry(linecard, &devlink->linecard_list, list)
@@ -8062,7 +8053,7 @@ void devlink_notify_register(struct devlink *devlink)
80628053
list_for_each_entry(region, &devlink->region_list, list)
80638054
devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW);
80648055

8065-
list_for_each_entry(param_item, &devlink->param_list, list)
8056+
xa_for_each(&devlink->params, param_id, param_item)
80668057
devlink_param_notify(devlink, 0, param_item,
80678058
DEVLINK_CMD_PARAM_NEW);
80688059
}
@@ -8077,8 +8068,9 @@ void devlink_notify_unregister(struct devlink *devlink)
80778068
struct devlink_rate *rate_node;
80788069
struct devlink_region *region;
80798070
unsigned long port_index;
8071+
unsigned long param_id;
80808072

8081-
list_for_each_entry_reverse(param_item, &devlink->param_list, list)
8073+
xa_for_each(&devlink->params, param_id, param_item)
80828074
devlink_param_notify(devlink, 0, param_item,
80838075
DEVLINK_CMD_PARAM_DEL);
80848076

@@ -9505,9 +9497,10 @@ static int devlink_param_register(struct devlink *devlink,
95059497
const struct devlink_param *param)
95069498
{
95079499
struct devlink_param_item *param_item;
9500+
int err;
95089501

95099502
WARN_ON(devlink_param_verify(param));
9510-
WARN_ON(devlink_param_find_by_name(&devlink->param_list, param->name));
9503+
WARN_ON(devlink_param_find_by_name(&devlink->params, param->name));
95119504

95129505
if (param->supported_cmodes == BIT(DEVLINK_PARAM_CMODE_DRIVERINIT))
95139506
WARN_ON(param->get || param->set);
@@ -9520,22 +9513,28 @@ static int devlink_param_register(struct devlink *devlink,
95209513

95219514
param_item->param = param;
95229515

9523-
list_add_tail(&param_item->list, &devlink->param_list);
9516+
err = xa_insert(&devlink->params, param->id, param_item, GFP_KERNEL);
9517+
if (err)
9518+
goto err_xa_insert;
9519+
95249520
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);
95259521
return 0;
9522+
9523+
err_xa_insert:
9524+
kfree(param_item);
9525+
return err;
95269526
}
95279527

95289528
static void devlink_param_unregister(struct devlink *devlink,
95299529
const struct devlink_param *param)
95309530
{
95319531
struct devlink_param_item *param_item;
95329532

9533-
param_item =
9534-
devlink_param_find_by_name(&devlink->param_list, param->name);
9533+
param_item = devlink_param_find_by_id(&devlink->params, param->id);
95359534
if (WARN_ON(!param_item))
95369535
return;
95379536
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_DEL);
9538-
list_del(&param_item->list);
9537+
xa_erase(&devlink->params, param->id);
95399538
kfree(param_item);
95409539
}
95419540

@@ -9639,7 +9638,7 @@ int devl_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
96399638
if (WARN_ON(!devlink_reload_supported(devlink->ops)))
96409639
return -EOPNOTSUPP;
96419640

9642-
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
9641+
param_item = devlink_param_find_by_id(&devlink->params, param_id);
96439642
if (!param_item)
96449643
return -EINVAL;
96459644

@@ -9673,7 +9672,7 @@ void devl_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
96739672
{
96749673
struct devlink_param_item *param_item;
96759674

9676-
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
9675+
param_item = devlink_param_find_by_id(&devlink->params, param_id);
96779676
if (WARN_ON(!param_item))
96789677
return;
96799678

@@ -9691,8 +9690,9 @@ EXPORT_SYMBOL_GPL(devl_param_driverinit_value_set);
96919690
void devlink_params_driverinit_load_new(struct devlink *devlink)
96929691
{
96939692
struct devlink_param_item *param_item;
9693+
unsigned long param_id;
96949694

9695-
list_for_each_entry(param_item, &devlink->param_list, list) {
9695+
xa_for_each(&devlink->params, param_id, param_item) {
96969696
if (!devlink_param_cmode_is_supported(param_item->param,
96979697
DEVLINK_PARAM_CMODE_DRIVERINIT) ||
96989698
!param_item->driverinit_value_new_valid)
@@ -9719,7 +9719,7 @@ void devl_param_value_changed(struct devlink *devlink, u32 param_id)
97199719
{
97209720
struct devlink_param_item *param_item;
97219721

9722-
param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
9722+
param_item = devlink_param_find_by_id(&devlink->params, param_id);
97239723
WARN_ON(!param_item);
97249724

97259725
devlink_param_notify(devlink, 0, param_item, DEVLINK_CMD_PARAM_NEW);

0 commit comments

Comments
 (0)