* [PATCH iproute2-next v2 0/2] devlink: support u64-array devlink parameters
@ 2026-06-30 1:50 Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 1/2] devlink: use DEVLINK_VAR_ATTR_TYPE_* in param show/set Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink " Ratheesh Kannoth
0 siblings, 2 replies; 4+ messages in thread
From: Ratheesh Kannoth @ 2026-06-30 1:50 UTC (permalink / raw)
To: stephen, dsahern, kuba, linux-kernel, netdev
Cc: rkannoth, andrew+netdev, edumazet, pabeni, jiri
The kernel gained support for devlink parameters of type
DEVLINK_VAR_ATTR_TYPE_U64_ARRAY. These parameters carry a variable-length
list of u64 values encoded as multiple DEVLINK_ATTR_PARAM_VALUE_DATA
attributes. This is used by drivers that need to expose ordered lists of
configuration values, such as the Marvell CN20K npc_srch_order parameter.
This series updates the devlink tool to handle the new UAPI and adds
show/set support for u64-array parameters on both device and port params.
Patch 1 switches devlink param show/set to use DEVLINK_VAR_ATTR_TYPE_*
constants instead of generic MNL_TYPE_* values when interpreting
DEVLINK_ATTR_PARAM_TYPE. The kernel now reports param types using
devlink_var_attr_type, so userspace must use the matching symbols.
Patch 2 adds parsing, display, and configuration support for
DEVLINK_VAR_ATTR_TYPE_U64_ARRAY. Values are shown as a space-separated
list of u64 elements. Setting accepts a space- or comma-separated list
and emits one DEVLINK_ATTR_PARAM_VALUE_DATA attribute per element.
Tested on CN20K hardware with npc_srch_order:
# show search order
devlink dev param show pci/0002:01:00.0 name npc_srch_order
pci/0002:01:00.0:
name npc_srch_order type driver-specific
values:
cmode runtime value value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# set search order
devlink dev param set pci/0002:01:00.0 name npc_srch_order \
value 31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 \
cmode runtime
Depends on the corresponding kernel UAPI addition of
DEVLINK_VAR_ATTR_TYPE_U64_ARRAY.
Ratheesh Kannoth (2):
devlink: use DEVLINK_VAR_ATTR_TYPE_* in param show/set
devlink: support u64-array values in devlink param show/set
devlink/devlink.c | 178 ++++++++++++++++++++++++++++++++---
include/uapi/linux/devlink.h | 1 +
2 files changed, 164 insertions(+), 15 deletions(-)
--
v1 -> v2: Addressed David comments
https://lore.kernel.org/netdev/20260615041042.549715-1-rkannoth@marvell.com/
2.43.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH iproute2-next v2 1/2] devlink: use DEVLINK_VAR_ATTR_TYPE_* in param show/set
2026-06-30 1:50 [PATCH iproute2-next v2 0/2] devlink: support u64-array devlink parameters Ratheesh Kannoth
@ 2026-06-30 1:50 ` Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink " Ratheesh Kannoth
1 sibling, 0 replies; 4+ messages in thread
From: Ratheesh Kannoth @ 2026-06-30 1:50 UTC (permalink / raw)
To: stephen, dsahern, kuba, linux-kernel, netdev
Cc: rkannoth, andrew+netdev, edumazet, pabeni, jiri
Replace MNL_TYPE_* constants with DEVLINK_VAR_ATTR_TYPE_* when
handling DEVLINK_ATTR_PARAM_TYPE in param value display and set
paths. The kernel uAPI now exposes these values directly via
devlink_var_attr_type.
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
devlink/devlink.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/devlink/devlink.c b/devlink/devlink.c
index b4deba30..9372e92f 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -3507,7 +3507,7 @@ static int pr_out_param_value_print(const char *nla_name, int nla_type,
print_string(PRINT_FP, NULL, " %s ", label);
switch (nla_type) {
- case MNL_TYPE_U8:
+ case DEVLINK_VAR_ATTR_TYPE_U8:
if (conv_exists) {
err = param_val_conv_str_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3522,7 +3522,7 @@ static int pr_out_param_value_print(const char *nla_name, int nla_type,
mnl_attr_get_u8(val_attr));
}
break;
- case MNL_TYPE_U16:
+ case DEVLINK_VAR_ATTR_TYPE_U16:
if (conv_exists) {
err = param_val_conv_str_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3537,7 +3537,7 @@ static int pr_out_param_value_print(const char *nla_name, int nla_type,
mnl_attr_get_u16(val_attr));
}
break;
- case MNL_TYPE_U32:
+ case DEVLINK_VAR_ATTR_TYPE_U32:
if (conv_exists) {
err = param_val_conv_str_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3552,11 +3552,11 @@ static int pr_out_param_value_print(const char *nla_name, int nla_type,
mnl_attr_get_u32(val_attr));
}
break;
- case MNL_TYPE_STRING:
+ case DEVLINK_VAR_ATTR_TYPE_STRING:
print_string(PRINT_ANY, label, "%s",
mnl_attr_get_str(val_attr));
break;
- case MNL_TYPE_FLAG:
+ case DEVLINK_VAR_ATTR_TYPE_FLAG:
if (flag_as_u8)
print_bool(PRINT_ANY, label, "%s",
mnl_attr_get_u8(val_attr));
@@ -3822,7 +3822,7 @@ static int cmd_dev_param_set(struct dl *dl)
mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_TYPE, ctx.nla_type);
switch (ctx.nla_type) {
- case MNL_TYPE_U8:
+ case DEVLINK_VAR_ATTR_TYPE_U8:
if (conv_exists) {
err = param_val_conv_uint_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3839,7 +3839,7 @@ static int cmd_dev_param_set(struct dl *dl)
return 0;
mnl_attr_put_u8(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u8);
break;
- case MNL_TYPE_U16:
+ case DEVLINK_VAR_ATTR_TYPE_U16:
if (conv_exists) {
err = param_val_conv_uint_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3856,7 +3856,7 @@ static int cmd_dev_param_set(struct dl *dl)
return 0;
mnl_attr_put_u16(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u16);
break;
- case MNL_TYPE_U32:
+ case DEVLINK_VAR_ATTR_TYPE_U32:
if (conv_exists) {
err = param_val_conv_uint_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3873,7 +3873,7 @@ static int cmd_dev_param_set(struct dl *dl)
return 0;
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u32);
break;
- case MNL_TYPE_U64:
+ case DEVLINK_VAR_ATTR_TYPE_U64:
if (conv_exists)
err = param_val_conv_uint_get(param_val_conv,
PARAM_VAL_CONV_LEN,
@@ -3888,7 +3888,7 @@ static int cmd_dev_param_set(struct dl *dl)
return 0;
mnl_attr_put_u64(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, val_u64);
break;
- case MNL_TYPE_FLAG:
+ case DEVLINK_VAR_ATTR_TYPE_FLAG:
err = str_to_bool(dl->opts.param_value, &val_bool);
if (err)
goto err_param_value_parse;
@@ -3898,7 +3898,7 @@ static int cmd_dev_param_set(struct dl *dl)
mnl_attr_put(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA,
0, NULL);
break;
- case MNL_TYPE_STRING:
+ case DEVLINK_VAR_ATTR_TYPE_STRING:
mnl_attr_put_strz(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA,
dl->opts.param_value);
if (!strcmp(dl->opts.param_value, ctx.value.vstr))
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink param show/set
2026-06-30 1:50 [PATCH iproute2-next v2 0/2] devlink: support u64-array devlink parameters Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 1/2] devlink: use DEVLINK_VAR_ATTR_TYPE_* in param show/set Ratheesh Kannoth
@ 2026-06-30 1:50 ` Ratheesh Kannoth
2026-06-30 14:36 ` David Ahern
1 sibling, 1 reply; 4+ messages in thread
From: Ratheesh Kannoth @ 2026-06-30 1:50 UTC (permalink / raw)
To: stephen, dsahern, kuba, linux-kernel, netdev
Cc: rkannoth, andrew+netdev, edumazet, pabeni, jiri
Add support for DEVLINK_VAR_ATTR_TYPE_U64_ARRAY parameters that carry
multiple DEVLINK_ATTR_PARAM_VALUE_DATA attributes. Parse and display
u64 array values in param show, and accept space- or comma-separated
u64 values in devlink and port param set commands.
- Show search order
devlink dev param show pci/0002:01:00.0 name npc_srch_order
pci/0002:01:00.0:
name npc_srch_order type driver-specific
values:
cmode runtime value value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
- Set search order
devlink dev param set pci/0002:01:00.0 name npc_srch_order value 31,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,\
22,23,24,25,26,27,28,29,30 cmode runtime
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
---
devlink/devlink.c | 156 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 152 insertions(+), 4 deletions(-)
diff --git a/devlink/devlink.c b/devlink/devlink.c
index 9372e92f..3c29601d 100644
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -3496,13 +3496,115 @@ static const struct param_val_conv param_val_conv[] = {
};
#define PARAM_VAL_CONV_LEN ARRAY_SIZE(param_val_conv)
+#define DEVLINK_PARAM_MAX_ARRAY_SIZE 32
+
+struct devlink_param_u64_array {
+ uint64_t size;
+ uint64_t val[DEVLINK_PARAM_MAX_ARRAY_SIZE];
+};
+
+static int param_value_nested_u64_attr_cb(const struct nlattr *attr, void *data)
+{
+ struct devlink_param_u64_array *arr = data;
+ unsigned int len;
+
+ if (mnl_attr_get_type(attr) != DEVLINK_ATTR_PARAM_VALUE_DATA)
+ return MNL_CB_OK;
+
+ if (arr->size >= DEVLINK_PARAM_MAX_ARRAY_SIZE)
+ return MNL_CB_ERROR;
+
+ len = mnl_attr_get_payload_len(attr);
+ if (len == sizeof(uint32_t))
+ arr->val[arr->size++] = mnl_attr_get_u32(attr);
+ else if (len == sizeof(uint64_t))
+ arr->val[arr->size++] = mnl_attr_get_u64(attr);
+ else
+ return MNL_CB_ERROR;
+
+ return MNL_CB_OK;
+}
+
+static int param_value_u64_array_fill(struct nlattr *nl,
+ struct devlink_param_u64_array *arr)
+{
+ int err;
+
+ arr->size = 0;
+ err = mnl_attr_parse_nested(nl, param_value_nested_u64_attr_cb, arr);
+ if (err != MNL_CB_OK)
+ return -EINVAL;
+
+ return 0;
+}
+
+static bool param_value_u64_array_equal(const struct devlink_param_u64_array *a,
+ const struct devlink_param_u64_array *b)
+{
+ uint64_t i;
+
+ if (a->size != b->size)
+ return false;
+
+ for (i = 0; i < a->size; i++) {
+ if (a->val[i] != b->val[i])
+ return false;
+ }
+
+ return true;
+}
+
+static int param_value_u64_array_put_from_str(struct nlmsghdr *nlh,
+ const char *param_value,
+ const struct devlink_param_u64_array *cur)
+{
+ struct devlink_param_u64_array new_arr = {};
+ char *copy, *token, *saveptr = NULL;
+ char delim[] = " ,";
+ uint64_t val;
+ int err;
+
+ copy = strdup(param_value);
+ if (!copy)
+ return -ENOMEM;
+
+ token = strtok_r(copy, delim, &saveptr);
+ while (token) {
+ if (new_arr.size >= DEVLINK_PARAM_MAX_ARRAY_SIZE) {
+ free(copy);
+ pr_err("Too many array elements (max %d)\n",
+ DEVLINK_PARAM_MAX_ARRAY_SIZE);
+ return -EINVAL;
+ }
+ err = get_u64((__u64 *)&val, token, 10);
+ if (err) {
+ free(copy);
+ pr_err("Value \"%s\" is not a number or not within range\n",
+ token);
+ return err;
+ }
+ new_arr.val[new_arr.size++] = val;
+ token = strtok_r(NULL, delim, &saveptr);
+ }
+ free(copy);
+
+ if (cur && param_value_u64_array_equal(&new_arr, cur))
+ return 1;
+
+ for (uint64_t i = 0; i < new_arr.size; i++)
+ mnl_attr_put_u64(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, new_arr.val[i]);
+
+ return 0;
+}
static int pr_out_param_value_print(const char *nla_name, int nla_type,
struct nlattr *val_attr, bool conv_exists,
- const char *label, bool flag_as_u8)
+ const char *label, bool flag_as_u8, struct nlattr *nl)
{
+ struct devlink_param_u64_array u64_arr = { };
const char *vstr;
- int err;
+ char buffer[1024];
+ int err, cnt = 0;
print_string(PRINT_FP, NULL, " %s ", label);
@@ -3563,6 +3665,20 @@ static int pr_out_param_value_print(const char *nla_name, int nla_type,
else
print_bool(PRINT_ANY, label, "%s", val_attr);
break;
+ case DEVLINK_VAR_ATTR_TYPE_U64_ARRAY:
+ err = param_value_u64_array_fill(flag_as_u8 ? val_attr : nl, &u64_arr);
+ if (err)
+ return err;
+
+ for (uint64_t i = 0; i < u64_arr.size; i++) {
+ if (i)
+ cnt += snprintf(buffer + cnt, sizeof(buffer) - cnt, " ");
+ cnt += snprintf(buffer + cnt, sizeof(buffer) - cnt,
+ "%" PRIu64, u64_arr.val[i]);
+ }
+
+ print_string(PRINT_ANY, label, "%s", buffer);
+ break;
}
return 0;
@@ -3582,6 +3698,7 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] ||
(nla_type != MNL_TYPE_FLAG &&
+ nla_type != DEVLINK_VAR_ATTR_TYPE_U64_ARRAY &&
!nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
return;
@@ -3595,14 +3712,14 @@ static void pr_out_param_value(struct dl *dl, const char *nla_name,
nla_name);
err = pr_out_param_value_print(nla_name, nla_type, val_attr,
- conv_exists, "value", false);
+ conv_exists, "value", false, nl);
if (err)
return;
val_attr = nla_value[DEVLINK_ATTR_PARAM_VALUE_DEFAULT];
if (val_attr) {
err = pr_out_param_value_print(nla_name, nla_type, val_attr,
- conv_exists, "default", true);
+ conv_exists, "default", true, nl);
if (err)
return;
}
@@ -3685,6 +3802,7 @@ struct param_ctx {
uint64_t vu64;
const char *vstr;
bool vbool;
+ struct devlink_param_u64_array u64arr;
} value;
};
@@ -3726,6 +3844,7 @@ static int cmd_dev_param_set_cb(const struct nlmsghdr *nlh, void *data)
if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] ||
(nla_type != MNL_TYPE_FLAG &&
+ nla_type != DEVLINK_VAR_ATTR_TYPE_U64_ARRAY &&
!nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
return MNL_CB_ERROR;
@@ -3752,6 +3871,12 @@ static int cmd_dev_param_set_cb(const struct nlmsghdr *nlh, void *data)
case MNL_TYPE_FLAG:
ctx->value.vbool = val_attr ? true : false;
break;
+ case DEVLINK_VAR_ATTR_TYPE_U64_ARRAY:
+ err = param_value_u64_array_fill(param_value_attr,
+ &ctx->value.u64arr);
+ if (err)
+ return MNL_CB_ERROR;
+ break;
}
break;
}
@@ -3904,6 +4029,14 @@ static int cmd_dev_param_set(struct dl *dl)
if (!strcmp(dl->opts.param_value, ctx.value.vstr))
return 0;
break;
+ case DEVLINK_VAR_ATTR_TYPE_U64_ARRAY:
+ err = param_value_u64_array_put_from_str(nlh, dl->opts.param_value,
+ &ctx.value.u64arr);
+ if (err == 1)
+ return 0;
+ if (err)
+ return err;
+ break;
default:
printf("Value type not supported\n");
return -ENOTSUP;
@@ -5350,6 +5483,7 @@ static int cmd_port_param_set_cb(const struct nlmsghdr *nlh, void *data)
if (!nla_value[DEVLINK_ATTR_PARAM_VALUE_CMODE] ||
(nla_type != MNL_TYPE_FLAG &&
+ nla_type != DEVLINK_VAR_ATTR_TYPE_U64_ARRAY &&
!nla_value[DEVLINK_ATTR_PARAM_VALUE_DATA]))
return MNL_CB_ERROR;
@@ -5372,6 +5506,12 @@ static int cmd_port_param_set_cb(const struct nlmsghdr *nlh, void *data)
case MNL_TYPE_FLAG:
ctx->value.vbool = val_attr ? true : false;
break;
+ case DEVLINK_VAR_ATTR_TYPE_U64_ARRAY:
+ err = param_value_u64_array_fill(param_value_attr,
+ &ctx->value.u64arr);
+ if (err)
+ return MNL_CB_ERROR;
+ break;
}
break;
}
@@ -5500,6 +5640,14 @@ static int cmd_port_param_set(struct dl *dl)
if (!strcmp(dl->opts.param_value, ctx.value.vstr))
return 0;
break;
+ case DEVLINK_VAR_ATTR_TYPE_U64_ARRAY:
+ err = param_value_u64_array_put_from_str(nlh, dl->opts.param_value,
+ &ctx.value.u64arr);
+ if (err == 1)
+ return 0;
+ if (err)
+ return err;
+ break;
default:
printf("Value type not supported\n");
return -ENOTSUP;
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink param show/set
2026-06-30 1:50 ` [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink " Ratheesh Kannoth
@ 2026-06-30 14:36 ` David Ahern
0 siblings, 0 replies; 4+ messages in thread
From: David Ahern @ 2026-06-30 14:36 UTC (permalink / raw)
To: Ratheesh Kannoth, stephen, kuba, linux-kernel, netdev
Cc: andrew+netdev, edumazet, pabeni, jiri
On 6/29/26 7:50 PM, Ratheesh Kannoth wrote:
> diff --git a/devlink/devlink.c b/devlink/devlink.c
> index 9372e92f..3c29601d 100644
> --- a/devlink/devlink.c
> +++ b/devlink/devlink.c
> @@ -3496,13 +3496,115 @@ static const struct param_val_conv param_val_conv[] = {
> };
>
> #define PARAM_VAL_CONV_LEN ARRAY_SIZE(param_val_conv)
> +#define DEVLINK_PARAM_MAX_ARRAY_SIZE 32
Why 32? Is that based on current code? How does the kernel side handle
the number of parameters? What happens if the kernel sends more than 32
parameters - from a user's perspective, not this code and processing the
output?
> +
> +struct devlink_param_u64_array {
> + uint64_t size;
> + uint64_t val[DEVLINK_PARAM_MAX_ARRAY_SIZE];
> +};
> +
> +static int param_value_nested_u64_attr_cb(const struct nlattr *attr, void *data)
> +{
> + struct devlink_param_u64_array *arr = data;
> + unsigned int len;
> +
> + if (mnl_attr_get_type(attr) != DEVLINK_ATTR_PARAM_VALUE_DATA)
> + return MNL_CB_OK;
> +
> + if (arr->size >= DEVLINK_PARAM_MAX_ARRAY_SIZE)
> + return MNL_CB_ERROR;
> +
> + len = mnl_attr_get_payload_len(attr);
> + if (len == sizeof(uint32_t))
> + arr->val[arr->size++] = mnl_attr_get_u32(attr);
> + else if (len == sizeof(uint64_t))
> + arr->val[arr->size++] = mnl_attr_get_u64(attr);
> + else
> + return MNL_CB_ERROR;
> +
> + return MNL_CB_OK;
> +}
> +
> +static int param_value_u64_array_fill(struct nlattr *nl,
> + struct devlink_param_u64_array *arr)
> +{
> + int err;
> +
> + arr->size = 0;
> + err = mnl_attr_parse_nested(nl, param_value_nested_u64_attr_cb, arr);
> + if (err != MNL_CB_OK)
> + return -EINVAL;
> +
> + return 0;
> +}
> +
> +static bool param_value_u64_array_equal(const struct devlink_param_u64_array *a,
> + const struct devlink_param_u64_array *b)
> +{
> + uint64_t i;
> +
> + if (a->size != b->size)
> + return false;
> +
> + for (i = 0; i < a->size; i++) {
> + if (a->val[i] != b->val[i])
> + return false;
> + }
> +
> + return true;
> +}
> +
> +static int param_value_u64_array_put_from_str(struct nlmsghdr *nlh,
> + const char *param_value,
> + const struct devlink_param_u64_array *cur)
> +{
> + struct devlink_param_u64_array new_arr = {};
> + char *copy, *token, *saveptr = NULL;
> + char delim[] = " ,";
> + uint64_t val;
> + int err;
> +
> + copy = strdup(param_value);
> + if (!copy)
> + return -ENOMEM;
> +
> + token = strtok_r(copy, delim, &saveptr);
> + while (token) {
> + if (new_arr.size >= DEVLINK_PARAM_MAX_ARRAY_SIZE) {
> + free(copy);
> + pr_err("Too many array elements (max %d)\n",
> + DEVLINK_PARAM_MAX_ARRAY_SIZE);
> + return -EINVAL;
> + }
> + err = get_u64((__u64 *)&val, token, 10);
> + if (err) {
> + free(copy);
> + pr_err("Value \"%s\" is not a number or not within range\n",
> + token);
> + return err;
> + }
> + new_arr.val[new_arr.size++] = val;
> + token = strtok_r(NULL, delim, &saveptr);
> + }
> + free(copy);
> +
> + if (cur && param_value_u64_array_equal(&new_arr, cur))
> + return 1;
> +
> + for (uint64_t i = 0; i < new_arr.size; i++)
put the declaration at the top of the function with the rest of them.
global comment; fix all of them.
> + mnl_attr_put_u64(nlh, DEVLINK_ATTR_PARAM_VALUE_DATA, new_arr.val[i]);
Why can't this put be done in the loop above as the string is processed?
> +
> + return 0;
> +}
>
> static int pr_out_param_value_print(const char *nla_name, int nla_type,
> struct nlattr *val_attr, bool conv_exists,
> - const char *label, bool flag_as_u8)
> + const char *label, bool flag_as_u8, struct nlattr *nl)
> {
> + struct devlink_param_u64_array u64_arr = { };
> const char *vstr;
> - int err;
> + char buffer[1024];
> + int err, cnt = 0;
>
> print_string(PRINT_FP, NULL, " %s ", label);
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-06-30 14:36 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-30 1:50 [PATCH iproute2-next v2 0/2] devlink: support u64-array devlink parameters Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 1/2] devlink: use DEVLINK_VAR_ATTR_TYPE_* in param show/set Ratheesh Kannoth
2026-06-30 1:50 ` [PATCH iproute2-next v2 2/2] devlink: support u64-array values in devlink " Ratheesh Kannoth
2026-06-30 14:36 ` David Ahern
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox