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.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c
index effd4848c2b4..9236e421bd62 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -2331,6 +2331,32 @@ out:
2331 resource->size_valid = size_valid; 2331 resource->size_valid = size_valid;
2332} 2332}
2333 2333
2334static int
2335devlink_resource_validate_size(struct devlink_resource *resource, u64 size,
2336 struct netlink_ext_ack *extack)
2337{
2338 u64 reminder;
2339 int err = 0;
2340
2341 if (size > resource->size_params.size_max) {
2342 NL_SET_ERR_MSG_MOD(extack, "Size larger than maximum");
2343 err = -EINVAL;
2344 }
2345
2346 if (size < resource->size_params.size_min) {
2347 NL_SET_ERR_MSG_MOD(extack, "Size smaller than minimum");
2348 err = -EINVAL;
2349 }
2350
2351 div64_u64_rem(size, resource->size_params.size_granularity, &reminder);
2352 if (reminder) {
2353 NL_SET_ERR_MSG_MOD(extack, "Wrong granularity");
2354 err = -EINVAL;
2355 }
2356
2357 return err;
2358}
2359
2334static int devlink_nl_cmd_resource_set(struct sk_buff *skb, 2360static int devlink_nl_cmd_resource_set(struct sk_buff *skb,
2335 struct genl_info *info) 2361 struct genl_info *info)
2336{ 2362{
@@ -2349,12 +2375,8 @@ static int devlink_nl_cmd_resource_set(struct sk_buff *skb,
2349 if (!resource) 2375 if (!resource)
2350 return -EINVAL; 2376 return -EINVAL;
2351 2377
2352 if (!resource->resource_ops->size_validate)
2353 return -EINVAL;
2354
2355 size = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_SIZE]); 2378 size = nla_get_u64(info->attrs[DEVLINK_ATTR_RESOURCE_SIZE]);
2356 err = resource->resource_ops->size_validate(devlink, size, 2379 err = devlink_resource_validate_size(resource, size, info->extack);
2357 info->extack);
2358 if (err) 2380 if (err)
2359 return err; 2381 return err;
2360 2382
@@ -2714,22 +2736,22 @@ static const struct genl_ops devlink_nl_ops[] = {
2714 .cmd = DEVLINK_CMD_DPIPE_TABLE_GET, 2736 .cmd = DEVLINK_CMD_DPIPE_TABLE_GET,
2715 .doit = devlink_nl_cmd_dpipe_table_get, 2737 .doit = devlink_nl_cmd_dpipe_table_get,
2716 .policy = devlink_nl_policy, 2738 .policy = devlink_nl_policy,
2717 .flags = GENL_ADMIN_PERM,
2718 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, 2739 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
2740 /* can be retrieved by unprivileged users */
2719 }, 2741 },
2720 { 2742 {
2721 .cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET, 2743 .cmd = DEVLINK_CMD_DPIPE_ENTRIES_GET,
2722 .doit = devlink_nl_cmd_dpipe_entries_get, 2744 .doit = devlink_nl_cmd_dpipe_entries_get,
2723 .policy = devlink_nl_policy, 2745 .policy = devlink_nl_policy,
2724 .flags = GENL_ADMIN_PERM,
2725 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, 2746 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
2747 /* can be retrieved by unprivileged users */
2726 }, 2748 },
2727 { 2749 {
2728 .cmd = DEVLINK_CMD_DPIPE_HEADERS_GET, 2750 .cmd = DEVLINK_CMD_DPIPE_HEADERS_GET,
2729 .doit = devlink_nl_cmd_dpipe_headers_get, 2751 .doit = devlink_nl_cmd_dpipe_headers_get,
2730 .policy = devlink_nl_policy, 2752 .policy = devlink_nl_policy,
2731 .flags = GENL_ADMIN_PERM,
2732 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, 2753 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
2754 /* can be retrieved by unprivileged users */
2733 }, 2755 },
2734 { 2756 {
2735 .cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET, 2757 .cmd = DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET,
@@ -2749,8 +2771,8 @@ static const struct genl_ops devlink_nl_ops[] = {
2749 .cmd = DEVLINK_CMD_RESOURCE_DUMP, 2771 .cmd = DEVLINK_CMD_RESOURCE_DUMP,
2750 .doit = devlink_nl_cmd_resource_dump, 2772 .doit = devlink_nl_cmd_resource_dump,
2751 .policy = devlink_nl_policy, 2773 .policy = devlink_nl_policy,
2752 .flags = GENL_ADMIN_PERM,
2753 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK, 2774 .internal_flags = DEVLINK_NL_FLAG_NEED_DEVLINK,
2775 /* can be retrieved by unprivileged users */
2754 }, 2776 },
2755 { 2777 {
2756 .cmd = DEVLINK_CMD_RELOAD, 2778 .cmd = DEVLINK_CMD_RELOAD,
@@ -3144,7 +3166,6 @@ EXPORT_SYMBOL_GPL(devlink_dpipe_table_unregister);
3144 */ 3166 */
3145int devlink_resource_register(struct devlink *devlink, 3167int devlink_resource_register(struct devlink *devlink,
3146 const char *resource_name, 3168 const char *resource_name,
3147 bool top_hierarchy,
3148 u64 resource_size, 3169 u64 resource_size,
3149 u64 resource_id, 3170 u64 resource_id,
3150 u64 parent_resource_id, 3171 u64 parent_resource_id,
@@ -3153,8 +3174,11 @@ int devlink_resource_register(struct devlink *devlink,
3153{ 3174{
3154 struct devlink_resource *resource; 3175 struct devlink_resource *resource;
3155 struct list_head *resource_list; 3176 struct list_head *resource_list;
3177 bool top_hierarchy;
3156 int err = 0; 3178 int err = 0;
3157 3179
3180 top_hierarchy = parent_resource_id == DEVLINK_RESOURCE_ID_PARENT_TOP;
3181
3158 mutex_lock(&devlink->lock); 3182 mutex_lock(&devlink->lock);
3159 resource = devlink_resource_find(devlink, NULL, resource_id); 3183 resource = devlink_resource_find(devlink, NULL, resource_id);
3160 if (resource) { 3184 if (resource) {