[dpdk-dev] ixgbe: add TX queue number check

Message ID 1458634121-1808-1-git-send-email-wenzhuo.lu@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Bruce Richardson
Headers

Commit Message

Wenzhuo Lu March 22, 2016, 8:08 a.m. UTC
  Ixgbe supports at most 128 TX queues. But in none VT nor DCB mode
the queues 64 ~ 127 should not be used. Ixgbe doesn't do any check
about that. If a queue larger than 64 is used, the TX packets will
be dropped silently. It's hard to debug.
This check is added to forbid using queue number larger than 64
during device configuration, so the user can know the problem as
early as possible.

Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
Reported-by: Antonio Fischetti <antonio.fischetti@intel.com>
---
 drivers/net/ixgbe/ixgbe_ethdev.c | 11 ++++++++++-
 drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
 2 files changed, 11 insertions(+), 1 deletion(-)
  

Comments

Michael Qiu March 22, 2016, 8:42 a.m. UTC | #1
On 3/22/2016 4:10 PM, Wenzhuo Lu wrote:
> Ixgbe supports at most 128 TX queues. But in none VT nor DCB mode
> the queues 64 ~ 127 should not be used. Ixgbe doesn't do any check
> about that. If a queue larger than 64 is used, the TX packets will
> be dropped silently. It's hard to debug.
> This check is added to forbid using queue number larger than 64
> during device configuration, so the user can know the problem as
> early as possible.
>
> Signed-off-by: Wenzhuo Lu <wenzhuo.lu@intel.com>
> Reported-by: Antonio Fischetti <antonio.fischetti@intel.com>
> ---

Acked-by: Michael Qiu <michael.qiu@intel.com>

>  drivers/net/ixgbe/ixgbe_ethdev.c | 11 ++++++++++-
>  drivers/net/ixgbe/ixgbe_ethdev.h |  1 +
>  2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
> index 5371720..dd6d00e 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.c
> @@ -1862,7 +1862,7 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
>  {
>  	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
>  	uint16_t nb_rx_q = dev->data->nb_rx_queues;
> -	uint16_t nb_tx_q = dev->data->nb_rx_queues;
> +	uint16_t nb_tx_q = dev->data->nb_tx_queues;
>  
>  	if (RTE_ETH_DEV_SRIOV(dev).active != 0) {
>  		/* check multi-queue mode */
> @@ -2002,6 +2002,15 @@ ixgbe_check_mq_mode(struct rte_eth_dev *dev)
>  				return -EINVAL;
>  			}
>  		}
> +
> +		if (dev_conf->txmode.mq_mode == ETH_MQ_TX_NONE) {
> +			if (nb_tx_q > IXGBE_NONE_VT_DCB_MAX_TXQ_NB) {
> +				PMD_INIT_LOG(ERR,
> +					     "None VT nor DCB, nb_tx_q > %d.",
> +					     IXGBE_NONE_VT_DCB_MAX_TXQ_NB);
> +				return -EINVAL;
> +			}
> +		}
>  	}
>  	return 0;
>  }
> diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
> index 5c3aa16..50ee73f 100644
> --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> @@ -61,6 +61,7 @@
>  #define IXGBE_MAX_RX_QUEUE_NUM	128
>  #define IXGBE_VMDQ_DCB_NB_QUEUES     IXGBE_MAX_RX_QUEUE_NUM
>  #define IXGBE_DCB_NB_QUEUES          IXGBE_MAX_RX_QUEUE_NUM
> +#define IXGBE_NONE_VT_DCB_MAX_TXQ_NB 64
>  
>  #ifndef NBBY
>  #define NBBY	8	/* number of bits in a byte */
  

Patch

diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c
index 5371720..dd6d00e 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.c
+++ b/drivers/net/ixgbe/ixgbe_ethdev.c
@@ -1862,7 +1862,7 @@  ixgbe_check_mq_mode(struct rte_eth_dev *dev)
 {
 	struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
 	uint16_t nb_rx_q = dev->data->nb_rx_queues;
-	uint16_t nb_tx_q = dev->data->nb_rx_queues;
+	uint16_t nb_tx_q = dev->data->nb_tx_queues;
 
 	if (RTE_ETH_DEV_SRIOV(dev).active != 0) {
 		/* check multi-queue mode */
@@ -2002,6 +2002,15 @@  ixgbe_check_mq_mode(struct rte_eth_dev *dev)
 				return -EINVAL;
 			}
 		}
+
+		if (dev_conf->txmode.mq_mode == ETH_MQ_TX_NONE) {
+			if (nb_tx_q > IXGBE_NONE_VT_DCB_MAX_TXQ_NB) {
+				PMD_INIT_LOG(ERR,
+					     "None VT nor DCB, nb_tx_q > %d.",
+					     IXGBE_NONE_VT_DCB_MAX_TXQ_NB);
+				return -EINVAL;
+			}
+		}
 	}
 	return 0;
 }
diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_ethdev.h
index 5c3aa16..50ee73f 100644
--- a/drivers/net/ixgbe/ixgbe_ethdev.h
+++ b/drivers/net/ixgbe/ixgbe_ethdev.h
@@ -61,6 +61,7 @@ 
 #define IXGBE_MAX_RX_QUEUE_NUM	128
 #define IXGBE_VMDQ_DCB_NB_QUEUES     IXGBE_MAX_RX_QUEUE_NUM
 #define IXGBE_DCB_NB_QUEUES          IXGBE_MAX_RX_QUEUE_NUM
+#define IXGBE_NONE_VT_DCB_MAX_TXQ_NB 64
 
 #ifndef NBBY
 #define NBBY	8	/* number of bits in a byte */