[v4] net/iavf: fix Tx interrupt vertor configuration error

Message ID 1553576879-8824-1-git-send-email-wei.zhao1@intel.com
State Rejected, archived
Delegated to: Qi Zhang
Headers show
Series
  • [v4] net/iavf: fix Tx interrupt vertor configuration error
Related show

Checks

Context Check Description
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing fail Performance Testing issues
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Zhao1, Wei March 26, 2019, 5:07 a.m.
There is need to align to kernel iavf code when setting Tx
queue interrupt vector in messge VIRTCHNL_OP_CONFIG_IRQ_MAP,
if not it maybe cause restart iavf port error in some scenario.

Fixes: 69dd4c3d0898 ("net/avf: enable queue and device")
Cc: stable@dpdk.org

Signed-off-by: Wei Zhao <wei.zhao1@intel.com>

---

v2:
update git log and add new work around

v3:
update git comment and change fix code as suggestion

v4:
add txq_map in struct avf_info to keep vector mapping info
---
 drivers/net/iavf/iavf.h        | 1 +
 drivers/net/iavf/iavf_ethdev.c | 9 +++++++++
 drivers/net/iavf/iavf_vchnl.c  | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

Comments

Zhang, Qi Z March 26, 2019, 7:03 a.m. | #1
> -----Original Message-----
> From: Zhao1, Wei
> Sent: Tuesday, March 26, 2019 1:08 PM
> To: dev@dpdk.org
> Cc: stable@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>; Zhao1, Wei
> <wei.zhao1@intel.com>
> Subject: [PATCH v4] net/iavf: fix Tx interrupt vertor configuration error
> 
> There is need to align to kernel iavf code when setting Tx queue interrupt vector
> in messge VIRTCHNL_OP_CONFIG_IRQ_MAP, if not it maybe cause restart iavf
> port error in some scenario.

Actually , we are not aligned with kernel iavf's implementation which assume rxq = txq

Reword the commit log as below:

	According to latest AVF virtual channel spec, interrupt vector is
    required to be configured for each Tx queue.
    The patch implemented the mechanism by assign interrupt vector to
    each Tx queue with round robin (same method for Rx queue).
    This also fixed the unexpected Tx queue config error when hosted by
    ice kernel driver.

> 
> Fixes: 69dd4c3d0898 ("net/avf: enable queue and device")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
> 

Acked-by: Qi Zhang <qi.z.zhang@intel.com>

Applied to dpdk-next-net-intel with above change.

Thanks
Qi

