Thread (198 messages) 198 messages, 4 authors, 3d ago

[PATCH v3 64/65] net/cnxk: use kvargs range handlers

WARM3d

From: Stephen Hemminger <stephen@networkplumber.org>
Date: 2026-09-30 22:50:27
Subsystem: networking drivers, the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds

Five of the six handlers here applied a range and stored the result,
and returned -EINVAL without logging, so a value out of range was
rejected with nothing to say what the range was.

Use rte_kvargs_handle_urange() for those five. parse_reta_size() keeps
its handler since it rounds the value up to a supported table size
rather than rejecting it.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 drivers/net/cnxk/cnxk_ethdev_devargs.c | 112 +++++--------------------
 1 file changed, 21 insertions(+), 91 deletions(-)
diff --git a/drivers/net/cnxk/cnxk_ethdev_devargs.c b/drivers/net/cnxk/cnxk_ethdev_devargs.c
index 887349fe24..18472d54b8 100644
--- a/drivers/net/cnxk/cnxk_ethdev_devargs.c
+++ b/drivers/net/cnxk/cnxk_ethdev_devargs.c
@@ -21,67 +21,6 @@ struct flow_pre_l2_size_info {
 	uint8_t pre_l2_size_shift_dir;
 };
 
-static int
-parse_outb_nb_crypto_qs(const char *key, const char *value, void *extra_args)
-{
-	uint64_t val;
-
-	RTE_SET_USED(key);
-
-	if (rte_kvargs_to_uint(value, 1, 64, &val) < 0)
-		return -EINVAL;
-
-	*(uint16_t *)extra_args = val;
-
-	return 0;
-}
-
-static int
-parse_rxc_step(const char *key, const char *value, void *extra_args)
-{
-	uint64_t val;
-
-	RTE_SET_USED(key);
-
-	if (rte_kvargs_to_uint(value, 0, ROC_NIX_INL_REAS_STEP_MAX, &val) < 0)
-		return -EINVAL;
-
-	*(uint32_t *)extra_args = val;
-
-	return 0;
-}
-
-static int
-parse_flow_max_priority(const char *key, const char *value, void *extra_args)
-{
-	uint64_t val;
-
-	RTE_SET_USED(key);
-
-	if (rte_kvargs_to_uint(value, 1, ROC_NPC_MAX_MCAM_PRIORITY, &val) < 0)
-		return -EINVAL;
-
-	*(uint16_t *)extra_args = val;
-
-	return 0;
-}
-
-static int
-parse_flow_prealloc_size(const char *key, const char *value, void *extra_args)
-{
-	uint64_t val;
-
-	RTE_SET_USED(key);
-
-	/* Limit the prealloc size to 32 */
-	if (rte_kvargs_to_uint(value, 1, 32, &val) < 0)
-		return -EINVAL;
-
-	*(uint16_t *)extra_args = val;
-
-	return 0;
-}
-
 static int
 parse_reta_size(const char *key, const char *value, void *extra_args)
 {
@@ -158,21 +97,6 @@ parse_switch_header_type(const char *key, const char *value, void *extra_args)
 	return 0;
 }
 
