@@ -3953,26 +3953,22 @@ static int devlink_param_driver_verify(const struct devlink_param *param)
3953
3953
}
3954
3954
3955
3955
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 )
3958
3957
{
3959
3958
struct devlink_param_item * param_item ;
3959
+ unsigned long param_id ;
3960
3960
3961
- list_for_each_entry ( param_item , param_list , list )
3961
+ xa_for_each ( params , param_id , param_item ) {
3962
3962
if (!strcmp (param_item -> param -> name , param_name ))
3963
3963
return param_item ;
3964
+ }
3964
3965
return NULL ;
3965
3966
}
3966
3967
3967
3968
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 )
3969
3970
{
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 );
3976
3972
}
3977
3973
3978
3974
static bool
@@ -4201,14 +4197,10 @@ devlink_nl_cmd_param_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
4201
4197
{
4202
4198
struct devlink_nl_dump_state * state = devlink_dump_state (cb );
4203
4199
struct devlink_param_item * param_item ;
4204
- int idx = 0 ;
4200
+ unsigned long param_id ;
4205
4201
int err = 0 ;
4206
4202
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 ) {
4212
4204
err = devlink_nl_param_fill (msg , devlink , 0 , param_item ,
4213
4205
DEVLINK_CMD_PARAM_GET ,
4214
4206
NETLINK_CB (cb -> skb ).portid ,
@@ -4217,10 +4209,9 @@ devlink_nl_cmd_param_get_dump_one(struct sk_buff *msg, struct devlink *devlink,
4217
4209
if (err == - EOPNOTSUPP ) {
4218
4210
err = 0 ;
4219
4211
} else if (err ) {
4220
- state -> idx = idx ;
4212
+ state -> idx = param_id ;
4221
4213
break ;
4222
4214
}
4223
- idx ++ ;
4224
4215
}
4225
4216
4226
4217
return err ;
@@ -4306,16 +4297,15 @@ devlink_param_value_get_from_info(const struct devlink_param *param,
4306
4297
}
4307
4298
4308
4299
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 )
4311
4301
{
4312
4302
char * param_name ;
4313
4303
4314
4304
if (GENL_REQ_ATTR_CHECK (info , DEVLINK_ATTR_PARAM_NAME ))
4315
4305
return NULL ;
4316
4306
4317
4307
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 );
4319
4309
}
4320
4310
4321
4311
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,
4326
4316
struct sk_buff * msg ;
4327
4317
int err ;
4328
4318
4329
- param_item = devlink_param_get_from_info (& devlink -> param_list , info );
4319
+ param_item = devlink_param_get_from_info (& devlink -> params , info );
4330
4320
if (!param_item )
4331
4321
return - EINVAL ;
4332
4322
@@ -4347,7 +4337,7 @@ static int devlink_nl_cmd_param_get_doit(struct sk_buff *skb,
4347
4337
4348
4338
static int __devlink_nl_cmd_param_set_doit (struct devlink * devlink ,
4349
4339
unsigned int port_index ,
4350
- struct list_head * param_list ,
4340
+ struct xarray * params ,
4351
4341
struct genl_info * info ,
4352
4342
enum devlink_command cmd )
4353
4343
{
@@ -4359,7 +4349,7 @@ static int __devlink_nl_cmd_param_set_doit(struct devlink *devlink,
4359
4349
union devlink_param_value value ;
4360
4350
int err = 0 ;
4361
4351
4362
- param_item = devlink_param_get_from_info (param_list , info );
4352
+ param_item = devlink_param_get_from_info (params , info );
4363
4353
if (!param_item )
4364
4354
return - EINVAL ;
4365
4355
param = param_item -> param ;
@@ -4405,7 +4395,7 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff *skb,
4405
4395
{
4406
4396
struct devlink * devlink = info -> user_ptr [0 ];
4407
4397
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 ,
4409
4399
info , DEVLINK_CMD_PARAM_NEW );
4410
4400
}
4411
4401
@@ -8037,6 +8027,7 @@ void devlink_notify_register(struct devlink *devlink)
8037
8027
struct devlink_rate * rate_node ;
8038
8028
struct devlink_region * region ;
8039
8029
unsigned long port_index ;
8030
+ unsigned long param_id ;
8040
8031
8041
8032
devlink_notify (devlink , DEVLINK_CMD_NEW );
8042
8033
list_for_each_entry (linecard , & devlink -> linecard_list , list )
@@ -8062,7 +8053,7 @@ void devlink_notify_register(struct devlink *devlink)
8062
8053
list_for_each_entry (region , & devlink -> region_list , list )
8063
8054
devlink_nl_region_notify (region , NULL , DEVLINK_CMD_REGION_NEW );
8064
8055
8065
- list_for_each_entry ( param_item , & devlink -> param_list , list )
8056
+ xa_for_each ( & devlink -> params , param_id , param_item )
8066
8057
devlink_param_notify (devlink , 0 , param_item ,
8067
8058
DEVLINK_CMD_PARAM_NEW );
8068
8059
}
@@ -8077,8 +8068,9 @@ void devlink_notify_unregister(struct devlink *devlink)
8077
8068
struct devlink_rate * rate_node ;
8078
8069
struct devlink_region * region ;
8079
8070
unsigned long port_index ;
8071
+ unsigned long param_id ;
8080
8072
8081
- list_for_each_entry_reverse ( param_item , & devlink -> param_list , list )
8073
+ xa_for_each ( & devlink -> params , param_id , param_item )
8082
8074
devlink_param_notify (devlink , 0 , param_item ,
8083
8075
DEVLINK_CMD_PARAM_DEL );
8084
8076
@@ -9505,9 +9497,10 @@ static int devlink_param_register(struct devlink *devlink,
9505
9497
const struct devlink_param * param )
9506
9498
{
9507
9499
struct devlink_param_item * param_item ;
9500
+ int err ;
9508
9501
9509
9502
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 ));
9511
9504
9512
9505
if (param -> supported_cmodes == BIT (DEVLINK_PARAM_CMODE_DRIVERINIT ))
9513
9506
WARN_ON (param -> get || param -> set );
@@ -9520,22 +9513,28 @@ static int devlink_param_register(struct devlink *devlink,
9520
9513
9521
9514
param_item -> param = param ;
9522
9515
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
+
9524
9520
devlink_param_notify (devlink , 0 , param_item , DEVLINK_CMD_PARAM_NEW );
9525
9521
return 0 ;
9522
+
9523
+ err_xa_insert :
9524
+ kfree (param_item );
9525
+ return err ;
9526
9526
}
9527
9527
9528
9528
static void devlink_param_unregister (struct devlink * devlink ,
9529
9529
const struct devlink_param * param )
9530
9530
{
9531
9531
struct devlink_param_item * param_item ;
9532
9532
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 );
9535
9534
if (WARN_ON (!param_item ))
9536
9535
return ;
9537
9536
devlink_param_notify (devlink , 0 , param_item , DEVLINK_CMD_PARAM_DEL );
9538
- list_del ( & param_item -> list );
9537
+ xa_erase ( & devlink -> params , param -> id );
9539
9538
kfree (param_item );
9540
9539
}
9541
9540
@@ -9639,7 +9638,7 @@ int devl_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
9639
9638
if (WARN_ON (!devlink_reload_supported (devlink -> ops )))
9640
9639
return - EOPNOTSUPP ;
9641
9640
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 );
9643
9642
if (!param_item )
9644
9643
return - EINVAL ;
9645
9644
@@ -9673,7 +9672,7 @@ void devl_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
9673
9672
{
9674
9673
struct devlink_param_item * param_item ;
9675
9674
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 );
9677
9676
if (WARN_ON (!param_item ))
9678
9677
return ;
9679
9678
@@ -9691,8 +9690,9 @@ EXPORT_SYMBOL_GPL(devl_param_driverinit_value_set);
9691
9690
void devlink_params_driverinit_load_new (struct devlink * devlink )
9692
9691
{
9693
9692
struct devlink_param_item * param_item ;
9693
+ unsigned long param_id ;
9694
9694
9695
- list_for_each_entry ( param_item , & devlink -> param_list , list ) {
9695
+ xa_for_each ( & devlink -> params , param_id , param_item ) {
9696
9696
if (!devlink_param_cmode_is_supported (param_item -> param ,
9697
9697
DEVLINK_PARAM_CMODE_DRIVERINIT ) ||
9698
9698
!param_item -> driverinit_value_new_valid )
@@ -9719,7 +9719,7 @@ void devl_param_value_changed(struct devlink *devlink, u32 param_id)
9719
9719
{
9720
9720
struct devlink_param_item * param_item ;
9721
9721
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 );
9723
9723
WARN_ON (!param_item );
9724
9724
9725
9725
devlink_param_notify (devlink , 0 , param_item , DEVLINK_CMD_PARAM_NEW );
0 commit comments