DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	Chengwen Feng <fengchengwen@huawei.com>
Subject: [PATCH v3 04/65] kvargs: add hexadecimal conversion helpers
Date: Wed, 30 Sep 2026 15:40:22 -0700	[thread overview]
Message-ID: <20260930224340.58580-5-stephen@networkplumber.org> (raw)
In-Reply-To: <20260930224340.58580-1-stephen@networkplumber.org>

Several device arguments are documented as a bare hexadecimal mask,
with no 0x prefix. Each place the driver open codes strtoull() with
base 16, and each gets the validation wrong in a one way or another.

Introduce a new helper to handle these type of args.
Add rte_kvargs_handle_hex32() and rte_kvargs_handle_hex64().

A sign is rejected, as it is for the unsigned handlers,
so a mask cannot be given as -1.

Only the 32 and 64 bit widths are added, since those are the only ones
any caller needs.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
---
 app/test/test_kvargs.c                 |  45 +++++++++
 doc/guides/rel_notes/release_26_11.rst |   8 +-
 lib/kvargs/rte_kvargs.c                | 131 ++++++++++++++++++++++---
 lib/kvargs/rte_kvargs.h                |  44 +++++++++
 4 files changed, 213 insertions(+), 15 deletions(-)

diff --git a/app/test/test_kvargs.c b/app/test/test_kvargs.c
index f05c7918e9..6e84ebf35c 100644
--- a/app/test/test_kvargs.c
+++ b/app/test/test_kvargs.c
@@ -475,6 +475,50 @@ test_handle_signed(void)
 	return TEST_SUCCESS;
 }
 
