diff options
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r-- | net/core/devlink.c | 44 |
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 | ||
2334 | static int | ||
2335 | devlink_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 | |||
2334 | static int devlink_nl_cmd_resource_set(struct sk_buff *skb, | 2360 | static 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 | */ |
3145 | int devlink_resource_register(struct devlink *devlink, | 3167 | int 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) { |