[v2,2/2] net/ice: avoid the parsed devargs value being overwritten

Message ID 20191014145005.94650-3-haiyue.wang@intel.com (mailing list archive)
State Accepted, archived
Delegated to: xiaolong ye
Headers
Series net/ice: protocol extraction related issues |

Checks

Context Check Description
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Wang, Haiyue Oct. 14, 2019, 2:50 p.m. UTC
  If the default dev args 'proto_xtr' is not in the first position, it
will overwrite the parsed queue map value, so use an new variable to
save the default.

And enhance the error message printing to show the right information.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
---
 drivers/net/ice/ice_ethdev.c | 42 +++++++++++++++++++++++++-----------
 drivers/net/ice/ice_ethdev.h |  1 +
 2 files changed, 30 insertions(+), 13 deletions(-)
  

Patch

diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c
index 880d2679b..440203247 100644
--- a/drivers/net/ice/ice_ethdev.c
+++ b/drivers/net/ice/ice_ethdev.c
@@ -428,8 +428,7 @@  parse_queue_proto_xtr(const char *queues, struct ice_devargs *devargs)
 		if (xtr_type < 0)
 			return -1;
 
-		memset(devargs->proto_xtr, xtr_type,
-		       sizeof(devargs->proto_xtr));
+		devargs->proto_xtr_dflt = xtr_type;
 
 		return 0;
 	}
@@ -1369,12 +1368,36 @@  ice_interrupt_handler(void *param)
 	rte_intr_ack(dev->intr_handle);
 }
 
+static void
+ice_init_proto_xtr(struct rte_eth_dev *dev)
+{
+	struct ice_adapter *ad =
+			ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
+	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+	struct ice_hw *hw = ICE_PF_TO_HW(pf);
+	uint16_t i;
+
+	if (!ice_proto_xtr_support(hw)) {
+		PMD_DRV_LOG(NOTICE, "Protocol extraction is not supported");
+		return;
+	}
+
+	pf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0);
+	if (unlikely(pf->proto_xtr == NULL)) {
+		PMD_DRV_LOG(ERR, "No memory for setting up protocol extraction table");
+		return;
+	}
+
+	for (i = 0; i < pf->lan_nb_qps; i++)
+		pf->proto_xtr[i] = ad->devargs.proto_xtr[i] != PROTO_XTR_NONE ?
+				   ad->devargs.proto_xtr[i] :
+				   ad->devargs.proto_xtr_dflt;
+}
+
 /*  Initialize SW parameters of PF */
 static int
 ice_pf_sw_init(struct rte_eth_dev *dev)
 {
-	struct ice_adapter *ad =
-			ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
 	struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 	struct ice_hw *hw = ICE_PF_TO_HW(pf);
 
@@ -1384,15 +1407,7 @@  ice_pf_sw_init(struct rte_eth_dev *dev)
 
 	pf->lan_nb_qps = pf->lan_nb_qp_max;
 
-	if (ice_proto_xtr_support(hw))
-		pf->proto_xtr = rte_zmalloc(NULL, pf->lan_nb_qps, 0);
-
-	if (pf->proto_xtr != NULL)
-		rte_memcpy(pf->proto_xtr, ad->devargs.proto_xtr,
-			   RTE_MIN((size_t)pf->lan_nb_qps,
-				   sizeof(ad->devargs.proto_xtr)));
-	else
-		PMD_DRV_LOG(NOTICE, "Protocol extraction is disabled");
+	ice_init_proto_xtr(dev);
 
 	return 0;
 }
@@ -1805,6 +1820,7 @@  static int ice_parse_devargs(struct rte_eth_dev *dev)
 		return -EINVAL;
 	}
 
+	ad->devargs.proto_xtr_dflt = PROTO_XTR_NONE;
 	memset(ad->devargs.proto_xtr, PROTO_XTR_NONE,
 	       sizeof(ad->devargs.proto_xtr));
 
diff --git a/drivers/net/ice/ice_ethdev.h b/drivers/net/ice/ice_ethdev.h
index 182c6f611..2fd98817b 100644
--- a/drivers/net/ice/ice_ethdev.h
+++ b/drivers/net/ice/ice_ethdev.h
@@ -288,6 +288,7 @@  struct ice_pf {
  */
 struct ice_devargs {
 	int safe_mode_support;
+	uint8_t proto_xtr_dflt;
 	uint8_t proto_xtr[ICE_MAX_QUEUE_NUM];
 };