+static int
+test_handle_hex(void)
+{
+	uint64_t u = 0x5a;
+
+	/* The 0x prefix is optional, and a bare value is still hexadecimal. */
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0xff", 0xff);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0XFF", 0xff);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "ff", 0xff);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "FF", 0xff);
+	/* "10" is sixteen here, not ten. */
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "10", 0x10);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "0", 0);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "00110F10", 0x00110f10);
+	CHECK_GOOD(rte_kvargs_handle_hex32, uint32_t, "ffffffff", 0xffffffff);
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "100000000");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "-1");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x0x10");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "1g");
+	CHECK_BAD(rte_kvargs_handle_hex32, uint32_t, "0x1p");
+
+	CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "0xF", 0xf);
+	CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "F", 0xf);
+	CHECK_GOOD(rte_kvargs_handle_hex64, uint64_t, "ffffffffffffffff",
+		   UINT64_MAX);
+	CHECK_BAD(rte_kvargs_handle_hex64, uint64_t, "10000000000000000");
+	CHECK_BAD(rte_kvargs_handle_hex64, uint64_t, "-1");
+
+	/* The underlying conversion, with a mask narrower than the type. */
+	TEST_ASSERT_SUCCESS(rte_kvargs_to_hex("fff", 0xfff, &u), "fff in 0..fff");
+	TEST_ASSERT_EQUAL(u, 0xfffU, "wrong value");
+	TEST_ASSERT_EQUAL(rte_kvargs_to_hex("1000", 0xfff, &u), -ERANGE,
+			  "1000 should be out of 0..fff");
+	TEST_ASSERT_EQUAL(u, 0xfffU, "target clobbered on range error");
+	TEST_ASSERT_EQUAL(rte_kvargs_to_hex(NULL, 0xfff, &u), -EINVAL,
+			  "NULL should be rejected");
+	TEST_ASSERT_EQUAL(rte_kvargs_to_hex("f", 0xfff, NULL), -EINVAL,
+			  "a NULL result should be rejected");
+
+	return TEST_SUCCESS;
+}
+
 static int
 test_handle_bool(void)
 {
@@ -603,6 +647,7 @@ static struct unit_test_suite kvargs_test_suite  = {
 		TEST_CASE(test_invalid_kvargs),
 		TEST_CASE(test_handle_unsigned),
 		TEST_CASE(test_handle_signed),
+		TEST_CASE(test_handle_hex),
 		TEST_CASE(test_handle_bool),
 		TEST_CASE(test_handle_socket_id),
 		TEST_CASE(test_kvargs_to_range),
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 7225e9e787..27b3fe4253 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -156,9 +156,13 @@ New Features
   * ``rte_kvargs_handle_bool``, accepting ``1``, ``y``, ``yes``, ``on``,
     ``true`` and their negative counterparts. A bare ``key`` means true;
     an empty ``key=`` is rejected.
+  * ``rte_kvargs_handle_hex32`` and ``rte_kvargs_handle_hex64``, for the
+    arguments documented as a bare hexadecimal mask, where the value is
+    always read as hexadecimal whether or not it carries a ``0x`` prefix
 
-  Added ``rte_kvargs_to_uint`` and ``rte_kvargs_to_int`` for the cases where
-  a driver needs a narrower range than the target type allows.
+  Added ``rte_kvargs_to_uint``, ``rte_kvargs_to_int`` and
+  ``rte_kvargs_to_hex`` for the cases where a driver needs a narrower range
+  than the target type allows.
 
 
 Removed Items
diff --git a/lib/kvargs/rte_kvargs.c b/lib/kvargs/rte_kvargs.c
index 6e5e3fcd7c..22bde9616c 100644
--- a/lib/kvargs/rte_kvargs.c
+++ b/lib/kvargs/rte_kvargs.c
@@ -323,6 +323,35 @@ rte_kvargs_parse_delim(const char *args, const char * const valid_keys[],
 	return kvlist;
 }
 
+/*
+ * Skip over a "0x" prefix if there is one.
+ *
+ * Returns true if a prefix was consumed, and advances *str past it. Only one
+ * prefix is ever consumed: a second one is left in place so that the caller
+ * rejects it, since strtoull() would otherwise strip it itself and read
+ * "0x0x10" as sixteen rather than as the garbage it is.
+ */
+static bool
+kvargs_skip_hex_prefix(const char **str)
+{
+	const char *s = *str;
+
+	if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X') &&
+	    isxdigit((unsigned char)s[2])) {
+		*str = s + 2;
+		return true;
+	}
+
+	return false;
+}
+
+/* Tell whether a "0x" prefix is present, without consuming it. */
+static bool
+kvargs_has_hex_prefix(const char *str)
+{
+	return str[0] == '0' && (str[1] == 'x' || str[1] == 'X');
+}
+
 /*
  * Determine the base of a numeric value and skip over its prefix.
  *
@@ -331,24 +360,15 @@ rte_kvargs_parse_delim(const char *args, const char * const valid_keys[],
  * has been a recurring source of surprise.
  *
  * Returns the base, and advances *str past the "0x" prefix if there is one.
- * Returns 0 if what follows the prefix is a second one: strtoull() would
- * strip that itself, making "0x0x10" sixteen rather than the garbage it is.
+ * Returns 0 if what follows the prefix is a second one, which is not a number.
  */
 static int
 kvargs_get_base(const char **str)
 {
-	const char *s = *str;
-
-	if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X') &&
-	    isxdigit((unsigned char)s[2])) {
-		s += 2;
-		if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
-			return 0;
-		*str = s;
-		return 16;
-	}
+	if (!kvargs_skip_hex_prefix(str))
+		return 10;
 
-	return 10;
+	return kvargs_has_hex_prefix(*str) ? 0 : 16;
 }
 
 /* Skip trailing white space, and tell whether anything else is left. */
