Skip to content

Commit 77d2709

Browse files
jpirkodavem330
authored andcommitted
mlxsw: spectrum: Fix handling of resource_size_param
Current code uses global variables, adjusts them and passes pointer down to devlink. With every other mlxsw_core instance, the previously passed pointer values are rewritten. Fix this by de-globalize the variables and also memcpy size_params during devlink resource registration. Also, introduce a convenient size_param_init helper. Fixes: ef3116e ("mlxsw: spectrum: Register KVD resources with devlink") Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 2ddc94c commit 77d2709

File tree

3 files changed

+57
-43
lines changed

3 files changed

+57
-43
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum.c

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4207,13 +4207,12 @@ static struct devlink_resource_ops mlxsw_sp_resource_kvd_hash_double_ops = {
42074207
.size_validate = mlxsw_sp_resource_kvd_hash_double_size_validate,
42084208
};
42094209

4210-
static struct devlink_resource_size_params mlxsw_sp_kvd_size_params;
4211-
static struct devlink_resource_size_params mlxsw_sp_linear_size_params;
4212-
static struct devlink_resource_size_params mlxsw_sp_hash_single_size_params;
4213-
static struct devlink_resource_size_params mlxsw_sp_hash_double_size_params;
4214-
42154210
static void
4216-
mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core)
4211+
mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core,
4212+
struct devlink_resource_size_params *kvd_size_params,
4213+
struct devlink_resource_size_params *linear_size_params,
4214+
struct devlink_resource_size_params *hash_double_size_params,
4215+
struct devlink_resource_size_params *hash_single_size_params)
42174216
{
42184217
u32 single_size_min = MLXSW_CORE_RES_GET(mlxsw_core,
42194218
KVD_SINGLE_MIN_SIZE);
@@ -4222,37 +4221,35 @@ mlxsw_sp_resource_size_params_prepare(struct mlxsw_core *mlxsw_core)
42224221
u32 kvd_size = MLXSW_CORE_RES_GET(mlxsw_core, KVD_SIZE);
42234222
u32 linear_size_min = 0;
42244223

4225-
/* KVD top resource */
4226-
mlxsw_sp_kvd_size_params.size_min = kvd_size;
4227-
mlxsw_sp_kvd_size_params.size_max = kvd_size;
4228-
mlxsw_sp_kvd_size_params.size_granularity = MLXSW_SP_KVD_GRANULARITY;
4229-
mlxsw_sp_kvd_size_params.unit = DEVLINK_RESOURCE_UNIT_ENTRY;
4230-
4231-
/* Linear part init */
4232-
mlxsw_sp_linear_size_params.size_min = linear_size_min;
4233-
mlxsw_sp_linear_size_params.size_max = kvd_size - single_size_min -
4234-
double_size_min;
4235-
mlxsw_sp_linear_size_params.size_granularity = MLXSW_SP_KVD_GRANULARITY;
4236-
mlxsw_sp_linear_size_params.unit = DEVLINK_RESOURCE_UNIT_ENTRY;
4237-
4238-
/* Hash double part init */
4239-
mlxsw_sp_hash_double_size_params.size_min = double_size_min;
4240-
mlxsw_sp_hash_double_size_params.size_max = kvd_size - single_size_min -
4241-
linear_size_min;
4242-
mlxsw_sp_hash_double_size_params.size_granularity = MLXSW_SP_KVD_GRANULARITY;
4243-
mlxsw_sp_hash_double_size_params.unit = DEVLINK_RESOURCE_UNIT_ENTRY;
4244-
4245-
/* Hash single part init */
4246-
mlxsw_sp_hash_single_size_params.size_min = single_size_min;
4247-
mlxsw_sp_hash_single_size_params.size_max = kvd_size - double_size_min -
4248-
linear_size_min;
4249-
mlxsw_sp_hash_single_size_params.size_granularity = MLXSW_SP_KVD_GRANULARITY;
4250-
mlxsw_sp_hash_single_size_params.unit = DEVLINK_RESOURCE_UNIT_ENTRY;
4224+
devlink_resource_size_params_init(kvd_size_params, kvd_size, kvd_size,
4225+
MLXSW_SP_KVD_GRANULARITY,
4226+
DEVLINK_RESOURCE_UNIT_ENTRY);
4227+
devlink_resource_size_params_init(linear_size_params, linear_size_min,
4228+
kvd_size - single_size_min -
4229+
double_size_min,
4230+
MLXSW_SP_KVD_GRANULARITY,
4231+
DEVLINK_RESOURCE_UNIT_ENTRY);
4232+
devlink_resource_size_params_init(hash_double_size_params,
4233+
double_size_min,
4234+
kvd_size - single_size_min -
4235+
linear_size_min,
4236+
MLXSW_SP_KVD_GRANULARITY,
4237+
DEVLINK_RESOURCE_UNIT_ENTRY);
4238+
devlink_resource_size_params_init(hash_single_size_params,
4239+
single_size_min,
4240+
kvd_size - double_size_min -
4241+
linear_size_min,
4242+
MLXSW_SP_KVD_GRANULARITY,
4243+
DEVLINK_RESOURCE_UNIT_ENTRY);
42514244
}
42524245

