diff options
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r-- | net/core/devlink.c | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c index 18d385ed8237..2f2307d94787 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
@@ -1695,10 +1695,11 @@ static int devlink_dpipe_table_put(struct sk_buff *skb, | |||
1695 | goto nla_put_failure; | 1695 | goto nla_put_failure; |
1696 | 1696 | ||
1697 | if (table->resource_valid) { | 1697 | if (table->resource_valid) { |
1698 | nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, | 1698 | if (nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID, |
1699 | table->resource_id, DEVLINK_ATTR_PAD); | 1699 | table->resource_id, DEVLINK_ATTR_PAD) || |
1700 | nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS, | 1700 | nla_put_u64_64bit(skb, DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS, |
1701 | table->resource_units, DEVLINK_ATTR_PAD); | 1701 | table->resource_units, DEVLINK_ATTR_PAD)) |
1702 | goto nla_put_failure; | ||
1702 | } | 1703 | } |
1703 | if (devlink_dpipe_matches_put(table, skb)) | 1704 | if (devlink_dpipe_matches_put(table, skb)) |
1704 | goto nla_put_failure; | 1705 | goto nla_put_failure; |
@@ -2332,7 +2333,7 @@ devlink_resource_validate_children(struct devlink_resource *resource) | |||
2332 | list_for_each_entry(child_resource, &resource->resource_list, list) | 2333 | list_for_each_entry(child_resource, &resource->resource_list, list) |
2333 | parts_size += child_resource->size_new; | 2334 | parts_size += child_resource->size_new; |
2334 | 2335 | ||
2335 | if (parts_size > resource->size) | 2336 | if (parts_size > resource->size_new) |
2336 | size_valid = false; | 2337 | size_valid = false; |
2337 | out: | 2338 | out: |
2338 | resource->size_valid = size_valid; | 2339 | resource->size_valid = size_valid; |
@@ -2372,20 +2373,22 @@ static int devlink_nl_cmd_resource_set(struct sk_buff *skb, | |||
2372 | return 0; | 2373 | return 0; |
2373 | } | 2374 | } |
2374 | 2375 | ||
2375 | static void | 2376 | static int |
2376 | devlink_resource_size_params_put(struct devlink_resource *resource, | 2377 | devlink_resource_size_params_put(struct devlink_resource *resource, |
2377 | struct sk_buff *skb) | 2378 | struct sk_buff *skb) |
2378 | { | 2379 | { |
2379 | struct devlink_resource_size_params *size_params; | 2380 | struct devlink_resource_size_params *size_params; |
2380 | 2381 | ||
2381 | size_params = resource->size_params; | 2382 | size_params = &resource->size_params; |
2382 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_GRAN, | 2383 | if (nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_GRAN, |
2383 | size_params->size_granularity, DEVLINK_ATTR_PAD); | 2384 | size_params->size_granularity, DEVLINK_ATTR_PAD) || |
2384 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_MAX, | 2385 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_MAX, |
2385 | size_params->size_max, DEVLINK_ATTR_PAD); | 2386 | size_params->size_max, DEVLINK_ATTR_PAD) || |
2386 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_MIN, | 2387 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_MIN, |
2387 | size_params->size_min, DEVLINK_ATTR_PAD); | 2388 | size_params->size_min, DEVLINK_ATTR_PAD) || |
2388 | nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_UNIT, size_params->unit); | 2389 | nla_put_u8(skb, DEVLINK_ATTR_RESOURCE_UNIT, size_params->unit)) |
2390 | return -EMSGSIZE; | ||
2391 | return 0; | ||
2389 | } | 2392 | } |
2390 | 2393 | ||
2391 | static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, | 2394 | static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, |
@@ -2409,10 +2412,12 @@ static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, | |||
2409 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW, | 2412 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_SIZE_NEW, |
2410 | resource->size_new, DEVLINK_ATTR_PAD); | 2413 | resource->size_new, DEVLINK_ATTR_PAD); |
2411 | if (resource->resource_ops && resource->resource_ops->occ_get) | 2414 | if (resource->resource_ops && resource->resource_ops->occ_get) |
2412 | nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_OCC, | 2415 | if (nla_put_u64_64bit(skb, DEVLINK_ATTR_RESOURCE_OCC, |
2413 | resource->resource_ops->occ_get(devlink), | 2416 | resource->resource_ops->occ_get(devlink), |
2414 | DEVLINK_ATTR_PAD); | 2417 | DEVLINK_ATTR_PAD)) |
2415 | devlink_resource_size_params_put(resource, skb); | 2418 | goto nla_put_failure; |
2419 | if (devlink_resource_size_params_put(resource, skb)) | ||
2420 | goto nla_put_failure; | ||
2416 | if (list_empty(&resource->resource_list)) | 2421 | if (list_empty(&resource->resource_list)) |
2417 | goto out; | 2422 | goto out; |
2418 | 2423 | ||
@@ -3151,7 +3156,7 @@ int devlink_resource_register(struct devlink *devlink, | |||
3151 | u64 resource_size, | 3156 | u64 resource_size, |
3152 | u64 resource_id, | 3157 | u64 resource_id, |
3153 | u64 parent_resource_id, | 3158 | u64 parent_resource_id, |
3154 | struct devlink_resource_size_params *size_params, | 3159 | const struct devlink_resource_size_params *size_params, |
3155 | const struct devlink_resource_ops *resource_ops) | 3160 | const struct devlink_resource_ops *resource_ops) |
3156 | { | 3161 | { |
3157 | struct devlink_resource *resource; | 3162 | struct devlink_resource *resource; |
@@ -3194,7 +3199,8 @@ int devlink_resource_register(struct devlink *devlink, | |||
3194 | resource->id = resource_id; | 3199 | resource->id = resource_id; |
3195 | resource->resource_ops = resource_ops; | 3200 | resource->resource_ops = resource_ops; |
3196 | resource->size_valid = true; | 3201 | resource->size_valid = true; |
3197 | resource->size_params = size_params; | 3202 | memcpy(&resource->size_params, size_params, |
3203 | sizeof(resource->size_params)); | ||
3198 | INIT_LIST_HEAD(&resource->resource_list); | 3204 | INIT_LIST_HEAD(&resource->resource_list); |
3199 | list_add_tail(&resource->list, resource_list); | 3205 | list_add_tail(&resource->list, resource_list); |
3200 | out: | 3206 | out: |