@@ -487,6 +507,46 @@ rte_kvargs_to_int(const char *value, int64_t min, int64_t max, int64_t *result)
 	return 0;
 }
 
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_to_hex, 26.11)
+int
+rte_kvargs_to_hex(const char *value, uint64_t max, uint64_t *result)
+{
+	const char *str = value;
+	unsigned long long val;
+	char *endptr;
+
+	if (str == NULL || result == NULL)
+		return -EINVAL;
+
+	/* A mask has no sign; "-1" must not wrap around to UINT64_MAX. */
+	if (kvargs_get_sign(&str))
+		return -EINVAL;
+
+	/* The 0x prefix is optional here, but still accepted. */
+	if (kvargs_skip_hex_prefix(&str) && kvargs_has_hex_prefix(str))
+		return -EINVAL;	/* doubled 0x prefix */
+
+	if (!isxdigit((unsigned char)*str))
+		return -EINVAL;
+
+	errno = 0;
+	val = strtoull(str, &endptr, 16);
+	if (endptr == str)
+		return -EINVAL;
+	if (errno == ERANGE)
+		return -ERANGE;
+	if (errno != 0)
+		return -EINVAL;
+	if (!kvargs_at_end(endptr))
+		return -EINVAL;	/* trailing garbage */
+
+	if (val > max)
+		return -ERANGE;
+
+	*result = val;
+	return 0;
+}
+
 /*
  * The typed handlers below share this shape: convert with a range matching
  * the target type, then store. The target is written only on success, so a
@@ -710,6 +770,51 @@ rte_kvargs_handle_ulong(const char *key, const char *value, void *opaque)
 	return ret;
 }
 
+static int
+kvargs_store_hex(const char *key, const char *value, void *opaque,
+		 uint64_t max, uint64_t *val)
+{
+	int ret;
+
+	if (opaque == NULL)
+		return -EINVAL;
+
+	ret = rte_kvargs_to_hex(value, max, val);
+	if (ret < 0)
+		KVARGS_LOG(ERR, "invalid value \"%s\" for key \"%s\", expected 0..%" PRIx64 " in hex",
+			   value != NULL ? value : "", key != NULL ? key : "", max);
+
+	return ret;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_handle_hex32, 26.11)
+int
+rte_kvargs_handle_hex32(const char *key, const char *value, void *opaque)
+{
+	uint64_t val;
+	int ret;
+
+	ret = kvargs_store_hex(key, value, opaque, UINT32_MAX, &val);
+	if (ret == 0)
+		*(uint32_t *)opaque = (uint32_t)val;
+
+	return ret;
+}
+
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_kvargs_handle_hex64, 26.11)
+int
+rte_kvargs_handle_hex64(const char *key, const char *value, void *opaque)
+{
+	uint64_t val;
+	int ret;
+
+	ret = kvargs_store_hex(key, value, opaque, UINT64_MAX, &val);
+	if (ret == 0)
+		*(uint64_t *)opaque = val;
+
+	return ret;
+}
+
 static const char * const kvargs_true[] = { "1", "y", "yes", "on", "true" };
 static const char * const kvargs_false[] = { "0", "n", "no", "off", "false" };
 
diff --git a/lib/kvargs/rte_kvargs.h b/lib/kvargs/rte_kvargs.h
index acc15607bc..fe18841709 100644
--- a/lib/kvargs/rte_kvargs.h
+++ b/lib/kvargs/rte_kvargs.h
@@ -330,6 +330,24 @@ int rte_kvargs_handle_ulong(const char *key, const char *value, void *opaque);
 __rte_experimental
 int rte_kvargs_handle_size(const char *key, const char *value, void *opaque);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Convert a bit mask to uint32_t.
+ *
+ * As rte_kvargs_handle_u32(), except that the value is always read as
+ * hexadecimal, with or without a ``0x`` prefix, so ``10`` is sixteen. This
+ * is for arguments documented as a bare hexadecimal mask; use
+ * rte_kvargs_handle_u32() for a count or a size.
+ */
+__rte_experimental
+int rte_kvargs_handle_hex32(const char *key, const char *value, void *opaque);
+
+/** Convert a hexadecimal value to uint64_t. See rte_kvargs_handle_hex32(). */
+__rte_experimental
+int rte_kvargs_handle_hex64(const char *key, const char *value, void *opaque);
+
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice.
@@ -443,6 +461,32 @@ __rte_experimental
 int rte_kvargs_to_int(const char *value, int64_t min, int64_t max,
 	int64_t *result);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Convert a hexadecimal string to an unsigned integer, checking it against
+ * a maximum.
+ *
+ * This is the conversion underlying rte_kvargs_handle_hex32(), and is the
+ * hexadecimal counterpart of rte_kvargs_to_uint(). The minimum is always
+ * zero, since a negative value is rejected rather than wrapped around.
+ *
+ * @param value
+ *   The string to convert. Must be non-NULL and non-empty.
+ * @param max
+ *   Largest acceptable value, inclusive.
+ * @param result
+ *   Where to store the converted value. Left unmodified on error.
+ *
+ * @return
+ *   - 0 on success.
+ *   - -EINVAL if the value is missing or malformed, or if @p result is NULL.
+ *   - -ERANGE if the value is greater than @p max.
+ */
+__rte_experimental
+int rte_kvargs_to_hex(const char *value, uint64_t max, uint64_t *result);
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.53.0


  parent reply	other threads:[~2026-09-30 22:44 UTC|newest]