42534246
static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
42544247
{
42554248
struct devlink *devlink = priv_to_devlink(mlxsw_core);
4249+
struct devlink_resource_size_params hash_single_size_params;
4250+
struct devlink_resource_size_params hash_double_size_params;
4251+
struct devlink_resource_size_params linear_size_params;
4252+
struct devlink_resource_size_params kvd_size_params;
42564253
u32 kvd_size, single_size, double_size, linear_size;
42574254
const struct mlxsw_config_profile *profile;
42584255
int err;
@@ -4261,13 +4258,17 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
42614258
if (!MLXSW_CORE_RES_VALID(mlxsw_core, KVD_SIZE))
42624259
return -EIO;
42634260

4264-
mlxsw_sp_resource_size_params_prepare(mlxsw_core);
4261+
mlxsw_sp_resource_size_params_prepare(mlxsw_core, &kvd_size_params,
4262+
&linear_size_params,
4263+
&hash_double_size_params,
4264+
&hash_single_size_params);
4265+
42654266
kvd_size = MLXSW_CORE_RES_GET(mlxsw_core, KVD_SIZE);
42664267
err = devlink_resource_register(devlink, MLXSW_SP_RESOURCE_NAME_KVD,
42674268
true, kvd_size,
42684269
MLXSW_SP_RESOURCE_KVD,
42694270
DEVLINK_RESOURCE_ID_PARENT_TOP,
4270-
&mlxsw_sp_kvd_size_params,
4271+
&kvd_size_params,
42714272
&mlxsw_sp_resource_kvd_ops);
42724273
if (err)
42734274
return err;
@@ -4277,7 +4278,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
42774278
false, linear_size,
42784279
MLXSW_SP_RESOURCE_KVD_LINEAR,
42794280
MLXSW_SP_RESOURCE_KVD,
4280-
&mlxsw_sp_linear_size_params,
4281+
&linear_size_params,
42814282
&mlxsw_sp_resource_kvd_linear_ops);
42824283
if (err)
42834284
return err;
@@ -4291,7 +4292,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
42914292
false, double_size,
42924293
MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
42934294
MLXSW_SP_RESOURCE_KVD,
4294-
&mlxsw_sp_hash_double_size_params,
4295+
&hash_double_size_params,
42954296
&mlxsw_sp_resource_kvd_hash_double_ops);
42964297
if (err)
42974298
return err;
@@ -4301,7 +4302,7 @@ static int mlxsw_sp_resources_register(struct mlxsw_core *mlxsw_core)
43014302
false, single_size,
43024303
MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
43034304
MLXSW_SP_RESOURCE_KVD,
4304-
&mlxsw_sp_hash_single_size_params,
4305+
&hash_single_size_params,
43054306
&mlxsw_sp_resource_kvd_hash_single_ops);
43064307
if (err)
43074308
return err;

include/net/devlink.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,18 @@ struct devlink_resource_size_params {
257257
enum devlink_resource_unit unit;
258258
};
259259

260+
static inline void
261+
devlink_resource_size_params_init(struct devlink_resource_size_params *size_params,
262+
u64 size_min, u64 size_max,
263+
u64 size_granularity,
264+
enum devlink_resource_unit unit)
265+
{
266+
size_params->size_min = size_min;
267+
size_params->size_max = size_max;
268+
size_params->size_granularity = size_granularity;
269+
size_params->unit = unit;
270+
}
271+
260272
/**
261273
* struct devlink_resource - devlink resource
262274
* @name: name of the resource
@@ -278,7 +290,7 @@ struct devlink_resource {
278290
u64 size_new;
279291
bool size_valid;
280292
struct devlink_resource *parent;
281-
struct devlink_resource_size_params *size_params;
293+
struct devlink_resource_size_params size_params;
282294
struct list_head list;
283295
struct list_head resource_list;
284296
const struct devlink_resource_ops *resource_ops;
@@ -402,7 +414,7 @@ int devlink_resource_register(struct devlink *devlink,
402414
u64 resource_size,
403415
u64 resource_id,
404416
u64 parent_resource_id,
405-
struct devlink_resource_size_params *size_params,
417+
const struct devlink_resource_size_params *size_params,
406418
const struct devlink_resource_ops *resource_ops);
407419
void devlink_resources_unregister(struct devlink *devlink,
408420
struct devlink_resource *resource);
@@ -556,7 +568,7 @@ devlink_resource_register(struct devlink *devlink,
556568
u64 resource_size,
557569
u64 resource_id,
558570
u64 parent_resource_id,
559-
struct devlink_resource_size_params *size_params,
571+
const struct devlink_resource_size_params *size_params,
560572
const struct devlink_resource_ops *resource_ops)
561573
{
562574
return 0;

net/core/devlink.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2379,7 +2379,7 @@ devlink_resource_size_params_put(struct devlink_resource *resource,
23792379
{
23802380
struct devlink_resource_size_params *size_params;
23812381

2382-
size_params = resource->size_params;
2382+
size_params = &resource->size_params;
23832383
if (nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_GRAN,
23842384
size_params->size_granularity, DEVLINK_ATTR_PAD) ||
23852385
nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_MAX,
@@ -3156,7 +3156,7 @@ int devlink_resource_register(struct devlink *devlink,
31563156
u64 resource_size,
31573157
u64 resource_id,
31583158
u64 parent_resource_id,
3159-
struct devlink_resource_size_params *size_params,
3159+
const struct devlink_resource_size_params *size_params,
31603160
const struct devlink_resource_ops *resource_ops)
31613161
{
31623162
struct devlink_resource *resource;
@@ -3199,7 +3199,8 @@ int devlink_resource_register(struct devlink *devlink,
31993199
resource->id = resource_id;
32003200
resource->resource_ops = resource_ops;
32013201
resource->size_valid = true;
3202-
resource->size_params = size_params;
3202+
memcpy(&resource->size_params, size_params,
3203+
sizeof(resource->size_params));
32033204
INIT_LIST_HEAD(&resource->resource_list);
32043205
list_add_tail(&resource->list, resource_list);
32053206
out:

0 commit comments

Comments
 (0)