> ---
> 
> v2:
> update git log and add new work around
> 
> v3:
> update git comment and change fix code as suggestion
> 
> v4:
> add txq_map in struct avf_info to keep vector mapping info
> ---
>  drivers/net/iavf/iavf.h        | 1 +
>  drivers/net/iavf/iavf_ethdev.c | 9 +++++++++  drivers/net/iavf/iavf_vchnl.c
> | 2 +-
>  3 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index
> e6e3e8d..81d0054 100644
> --- a/drivers/net/iavf/iavf.h
> +++ b/drivers/net/iavf/iavf.h
> @@ -107,6 +107,7 @@ struct iavf_info {
>  	uint16_t msix_base; /* msix vector base from */
>  	/* queue bitmask for each vector */
>  	uint16_t rxq_map[IAVF_MAX_MSIX_VECTORS];
> +	uint16_t txq_map[IAVF_MAX_MSIX_VECTORS];
>  };
> 
>  #define IAVF_MAX_PKT_TYPE 256
> diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index
> 846e604..187a31c 100644
> --- a/drivers/net/iavf/iavf_ethdev.c
> +++ b/drivers/net/iavf/iavf_ethdev.c
> @@ -336,6 +336,8 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev
> *dev,
>  		/* map all queues to the same interrupt */
>  		for (i = 0; i < dev->data->nb_rx_queues; i++)
>  			vf->rxq_map[vf->msix_base] |= 1 << i;
> +		for (i = 0; i < dev->data->nb_tx_queues; i++)
> +			vf->txq_map[vf->msix_base] |= 1 << i;
>  	} else {
>  		if (!rte_intr_allow_others(intr_handle)) {
>  			vf->nb_msix = 1;
> @@ -344,6 +346,8 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev
> *dev,
>  				vf->rxq_map[vf->msix_base] |= 1 << i;
>  				intr_handle->intr_vec[i] = IAVF_MISC_VEC_ID;
>  			}
> +			for (i = 0; i < dev->data->nb_tx_queues; i++)
> +				vf->txq_map[vf->msix_base] |= 1 << i;
>  			PMD_DRV_LOG(DEBUG,
>  				    "vector %u are mapping to all Rx queues",
>  				    vf->msix_base);
> @@ -361,6 +365,11 @@ static int iavf_config_rx_queues_irqs(struct rte_eth_dev
> *dev,
>  				if (vec >= vf->nb_msix)
>  					vec = IAVF_RX_VEC_START;
>  			}
> +			for (i = 0; i < dev->data->nb_tx_queues; i++) {
> +				vf->txq_map[vec++] |= 1 << i;
> +				if (vec >= vf->nb_msix)
> +					vec = IAVF_RX_VEC_START;
> +			}
>  			PMD_DRV_LOG(DEBUG,
>  				    "%u vectors are mapping to %u Rx queues",
>  				    vf->nb_msix, dev->data->nb_rx_queues); diff --git
> a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index
> 6381fb6..620e011 100644
> --- a/drivers/net/iavf/iavf_vchnl.c
> +++ b/drivers/net/iavf/iavf_vchnl.c
> @@ -614,7 +614,7 @@ iavf_config_irq_map(struct iavf_adapter *adapter)
>  		vecmap->vsi_id = vf->vsi_res->vsi_id;
>  		vecmap->rxitr_idx = IAVF_ITR_INDEX_DEFAULT;
>  		vecmap->vector_id = vf->msix_base + i;
> -		vecmap->txq_map = 0;
> +		vecmap->txq_map = vf->txq_map[vf->msix_base + i];
>  		vecmap->rxq_map = vf->rxq_map[vf->msix_base + i];
>  	}
> 
> --
> 2.7.5
Zhang, Qi Z April 2, 2019, 2:49 a.m. | #2
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Zhang, Qi Z
> Sent: Tuesday, March 26, 2019 3:03 PM
> To: Zhao1, Wei <wei.zhao1@intel.com>; dev@dpdk.org
> Cc: stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v4] net/iavf: fix Tx interrupt vertor configuration
> error
> 
> 
> 
> > -----Original Message-----
> > From: Zhao1, Wei
> > Sent: Tuesday, March 26, 2019 1:08 PM
> > To: dev@dpdk.org
> > Cc: stable@dpdk.org; Zhang, Qi Z <qi.z.zhang@intel.com>; Zhao1, Wei
> > <wei.zhao1@intel.com>
> > Subject: [PATCH v4] net/iavf: fix Tx interrupt vertor configuration
> > error
> >
> > There is need to align to kernel iavf code when setting Tx queue
> > interrupt vector in messge VIRTCHNL_OP_CONFIG_IRQ_MAP, if not it maybe
> > cause restart iavf port error in some scenario.
> 
> Actually , we are not aligned with kernel iavf's implementation which assume rxq
> = txq
> 
> Reword the commit log as below:
> 
> 	According to latest AVF virtual channel spec, interrupt vector is
>     required to be configured for each Tx queue.
>     The patch implemented the mechanism by assign interrupt vector to
>     each Tx queue with round robin (same method for Rx queue).
>     This also fixed the unexpected Tx queue config error when hosted by
>     ice kernel driver.
> 
> >
> > Fixes: 69dd4c3d0898 ("net/avf: enable queue and device")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Wei Zhao <wei.zhao1@intel.com>
> >
> 
> Acked-by: Qi Zhang <qi.z.zhang@intel.com>
> 
> Applied to dpdk-next-net-intel with above change.

The patch is dropped due to the limitation is removed from virtual channel, no need to worry about Tx interrupt vector in vf side.


