In i40e_dev_interrupt_handler, when call rte_intr_enable, the intr_handle is the copy when we registered. According to interrupt handle framework, if the requirement of intr_handle is changed, we need to unregister then register a new copy. This happens on i40e driver when bind to vfio-pci, the rte_intr_efd_enable function will modify the max_intr according the queue number, so a new copy of intr_handle need to be registered. Without this fix, we saw lw3fwd-power does not work due to wrong interrupt count in vfio_irq_set when set vfio interrupt.
Fixes: 2ce7a1ed09fc ("net/i40e: localize mapping of ethdev to PCI device") Cc: sta...@dpdk.org Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> --- v2: - follow current design, when intr_handle is modified, unregister the old one and register the new one. - there should be a patch set to fix on other devices. drivers/net/i40e/i40e_ethdev.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 9c76baa..e7bbea5 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -1886,6 +1886,14 @@ i40e_dev_start(struct rte_eth_dev *dev) ret = rte_intr_efd_enable(intr_handle, intr_vector); if (ret) return ret; + /** + * intr_handle may be modified in rte_intr_efd_enable + * so unregster the old one and register the new one. + */ + rte_intr_callback_unregister(intr_handle, + i40e_dev_interrupt_handler, dev); + rte_intr_callback_register(intr_handle, + i40e_dev_interrupt_handler, dev); } if (rte_intr_dp_is_en(intr_handle) && !intr_handle->intr_vec) { -- 2.9.3