[dpdk-dev,1/2] net/i40e: fix VFIO interrupt mapping in VF
Checks
Commit Message
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
> -----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
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
@@ -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