> 
> Thanks
> Qi
> 
> > ---
> >
> > v2:
> > update git log and add new work around
> >
> > v3:
> > update git comment and change fix code as suggestion
> >
> > v4:
> > add txq_map in struct avf_info to keep vector mapping info
> > ---
> >  drivers/net/iavf/iavf.h        | 1 +
> >  drivers/net/iavf/iavf_ethdev.c | 9 +++++++++
> > drivers/net/iavf/iavf_vchnl.c
> > | 2 +-
> >  3 files changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h index
> > e6e3e8d..81d0054 100644
> > --- a/drivers/net/iavf/iavf.h
> > +++ b/drivers/net/iavf/iavf.h
> > @@ -107,6 +107,7 @@ struct iavf_info {
> >  	uint16_t msix_base; /* msix vector base from */
> >  	/* queue bitmask for each vector */
> >  	uint16_t rxq_map[IAVF_MAX_MSIX_VECTORS];
> > +	uint16_t txq_map[IAVF_MAX_MSIX_VECTORS];
> >  };
> >
> >  #define IAVF_MAX_PKT_TYPE 256
> > diff --git a/drivers/net/iavf/iavf_ethdev.c
> > b/drivers/net/iavf/iavf_ethdev.c index 846e604..187a31c 100644
> > --- a/drivers/net/iavf/iavf_ethdev.c
> > +++ b/drivers/net/iavf/iavf_ethdev.c
> > @@ -336,6 +336,8 @@ static int iavf_config_rx_queues_irqs(struct
> > rte_eth_dev *dev,
> >  		/* map all queues to the same interrupt */
> >  		for (i = 0; i < dev->data->nb_rx_queues; i++)
> >  			vf->rxq_map[vf->msix_base] |= 1 << i;
> > +		for (i = 0; i < dev->data->nb_tx_queues; i++)
> > +			vf->txq_map[vf->msix_base] |= 1 << i;
> >  	} else {
> >  		if (!rte_intr_allow_others(intr_handle)) {
> >  			vf->nb_msix = 1;
> > @@ -344,6 +346,8 @@ static int iavf_config_rx_queues_irqs(struct
> > rte_eth_dev *dev,
> >  				vf->rxq_map[vf->msix_base] |= 1 << i;
> >  				intr_handle->intr_vec[i] = IAVF_MISC_VEC_ID;
> >  			}
> > +			for (i = 0; i < dev->data->nb_tx_queues; i++)
> > +				vf->txq_map[vf->msix_base] |= 1 << i;
> >  			PMD_DRV_LOG(DEBUG,
> >  				    "vector %u are mapping to all Rx queues",
> >  				    vf->msix_base);
> > @@ -361,6 +365,11 @@ static int iavf_config_rx_queues_irqs(struct
> > rte_eth_dev *dev,
> >  				if (vec >= vf->nb_msix)
> >  					vec = IAVF_RX_VEC_START;
> >  			}
> > +			for (i = 0; i < dev->data->nb_tx_queues; i++) {
> > +				vf->txq_map[vec++] |= 1 << i;
> > +				if (vec >= vf->nb_msix)
> > +					vec = IAVF_RX_VEC_START;
> > +			}
> >  			PMD_DRV_LOG(DEBUG,
> >  				    "%u vectors are mapping to %u Rx queues",
> >  				    vf->nb_msix, dev->data->nb_rx_queues); diff --git
> > a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c index
> > 6381fb6..620e011 100644
> > --- a/drivers/net/iavf/iavf_vchnl.c
> > +++ b/drivers/net/iavf/iavf_vchnl.c
> > @@ -614,7 +614,7 @@ iavf_config_irq_map(struct iavf_adapter *adapter)
> >  		vecmap->vsi_id = vf->vsi_res->vsi_id;
> >  		vecmap->rxitr_idx = IAVF_ITR_INDEX_DEFAULT;
> >  		vecmap->vector_id = vf->msix_base + i;
> > -		vecmap->txq_map = 0;
> > +		vecmap->txq_map = vf->txq_map[vf->msix_base + i];
> >  		vecmap->rxq_map = vf->rxq_map[vf->msix_base + i];
> >  	}
> >
> > --
> > 2.7.5

Patch

diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h
index e6e3e8d..81d0054 100644
--- a/drivers/net/iavf/iavf.h
+++ b/drivers/net/iavf/iavf.h
@@ -107,6 +107,7 @@  struct iavf_info {
 	uint16_t msix_base; /* msix vector base from */
 	/* queue bitmask for each vector */
 	uint16_t rxq_map[IAVF_MAX_MSIX_VECTORS];
+	uint16_t txq_map[IAVF_MAX_MSIX_VECTORS];
 };
 
 #define IAVF_MAX_PKT_TYPE 256
diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c
index 846e604..187a31c 100644
--- a/drivers/net/iavf/iavf_ethdev.c
+++ b/drivers/net/iavf/iavf_ethdev.c
@@ -336,6 +336,8 @@  static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
 		/* map all queues to the same interrupt */
 		for (i = 0; i < dev->data->nb_rx_queues; i++)
 			vf->rxq_map[vf->msix_base] |= 1 << i;
+		for (i = 0; i < dev->data->nb_tx_queues; i++)
+			vf->txq_map[vf->msix_base] |= 1 << i;
 	} else {
 		if (!rte_intr_allow_others(intr_handle)) {
 			vf->nb_msix = 1;
@@ -344,6 +346,8 @@  static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
 				vf->rxq_map[vf->msix_base] |= 1 << i;
 				intr_handle->intr_vec[i] = IAVF_MISC_VEC_ID;
 			}
+			for (i = 0; i < dev->data->nb_tx_queues; i++)
+				vf->txq_map[vf->msix_base] |= 1 << i;
 			PMD_DRV_LOG(DEBUG,
 				    "vector %u are mapping to all Rx queues",
 				    vf->msix_base);
@@ -361,6 +365,11 @@  static int iavf_config_rx_queues_irqs(struct rte_eth_dev *dev,
 				if (vec >= vf->nb_msix)
 					vec = IAVF_RX_VEC_START;
 			}
+			for (i = 0; i < dev->data->nb_tx_queues; i++) {
+				vf->txq_map[vec++] |= 1 << i;
+				if (vec >= vf->nb_msix)
+					vec = IAVF_RX_VEC_START;
+			}
 			PMD_DRV_LOG(DEBUG,
 				    "%u vectors are mapping to %u Rx queues",
 				    vf->nb_msix, dev->data->nb_rx_queues);
diff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c
index 6381fb6..620e011 100644
--- a/drivers/net/iavf/iavf_vchnl.c
+++ b/drivers/net/iavf/iavf_vchnl.c
@@ -614,7 +614,7 @@  iavf_config_irq_map(struct iavf_adapter *adapter)
 		vecmap->vsi_id = vf->vsi_res->vsi_id;
 		vecmap->rxitr_idx = IAVF_ITR_INDEX_DEFAULT;
 		vecmap->vector_id = vf->msix_base + i;
-		vecmap->txq_map = 0;
+		vecmap->txq_map = vf->txq_map[vf->msix_base + i];
 		vecmap->rxq_map = vf->rxq_map[vf->msix_base + i];
 	}