[dpdk-dev] [PATCH v4] net/i40e: fix core dumped when setting txq or rxq to 0 in VF

Andy Pei andy.pei at intel.com
Thu Jul 4 03:38:39 CEST 2019


Testpmd would stuck and result in core dump when user specifies an
invalid VF queue number, for example when setting txq or rxq to 0.
When txq or rxq is set to 0, pointer of pointer rxq or txq in
function i40evf_configure_vsi_queues is NULL. The usage of txq[i]
or rxq[0] is valid. This patch fixes this issue.

Fixes: d6b19729093e ("i40evf: support configurable crc stripping")
Cc: helin.zhang at intel.com
Cc: stable at dpdk.org

Signed-off-by: Andy Pei <andy.pei at intel.com>
---
v4:
* use "txq ? txq[i] : txq" to avoid some duplicate.
* a more specific description of the issue in the commit message.

v3:
* no need to use a new line for each parameter when call envoke a
  function. A new line comes when the current line is more than
  80 characters.

    v2:
* modify commit meaasage so one line contains not more than 72
  characters.
* delete unnecessary parentheses around 'queue_id < nb_txq'
* delete unnecessary parentheses around 'queue_id < nb_rxq'

Cc: roy.fan.zhang at intel.com
Cc: qi.z.zhang at intel.com
Cc: jingjing.wu at intel.com
Cc: beilei.xing at intel.com
Cc: ferruh.yigit at intel.com
Cc: rosen.xu at intel.com
Cc: xiaolong.ye at intel.com

 drivers/net/i40e/i40e_ethdev_vf.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index d922a84..5be32b0 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -573,7 +573,7 @@ struct rte_i40evf_xstats_name_off {
 {
 	txq_info->vsi_id = vsi_id;
 	txq_info->queue_id = queue_id;
-	if (queue_id < nb_txq) {
+	if (queue_id < nb_txq && txq) {
 		txq_info->ring_len = txq->nb_tx_desc;
 		txq_info->dma_ring_addr = txq->tx_ring_phys_addr;
 	}
@@ -590,7 +590,7 @@ struct rte_i40evf_xstats_name_off {
 	rxq_info->vsi_id = vsi_id;
 	rxq_info->queue_id = queue_id;
 	rxq_info->max_pkt_size = max_pkt_size;
-	if (queue_id < nb_rxq) {
+	if (queue_id < nb_rxq && rxq) {
 		rxq_info->ring_len = rxq->nb_rx_desc;
 		rxq_info->dma_ring_addr = rxq->rx_ring_phys_addr;
 		rxq_info->databuffer_size =
@@ -623,10 +623,11 @@ struct rte_i40evf_xstats_name_off {
 
 	for (i = 0, vc_qpi = vc_vqci->qpair; i < nb_qp; i++, vc_qpi++) {
 		i40evf_fill_virtchnl_vsi_txq_info(&vc_qpi->txq,
-			vc_vqci->vsi_id, i, dev->data->nb_tx_queues, txq[i]);
+			vc_vqci->vsi_id, i, dev->data->nb_tx_queues,
+			txq ? txq[i] : NULL);
 		i40evf_fill_virtchnl_vsi_rxq_info(&vc_qpi->rxq,
 			vc_vqci->vsi_id, i, dev->data->nb_rx_queues,
-					vf->max_pkt_len, rxq[i]);
+			vf->max_pkt_len, rxq ? rxq[i] : NULL);
 	}
 	memset(&args, 0, sizeof(args));
 	args.ops = VIRTCHNL_OP_CONFIG_VSI_QUEUES;
-- 
1.8.3.1



More information about the dev mailing list