aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r--net/core/devlink.c46
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;
2337out: 2338out:
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
2375static void 2376static int
2376devlink_resource_size_params_put(struct devlink_resource *resource, 2377devlink_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
2391static int devlink_resource_put(struct devlink *devlink, struct sk_buff *skb, 2394static 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);
3200out: 3206out: