[dpdk-dev,1/2] net/i40e: fix VFIO interrupt mapping in VF

Message ID 1509628256-16300-2-git-send-email-wei.dai@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers

Checks

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

Commit Message

Wei Dai Nov. 2, 2017, 1:10 p.m. UTC
  When a VF port is bound to VFIO-PIC, only miscellaneous interrupt
is mapped to VFIO vector 0 in i40evf_dev_init( ).
In ixgbevf_dev_interrupt_handler( ), if previous VFIO interrupt
mapping set in i40evf_dev_init( ) is not cleard, it will fail when
calling rte_intr_enable( ) tries to map Rx queue interrupt to other
VFIO vectors. This patch clears the VFIO interrupt mappings before
setting both miscellaneous and Rx queue interrupt mappings again
to avoid failure.

Fixes: 4b90a3ff26c5 ("i40evf: support Rx interrupt")
Cc: stable@dpdk.org

Signed-off-by: Wei Dai <wei.dai@intel.com>
---
 drivers/net/i40e/i40e_ethdev_vf.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
  

Comments

Jingjing Wu Nov. 3, 2017, 2:25 a.m. UTC | #1
> -----Original Message-----
> From: Dai, Wei
> Sent: Thursday, November 2, 2017 9:11 PM
> To: Wu, Jingjing <jingjing.wu@intel.com>; Xing, Beilei <beilei.xing@intel.com>;
> Liang, Cunming <cunming.liang@intel.com>
> Cc: dev@dpdk.org; Dai, Wei <wei.dai@intel.com>; stable@dpdk.org
> Subject: [PATCH 1/2] net/i40e: fix VFIO interrupt mapping in VF
> 
> When a VF port is bound to VFIO-PIC, only miscellaneous interrupt is mapped to
> VFIO vector 0 in i40evf_dev_init( ).
> In ixgbevf_dev_interrupt_handler( ), if previous VFIO interrupt mapping set in

Ixgbevf? Should be i40evf?

> i40evf_dev_init( ) is not cleard, it will fail when calling rte_intr_enable( ) tries
> to map Rx queue interrupt to other VFIO vectors. This patch clears the VFIO
> interrupt mappings before setting both miscellaneous and Rx queue interrupt
> mappings again to avoid failure.
> 
> Fixes: 4b90a3ff26c5 ("i40evf: support Rx interrupt")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Wei Dai <wei.dai@intel.com>
> ---
>  drivers/net/i40e/i40e_ethdev_vf.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 3b76c9e..567b7d0 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -1432,8 +1432,9 @@ i40evf_dev_interrupt_handler(void *param)
>  				   " do nothing");
> 
>  done:
> -	i40evf_enable_irq0(hw);
> +	rte_intr_disable(dev->intr_handle);
>  	rte_intr_enable(dev->intr_handle);
> +	i40evf_enable_irq0(hw);

If that reason, you can move the rte_intr_disable to dev_start when deal with the rxq setting in intr_conf.
>  }
> 
>  static int
> --
> 2.7.5
  
Wei Dai Nov. 3, 2017, 5:48 a.m. UTC | #2
Hi, Jingjing
Thanks for your feedback.

> > Subject: [PATCH 1/2] net/i40e: fix VFIO interrupt mapping in VF
> >
> > When a VF port is bound to VFIO-PIC, only miscellaneous interrupt is
> > mapped to VFIO vector 0 in i40evf_dev_init( ).
> > In ixgbevf_dev_interrupt_handler( ), if previous VFIO interrupt
> > mapping set in
> 
> Ixgbevf? Should be i40evf?
Yes, it is my typo error, it should be i40evf. 
> 
> > i40evf_dev_init( ) is not cleard, it will fail when calling
> > rte_intr_enable( ) tries to map Rx queue interrupt to other VFIO
> > vectors. This patch clears the VFIO interrupt mappings before setting
> > both miscellaneous and Rx queue interrupt mappings again to avoid
> failure.
> >
> > Fixes: 4b90a3ff26c5 ("i40evf: support Rx interrupt")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Wei Dai <wei.dai@intel.com>
> > ---
> >  drivers/net/i40e/i40e_ethdev_vf.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> > b/drivers/net/i40e/i40e_ethdev_vf.c
> > index 3b76c9e..567b7d0 100644
> > --- a/drivers/net/i40e/i40e_ethdev_vf.c
> > +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> > @@ -1432,8 +1432,9 @@ i40evf_dev_interrupt_handler(void *param)
> >  				   " do nothing");
> >
> >  done:
> > -	i40evf_enable_irq0(hw);
> > +	rte_intr_disable(dev->intr_handle);
> >  	rte_intr_enable(dev->intr_handle);
> > +	i40evf_enable_irq0(hw);
> 
> If that reason, you can move the rte_intr_disable to dev_start when deal
> with the rxq setting in intr_conf.

Yes, I have followed your suggestion and tested it with my following code change.
it works well.
The function rte_intr_disable( ) can be moved into i40evf_dev_start( ) and only
be called it if rx queue interrupt is enabled.
Meanwhile, the calling of rte_intr_enable( ) in i40evf_dev_interrupt_handle( )
and i40evf_dev_rx_queue_intr_enable( ) can also be removed.


> >  }
> >
> >  static int
> > --
> > 2.7.5
  

Patch

diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index 3b76c9e..567b7d0 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -1432,8 +1432,9 @@  i40evf_dev_interrupt_handler(void *param)
 				   " do nothing");
 
 done:
-	i40evf_enable_irq0(hw);
+	rte_intr_disable(dev->intr_handle);
 	rte_intr_enable(dev->intr_handle);
+	i40evf_enable_irq0(hw);
 }
 
 static int