-static int
-parse_skip_size_info(const char *key, const char *value, void *extra_args)
-{
-	uint64_t val;
-
-	RTE_SET_USED(key);
-
-	if (rte_kvargs_to_uint(value, 0, 255, &val) < 0)
-		return -EINVAL;
-
-	*(uint16_t *)extra_args = val;
-
-	return 0;
-}
-
 static int
 parse_sdp_channel_mask(const char *key, const char *value, void *extra_args)
 {
@@ -234,11 +158,15 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	uint16_t sqb_slack = ROC_NIX_SQB_SLACK;
 	uint32_t ipsec_out_max_sa = BIT(12);
 	bool custom_meta_aura_dis = false;
-	uint16_t flow_prealloc_size = 1;
+	struct rte_kvargs_urange flow_prealloc_size = {
+		.min = 1, .max = 32, .val = 1 };
 	uint16_t switch_header_type = 0;
-	uint16_t skip_size_info = 0;
-	uint16_t flow_max_priority = 3;
-	uint16_t outb_nb_crypto_qs = 1;
+	struct rte_kvargs_urange skip_size_info = {
+		.min = 0, .max = 255, .val = 0 };
+	struct rte_kvargs_urange flow_max_priority = {
+		.min = 1, .max = ROC_NPC_MAX_MCAM_PRIORITY, .val = 3 };
+	struct rte_kvargs_urange outb_nb_crypto_qs = {
+		.min = 1, .max = 64, .val = 1 };
 	uint32_t ipsec_in_min_spi = 0;
 	uint16_t outb_nb_desc = 8200;
 	struct sdp_channel sdp_chan;
@@ -254,7 +182,8 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	bool lock_rx_ctx = false;
 	bool rx_inj_ena = false;
 	bool no_inl_dev = false;
-	uint32_t rxc_step = 0;
+	struct rte_kvargs_urange rxc_step = {
+		.min = 0, .max = ROC_NIX_INL_REAS_STEP_MAX, .val = 0 };
 	int ret;
 
 	memset(&sdp_chan, 0, sizeof(sdp_chan));
@@ -277,9 +206,9 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	ret |= rte_kvargs_process(kvlist, CNXK_MAX_SQB_COUNT, rte_kvargs_handle_u16,
 				  &sqb_count);
 	ret |= rte_kvargs_process(kvlist, CNXK_FLOW_PREALLOC_SIZE,
-				  &parse_flow_prealloc_size, &flow_prealloc_size);
+				  rte_kvargs_handle_urange, &flow_prealloc_size);
 	ret |= rte_kvargs_process(kvlist, CNXK_FLOW_MAX_PRIORITY,
-				  &parse_flow_max_priority, &flow_max_priority);
+				  rte_kvargs_handle_urange, &flow_max_priority);
 	ret |= rte_kvargs_process(kvlist, CNXK_SWITCH_HEADER_TYPE,
 				  &parse_switch_header_type, &switch_header_type);
 	ret |= rte_kvargs_process_opt(kvlist, CNXK_RSS_TAG_AS_XOR, rte_kvargs_handle_bool,
@@ -295,7 +224,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	ret |= rte_kvargs_process(kvlist, CNXK_OUTB_NB_DESC, rte_kvargs_handle_u16,
 				  &outb_nb_desc);
 	ret |= rte_kvargs_process(kvlist, CNXK_OUTB_NB_CRYPTO_QS,
-				  &parse_outb_nb_crypto_qs, &outb_nb_crypto_qs);
+				  rte_kvargs_handle_urange, &outb_nb_crypto_qs);
 	ret |= rte_kvargs_process_opt(kvlist, CNXK_NO_INL_DEV, rte_kvargs_handle_bool,
 				  &no_inl_dev);
 	ret |= rte_kvargs_process(kvlist, CNXK_SDP_CHANNEL_MASK,
@@ -320,8 +249,9 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 				  &force_tail_drop);
 	ret |= rte_kvargs_process_opt(kvlist, CNXK_DIS_XQE_DROP, rte_kvargs_handle_bool,
 				  &dis_xqe_drop);
-	ret |= rte_kvargs_process(kvlist, CNXK_RXC_STEP, &parse_rxc_step, &rxc_step);
-	ret |= rte_kvargs_process(kvlist, CNXK_SKIP_SIZE_INFO, &parse_skip_size_info,
+	ret |= rte_kvargs_process(kvlist, CNXK_RXC_STEP, rte_kvargs_handle_urange,
+				  &rxc_step);
+	ret |= rte_kvargs_process(kvlist, CNXK_SKIP_SIZE_INFO, rte_kvargs_handle_urange,
 				  &skip_size_info);
 	rte_kvargs_free(kvlist);
 
@@ -337,7 +267,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	dev->inb.custom_meta_aura_dis = custom_meta_aura_dis;
 	dev->outb.max_sa = ipsec_out_max_sa;
 	dev->outb.nb_desc = outb_nb_desc;
-	dev->outb.nb_crypto_qs = outb_nb_crypto_qs;
+	dev->outb.nb_crypto_qs = outb_nb_crypto_qs.val;
 	dev->nix.ipsec_out_max_sa = ipsec_out_max_sa;
 	dev->nix.rss_tag_as_xor = rss_tag_as_xor;
 	dev->nix.max_sqb_count = sqb_count;
@@ -350,15 +280,15 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 	if (roc_feature_nix_has_own_meta_aura())
 		dev->nix.meta_buf_sz = meta_buf_sz;
 
-	dev->npc.flow_prealloc_size = flow_prealloc_size;
+	dev->npc.flow_prealloc_size = flow_prealloc_size.val;
 
 	if (roc_model_is_cn20k())
 		dev->npc.flow_max_priority = ROC_NPC_MAX_MCAM_PRIORITY;
 	else
-		dev->npc.flow_max_priority = flow_max_priority;
+		dev->npc.flow_max_priority = flow_max_priority.val;
 
 	dev->npc.switch_header_type = switch_header_type;
-	dev->npc.skip_size = skip_size_info;
+	dev->npc.skip_size = skip_size_info.val;
 	dev->npc.sdp_channel = sdp_chan.channel;
 	dev->npc.sdp_channel_mask = sdp_chan.mask;
 	dev->npc.is_sdp_mask_set = sdp_chan.is_sdp_mask_set;
@@ -370,7 +300,7 @@ cnxk_ethdev_parse_devargs(struct rte_devargs *devargs, struct cnxk_eth_dev *dev)
 		dev->nix.rx_inj_ena = rx_inj_ena;
 	dev->nix.force_tail_drop = force_tail_drop;
 	dev->nix.dis_xqe_drop = dis_xqe_drop;
-	dev->nix.rxc_step = rxc_step;
+	dev->nix.rxc_step = rxc_step.val;
 	return 0;
 exit:
 	return -EINVAL;
-- 
2.53.0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help