Thread overview: 198+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-14  5:46 [PATCH 00/62] kvargs: add numeric conversion helpers and use them Stephen Hemminger
2026-09-14  5:46 ` [PATCH 01/62] net/txgbe: fix FDIR devarg integer width Stephen Hemminger
2026-09-14  5:46 ` [PATCH 02/62] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-14  5:46 ` [PATCH 03/62] kvargs: add a socket ID handler Stephen Hemminger
2026-09-14  5:46 ` [PATCH 04/62] kvargs: add hexadecimal conversion helpers Stephen Hemminger
2026-09-14  5:46 ` [PATCH 05/62] eal: validate memory size arguments Stephen Hemminger
2026-09-14  5:46 ` [PATCH 06/62] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-14  5:46 ` [PATCH 07/62] net/vhost: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 08/62] vdpa/ifc: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 09/62] net/softnic: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 10/62] dma/skeleton: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 11/62] raw/skeleton: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 12/62] baseband/null: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 13/62] net/memif: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 14/62] net/af_packet: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 15/62] net/pcap: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 16/62] net/ring: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 17/62] net/af_xdp: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 18/62] net/ark: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 19/62] net/failsafe: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 20/62] net/virtio: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 21/62] net/bonding: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 22/62] net/ena: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 23/62] net/netvsc: " Stephen Hemminger
2026-09-14 12:43   ` [EXTERNAL] " Wei Hu
2026-09-14  5:46 ` [PATCH 24/62] net/ice: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 25/62] net/iavf: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 26/62] net/i40e: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 27/62] net/idpf: " Stephen Hemminger
2026-09-14  5:46 ` [PATCH 28/62] net/cpfl: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 29/62] net/ixgbe: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 30/62] net/txgbe: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 31/62] net/octeontx: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 32/62] net/octeon_ep: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 33/62] net/qede: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 34/62] net/nfb: " Stephen Hemminger
2026-09-14 14:44   ` Martin Spinler
2026-09-14  5:47 ` [PATCH 35/62] net/thunderx: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 36/62] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-14  5:47 ` [PATCH 37/62] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-14  5:47 ` [PATCH 38/62] net/xsc: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 39/62] net/hns3: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 40/62] net/enetc: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 41/62] event/dlb2: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 42/62] net/nfp: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 43/62] drivers/crypto: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 44/62] event/sw: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 45/62] net/bnxt: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 46/62] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-14  5:47 ` [PATCH 47/62] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-14  5:47 ` [PATCH 48/62] net/sfc: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 49/62] crypto/mvsam: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 50/62] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-14  5:47 ` [PATCH 51/62] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-14  5:47 ` [PATCH 52/62] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-14  5:47 ` [PATCH 53/62] mempool/cnxk: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 54/62] event/octeontx: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 55/62] baseband/turbo_sw: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 56/62] baseband/la12xx: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 57/62] dma/hisi_acc: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 58/62] crypto/virtio: " Stephen Hemminger
2026-09-14  5:47 ` [PATCH 59/62] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-14  5:47 ` [PATCH 60/62] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-14  5:47 ` [PATCH 61/62] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-14  5:47 ` [PATCH 62/62] doc: note kvargs devargs conversion in release notes Stephen Hemminger
2026-09-29 16:36 ` [PATCH v2 00/61] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 01/61] " Stephen Hemminger
2026-09-30  0:49     ` fengchengwen
2026-09-29 16:36   ` [PATCH v2 02/61] kvargs: add a socket ID handler Stephen Hemminger
2026-09-30  1:01     ` fengchengwen
2026-09-29 16:36   ` [PATCH v2 03/61] kvargs: add hexadecimal conversion helpers Stephen Hemminger
2026-09-30  1:07     ` fengchengwen
2026-09-29 16:36   ` [PATCH v2 04/61] eal: validate memory size arguments Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 05/61] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 06/61] net/vhost: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 07/61] vdpa/ifc: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 08/61] net/softnic: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 09/61] dma/skeleton: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 10/61] raw/skeleton: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 11/61] baseband/null: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 12/61] net/memif: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 13/61] net/af_packet: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 14/61] net/pcap: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 15/61] net/ring: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 16/61] net/af_xdp: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 17/61] net/ark: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 18/61] net/failsafe: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 19/61] net/virtio: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 20/61] net/bonding: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 21/61] net/ena: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 22/61] net/netvsc: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 23/61] net/ice: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 24/61] net/iavf: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 25/61] net/i40e: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 26/61] net/idpf: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 27/61] net/cpfl: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 28/61] net/ixgbe: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 29/61] net/txgbe: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 30/61] net/octeontx: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 31/61] net/octeon_ep: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 32/61] net/qede: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 33/61] net/nfb: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 34/61] net/thunderx: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 35/61] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 36/61] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 37/61] net/xsc: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 38/61] net/hns3: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 39/61] net/enetc: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 40/61] event/dlb2: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 41/61] net/nfp: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 42/61] drivers/crypto: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 43/61] event/sw: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 44/61] net/bnxt: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 45/61] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 46/61] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 47/61] net/sfc: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 48/61] crypto/mvsam: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 49/61] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 50/61] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 51/61] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 52/61] mempool/cnxk: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 53/61] event/octeontx: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 54/61] baseband/turbo_sw: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 55/61] baseband/la12xx: " Stephen Hemminger
2026-09-29 16:36   ` [PATCH v2 56/61] dma/hisi_acc: " Stephen Hemminger
2026-09-29 16:37   ` [PATCH v2 57/61] crypto/virtio: " Stephen Hemminger
2026-09-29 16:37   ` [PATCH v2 58/61] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-29 16:37   ` [PATCH v2 59/61] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-29 16:37   ` [PATCH v2 60/61] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-29 16:37   ` [PATCH v2 61/61] doc: note kvargs devargs conversion in release notes Stephen Hemminger
2026-09-30  1:14   ` [PATCH v2 00/61] kvargs: add numeric conversion helpers fengchengwen
2026-09-30 15:21     ` Stephen Hemminger
2026-09-30 22:40 ` [PATCH v3 00/65] " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 01/65] net/ring: make numa node signed Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 02/65] kvargs: add numeric conversion helpers Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 03/65] kvargs: add a socket ID handler Stephen Hemminger
2026-09-30 22:40   ` Stephen Hemminger [this message]
2026-09-30 22:40   ` [PATCH v3 05/65] eal: validate memory size arguments Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 06/65] net/null: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 07/65] net/vhost: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 08/65] vdpa/ifc: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 09/65] net/softnic: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 10/65] dma/skeleton: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 11/65] raw/skeleton: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 12/65] baseband/null: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 13/65] net/memif: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 14/65] net/af_packet: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 15/65] net/pcap: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 16/65] net/ring: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 17/65] net/af_xdp: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 18/65] net/ark: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 19/65] net/failsafe: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 20/65] net/virtio: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 21/65] net/bonding: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 22/65] net/ena: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 23/65] net/netvsc: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 24/65] net/ice: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 25/65] net/iavf: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 26/65] net/i40e: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 27/65] net/idpf: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 28/65] net/cpfl: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 29/65] net/ixgbe: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 30/65] net/txgbe: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 31/65] net/octeontx: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 32/65] net/octeon_ep: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 33/65] net/qede: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 34/65] net/nfb: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 35/65] net/thunderx: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 36/65] net/i40e: propagate VF queue number parse errors Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 37/65] net/cnxk: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 38/65] net/xsc: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 39/65] net/hns3: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 40/65] net/enetc: " Stephen Hemminger
2026-09-30 22:40   ` [PATCH v3 41/65] event/dlb2: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 42/65] net/nfp: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 43/65] drivers/crypto: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 44/65] event/sw: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 45/65] net/bnxt: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 46/65] net/bnxt: propagate devargs parsing errors Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 47/65] net/mlx4: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 48/65] net/sfc: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 49/65] crypto/mvsam: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 50/65] ml/cnxk: use kvargs numeric helpers in cn10k Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 51/65] ml/cnxk: use kvargs numeric helpers in mvtvm Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 52/65] event/opdl: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 53/65] mempool/cnxk: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 54/65] event/octeontx: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 55/65] baseband/turbo_sw: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 56/65] baseband/la12xx: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 57/65] dma/hisi_acc: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 58/65] crypto/virtio: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 59/65] net/ice: use kvargs hex helper for debug mask Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 60/65] net/hns3: use kvargs hex helper for capability mask Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 61/65] net/cxgbe: use kvargs numeric helpers Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 62/65] kvargs: add range conversion handlers Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 63/65] event/sw: use kvargs range handlers Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 64/65] net/cnxk: " Stephen Hemminger
2026-09-30 22:41   ` [PATCH v3 65/65] doc: note kvargs devargs conversion in release notes Stephen Hemminger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260930224340.58580-5-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.org \
    --cc=fengchengwen@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox