From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 254BEA0471 for ; Fri, 19 Jul 2019 10:28:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 70AD91DBF; Fri, 19 Jul 2019 10:28:41 +0200 (CEST) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id 9782F1D7 for ; Fri, 19 Jul 2019 10:28:37 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jul 2019 01:28:36 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,281,1559545200"; d="scan'208";a="176240892" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by FMSMGA003.fm.intel.com with ESMTP; 19 Jul 2019 01:28:36 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Fri, 19 Jul 2019 01:28:35 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.3]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.109]) with mapi id 14.03.0439.000; Fri, 19 Jul 2019 16:28:34 +0800 From: "Yao, Lei A" To: Nithin Dabilpuram , Hyong Youb Kim , David Marchand , "Thomas Monjalon" , "Yigit, Ferruh" , "Burakov, Anatoly" CC: "jerinj@marvell.com" , John Daley , Shahed Shaikh , "dev@dpdk.org" Thread-Topic: [dpdk-dev] [PATCH v4 1/3] vfio: revert change that does intr eventfd setup at probe Thread-Index: AQHVPXZEQ8EtsLT4sE2ZtMr7PzryMabRnH2w Date: Fri, 19 Jul 2019 08:28:32 +0000 Message-ID: <2DBBFF226F7CF64BAFCA79B681719D9549737EB6@shsmsx102.ccr.corp.intel.com> References: <20190717115852.171416-1-ndabilpuram@marvell.com> <20190718143628.169623-1-ndabilpuram@marvell.com> <20190718143628.169623-2-ndabilpuram@marvell.com> In-Reply-To: <20190718143628.169623-2-ndabilpuram@marvell.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZDYxODM1NzEtZjFiNy00YmQ3LTg4OTUtMDlhZTMyZThhOGEzIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiMFJ5Rm14QjgxRW9vSzNnSUFZbCtZK1FyenMrZnNpQkpaZkFNYWZxU09sRXhleHgxZVwvdjJQSXJHc1JoTkNrZjIifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dpdk-dev] [PATCH v4 1/3] vfio: revert change that does intr eventfd setup at probe X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Nithin Dabilpuram > Sent: Thursday, July 18, 2019 10:36 PM > To: Hyong Youb Kim ; David Marchand > ; Thomas Monjalon > ; Yigit, Ferruh ; Burakov, > Anatoly > Cc: jerinj@marvell.com; John Daley ; Shahed Shaikh > ; dev@dpdk.org; Nithin Dabilpuram > > Subject: [dpdk-dev] [PATCH v4 1/3] vfio: revert change that does intr > eventfd setup at probe >=20 > This reverts commit 89aac60e0be9ed95a87b16e3595f102f9faaffb4. > "vfio: fix interrupts race condition" >=20 > The above mentioned commit moves the interrupt's eventfd setup > to probe time but only enables one interrupt for all types of > interrupt handles i.e VFIO_MSI, VFIO_LEGACY, VFIO_MSIX, UIO. > It works fine with default case but breaks below cases specifically > for MSIX based interrupt handles. >=20 > * Applications like l3fwd-power that request rxq interrupts > while ethdev setup. > * Drivers that need > 1 MSIx interrupts to be configured for > functionality to work. >=20 > VFIO PCI for MSIx expects all the possible vectors to be setup up > when using VFIO_IRQ_SET_ACTION_TRIGGER so that they can be > allocated from kernel pci subsystem. Only way to increase the number > of vectors later is first free all by using VFIO_IRQ_SET_DATA_NONE > with action trigger and then enable new vector count. >=20 > Above commit changes the behavior of rte_intr_[enable|disable] to > only mask and unmask unlike earlier behavior and thereby > breaking above two scenarios. >=20 > Fixes: 89aac60e0be9 ("vfio: fix interrupts race condition") > Cc: david.marchand@redhat.com >=20 > Signed-off-by: Nithin Dabilpuram > Signed-off-by: Jerin Jacob > Tested-by: Stephen Hemminger > Tested-by: Shahed Shaikh Tested-by: Lei Yao This patch set pass the interrupt test with ixgbe, i40e and virtio. > --- > v4: > * No change. > v3: > * Update Shahed Shaikh's tested-by > v2: > * Include tested by sign from Stephen >=20 > drivers/bus/pci/linux/pci_vfio.c | 78 ++++++------ > lib/librte_eal/linux/eal/eal_interrupts.c | 201 +++++++++++++++++++++++- > ------ > 2 files changed, 191 insertions(+), 88 deletions(-) >=20 > diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci= _vfio.c > index ee31239..1ceb1c0 100644 > --- a/drivers/bus/pci/linux/pci_vfio.c > +++ b/drivers/bus/pci/linux/pci_vfio.c > @@ -187,11 +187,8 @@ pci_vfio_set_bus_master(int dev_fd, bool op) > static int > pci_vfio_setup_interrupts(struct rte_pci_device *dev, int vfio_dev_fd) > { > - char irq_set_buf[sizeof(struct vfio_irq_set) + sizeof(int)]; > - struct vfio_irq_set *irq_set; > - enum rte_intr_mode intr_mode; > int i, ret, intr_idx; > - int fd; > + enum rte_intr_mode intr_mode; >=20 > /* default to invalid index */ > intr_idx =3D VFIO_PCI_NUM_IRQS; > @@ -223,6 +220,7 @@ pci_vfio_setup_interrupts(struct rte_pci_device *dev, > int vfio_dev_fd) > /* start from MSI-X interrupt type */ > for (i =3D VFIO_PCI_MSIX_IRQ_INDEX; i >=3D 0; i--) { > struct vfio_irq_info irq =3D { .argsz =3D sizeof(irq) }; > + int fd =3D -1; >=20 > /* skip interrupt modes we don't want */ > if (intr_mode !=3D RTE_INTR_MODE_NONE && > @@ -238,51 +236,51 @@ pci_vfio_setup_interrupts(struct rte_pci_device > *dev, int vfio_dev_fd) > return -1; > } >=20 > - /* found a usable interrupt mode */ > - if ((irq.flags & VFIO_IRQ_INFO_EVENTFD) !=3D 0) > - break; > - > /* if this vector cannot be used with eventfd, fail if we > explicitly > * specified interrupt type, otherwise continue */ > - if (intr_mode !=3D RTE_INTR_MODE_NONE) { > - RTE_LOG(ERR, EAL, " interrupt vector does not > support eventfd!\n"); > + if ((irq.flags & VFIO_IRQ_INFO_EVENTFD) =3D=3D 0) { > + if (intr_mode !=3D RTE_INTR_MODE_NONE) { > + RTE_LOG(ERR, EAL, > + " interrupt vector does not > support eventfd!\n"); > + return -1; > + } else > + continue; > + } > + > + /* set up an eventfd for interrupts */ > + fd =3D eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); > + if (fd < 0) { > + RTE_LOG(ERR, EAL, " cannot set up eventfd, " > + "error %i (%s)\n", errno, > strerror(errno)); > return -1; > } > - } >=20 > - if (i < 0) > - return -1; > + dev->intr_handle.fd =3D fd; > + dev->intr_handle.vfio_dev_fd =3D vfio_dev_fd; >=20 > - fd =3D eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); > - if (fd < 0) { > - RTE_LOG(ERR, EAL, " cannot set up eventfd, error %i (%s)\n", > - errno, strerror(errno)); > - return -1; > - } > + switch (i) { > + case VFIO_PCI_MSIX_IRQ_INDEX: > + intr_mode =3D RTE_INTR_MODE_MSIX; > + dev->intr_handle.type =3D > RTE_INTR_HANDLE_VFIO_MSIX; > + break; > + case VFIO_PCI_MSI_IRQ_INDEX: > + intr_mode =3D RTE_INTR_MODE_MSI; > + dev->intr_handle.type =3D > RTE_INTR_HANDLE_VFIO_MSI; > + break; > + case VFIO_PCI_INTX_IRQ_INDEX: > + intr_mode =3D RTE_INTR_MODE_LEGACY; > + dev->intr_handle.type =3D > RTE_INTR_HANDLE_VFIO_LEGACY; > + break; > + default: > + RTE_LOG(ERR, EAL, " unknown interrupt type!\n"); > + return -1; > + } >=20 > - irq_set =3D (struct vfio_irq_set *)irq_set_buf; > - irq_set->argsz =3D sizeof(irq_set_buf); > - irq_set->flags =3D > VFIO_IRQ_SET_DATA_EVENTFD|VFIO_IRQ_SET_ACTION_TRIGGER; > - irq_set->index =3D i; > - irq_set->start =3D 0; > - irq_set->count =3D 1; > - memcpy(&irq_set->data, &fd, sizeof(int)); > - if (ioctl(vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set) < 0) { > - RTE_LOG(ERR, EAL, " error configuring interrupt\n"); > - close(fd); > - return -1; > + return 0; > } >=20 > - dev->intr_handle.fd =3D fd; > - dev->intr_handle.vfio_dev_fd =3D vfio_dev_fd; > - if (i =3D=3D VFIO_PCI_MSIX_IRQ_INDEX) > - dev->intr_handle.type =3D RTE_INTR_HANDLE_VFIO_MSIX; > - else if (i =3D=3D VFIO_PCI_MSI_IRQ_INDEX) > - dev->intr_handle.type =3D RTE_INTR_HANDLE_VFIO_MSI; > - else if (i =3D=3D VFIO_PCI_INTX_IRQ_INDEX) > - dev->intr_handle.type =3D RTE_INTR_HANDLE_VFIO_LEGACY; > - > - return 0; > + /* if we're here, we haven't found a suitable interrupt vector */ > + return -1; > } >=20 > #ifdef HAVE_VFIO_DEV_REQ_INTERFACE > diff --git a/lib/librte_eal/linux/eal/eal_interrupts.c > b/lib/librte_eal/linux/eal/eal_interrupts.c > index 27976b3..79ad5e8 100644 > --- a/lib/librte_eal/linux/eal/eal_interrupts.c > +++ b/lib/librte_eal/linux/eal/eal_interrupts.c > @@ -109,19 +109,42 @@ static pthread_t intr_thread; >=20 > /* enable legacy (INTx) interrupts */ > static int > -vfio_enable_intx(const struct rte_intr_handle *intr_handle) > -{ > - struct vfio_irq_set irq_set; > - int ret; > - > - /* unmask INTx */ > - irq_set.argsz =3D sizeof(irq_set); > - irq_set.flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_UNMASK; > - irq_set.index =3D VFIO_PCI_INTX_IRQ_INDEX; > - irq_set.start =3D 0; > - irq_set.count =3D 1; > - > - ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > &irq_set); > +vfio_enable_intx(const struct rte_intr_handle *intr_handle) { > + struct vfio_irq_set *irq_set; > + char irq_set_buf[IRQ_SET_BUF_LEN]; > + int len, ret; > + int *fd_ptr; > + > + len =3D sizeof(irq_set_buf); > + > + /* enable INTx */ > + irq_set =3D (struct vfio_irq_set *) irq_set_buf; > + irq_set->argsz =3D len; > + irq_set->count =3D 1; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_EVENTFD | > VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index =3D VFIO_PCI_INTX_IRQ_INDEX; > + irq_set->start =3D 0; > + fd_ptr =3D (int *) &irq_set->data; > + *fd_ptr =3D intr_handle->fd; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); > + > + if (ret) { > + RTE_LOG(ERR, EAL, "Error enabling INTx interrupts for > fd %d\n", > + intr_handle->fd); > + return -1; > + } > + > + /* unmask INTx after enabling */ > + memset(irq_set, 0, len); > + len =3D sizeof(struct vfio_irq_set); > + irq_set->argsz =3D len; > + irq_set->count =3D 1; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_UNMASK; > + irq_set->index =3D VFIO_PCI_INTX_IRQ_INDEX; > + irq_set->start =3D 0; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); >=20 > if (ret) { > RTE_LOG(ERR, EAL, "Error unmasking INTx interrupts for > fd %d\n", > @@ -133,51 +156,128 @@ vfio_enable_intx(const struct rte_intr_handle > *intr_handle) >=20 > /* disable legacy (INTx) interrupts */ > static int > -vfio_disable_intx(const struct rte_intr_handle *intr_handle) > -{ > - struct vfio_irq_set irq_set; > - int ret; > +vfio_disable_intx(const struct rte_intr_handle *intr_handle) { > + struct vfio_irq_set *irq_set; > + char irq_set_buf[IRQ_SET_BUF_LEN]; > + int len, ret; >=20 > - /* mask interrupts */ > - irq_set.argsz =3D sizeof(irq_set); > - irq_set.flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_MASK; > - irq_set.index =3D VFIO_PCI_INTX_IRQ_INDEX; > - irq_set.start =3D 0; > - irq_set.count =3D 1; > + len =3D sizeof(struct vfio_irq_set); >=20 > - ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > &irq_set); > + /* mask interrupts before disabling */ > + irq_set =3D (struct vfio_irq_set *) irq_set_buf; > + irq_set->argsz =3D len; > + irq_set->count =3D 1; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_MASK; > + irq_set->index =3D VFIO_PCI_INTX_IRQ_INDEX; > + irq_set->start =3D 0; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); >=20 > if (ret) { > RTE_LOG(ERR, EAL, "Error masking INTx interrupts for > fd %d\n", > intr_handle->fd); > return -1; > } > + > + /* disable INTx*/ > + memset(irq_set, 0, len); > + irq_set->argsz =3D len; > + irq_set->count =3D 0; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index =3D VFIO_PCI_INTX_IRQ_INDEX; > + irq_set->start =3D 0; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); > + > + if (ret) { > + RTE_LOG(ERR, EAL, > + "Error disabling INTx interrupts for fd %d\n", > intr_handle->fd); > + return -1; > + } > return 0; > } >=20 > +/* enable MSI interrupts */ > +static int > +vfio_enable_msi(const struct rte_intr_handle *intr_handle) { > + int len, ret; > + char irq_set_buf[IRQ_SET_BUF_LEN]; > + struct vfio_irq_set *irq_set; > + int *fd_ptr; > + > + len =3D sizeof(irq_set_buf); > + > + irq_set =3D (struct vfio_irq_set *) irq_set_buf; > + irq_set->argsz =3D len; > + irq_set->count =3D 1; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_EVENTFD | > VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index =3D VFIO_PCI_MSI_IRQ_INDEX; > + irq_set->start =3D 0; > + fd_ptr =3D (int *) &irq_set->data; > + *fd_ptr =3D intr_handle->fd; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); > + > + if (ret) { > + RTE_LOG(ERR, EAL, "Error enabling MSI interrupts for > fd %d\n", > + intr_handle->fd); > + return -1; > + } > + return 0; > +} > + > +/* disable MSI interrupts */ > +static int > +vfio_disable_msi(const struct rte_intr_handle *intr_handle) { > + struct vfio_irq_set *irq_set; > + char irq_set_buf[IRQ_SET_BUF_LEN]; > + int len, ret; > + > + len =3D sizeof(struct vfio_irq_set); > + > + irq_set =3D (struct vfio_irq_set *) irq_set_buf; > + irq_set->argsz =3D len; > + irq_set->count =3D 0; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index =3D VFIO_PCI_MSI_IRQ_INDEX; > + irq_set->start =3D 0; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); > + > + if (ret) > + RTE_LOG(ERR, EAL, > + "Error disabling MSI interrupts for fd %d\n", > intr_handle->fd); > + > + return ret; > +} > + > /* enable MSI-X interrupts */ > static int > -vfio_enable_msix(const struct rte_intr_handle *intr_handle) > -{ > +vfio_enable_msix(const struct rte_intr_handle *intr_handle) { > + int len, ret; > char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; > struct vfio_irq_set *irq_set; > - int len, ret; > - > - if (intr_handle->nb_efd =3D=3D 0) > - return 0; > + int *fd_ptr; >=20 > len =3D sizeof(irq_set_buf); >=20 > irq_set =3D (struct vfio_irq_set *) irq_set_buf; > irq_set->argsz =3D len; > + /* 0 < irq_set->count < RTE_MAX_RXTX_INTR_VEC_ID + 1 */ > + irq_set->count =3D intr_handle->max_intr ? > + (intr_handle->max_intr > RTE_MAX_RXTX_INTR_VEC_ID + 1 ? > + RTE_MAX_RXTX_INTR_VEC_ID + 1 : intr_handle->max_intr) : > 1; > irq_set->flags =3D VFIO_IRQ_SET_DATA_EVENTFD | > VFIO_IRQ_SET_ACTION_TRIGGER; > irq_set->index =3D VFIO_PCI_MSIX_IRQ_INDEX; > - irq_set->start =3D RTE_INTR_VEC_RXTX_OFFSET; > - irq_set->count =3D intr_handle->nb_efd; > - memcpy(&irq_set->data, intr_handle->efds, > - sizeof(*intr_handle->efds) * intr_handle->nb_efd); > + irq_set->start =3D 0; > + fd_ptr =3D (int *) &irq_set->data; > + /* INTR vector offset 0 reserve for non-efds mapping */ > + fd_ptr[RTE_INTR_VEC_ZERO_OFFSET] =3D intr_handle->fd; > + memcpy(&fd_ptr[RTE_INTR_VEC_RXTX_OFFSET], intr_handle->efds, > + sizeof(*intr_handle->efds) * intr_handle->nb_efd); >=20 > ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); > + > if (ret) { > RTE_LOG(ERR, EAL, "Error enabling MSI-X interrupts for > fd %d\n", > intr_handle->fd); > @@ -189,21 +289,22 @@ vfio_enable_msix(const struct rte_intr_handle > *intr_handle) >=20 > /* disable MSI-X interrupts */ > static int > -vfio_disable_msix(const struct rte_intr_handle *intr_handle) > -{ > - struct vfio_irq_set irq_set; > - int ret; > +vfio_disable_msix(const struct rte_intr_handle *intr_handle) { > + struct vfio_irq_set *irq_set; > + char irq_set_buf[MSIX_IRQ_SET_BUF_LEN]; > + int len, ret; >=20 > - if (intr_handle->nb_efd =3D=3D 0) > - return 0; > + len =3D sizeof(struct vfio_irq_set); >=20 > - irq_set.argsz =3D sizeof(irq_set); > - irq_set.flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_TRIGGER; > - irq_set.index =3D VFIO_PCI_MSIX_IRQ_INDEX; > - irq_set.start =3D RTE_INTR_VEC_RXTX_OFFSET; > - irq_set.count =3D intr_handle->nb_efd; > + irq_set =3D (struct vfio_irq_set *) irq_set_buf; > + irq_set->argsz =3D len; > + irq_set->count =3D 0; > + irq_set->flags =3D VFIO_IRQ_SET_DATA_NONE | > VFIO_IRQ_SET_ACTION_TRIGGER; > + irq_set->index =3D VFIO_PCI_MSIX_IRQ_INDEX; > + irq_set->start =3D 0; > + > + ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > irq_set); >=20 > - ret =3D ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, > &irq_set); > if (ret) > RTE_LOG(ERR, EAL, > "Error disabling MSI-X interrupts for fd %d\n", > intr_handle->fd); > @@ -564,7 +665,9 @@ rte_intr_enable(const struct rte_intr_handle > *intr_handle) > return -1; > break; > case RTE_INTR_HANDLE_VFIO_MSI: > - return 0; > + if (vfio_enable_msi(intr_handle)) > + return -1; > + break; > case RTE_INTR_HANDLE_VFIO_LEGACY: > if (vfio_enable_intx(intr_handle)) > return -1; > @@ -618,7 +721,9 @@ rte_intr_disable(const struct rte_intr_handle > *intr_handle) > return -1; > break; > case RTE_INTR_HANDLE_VFIO_MSI: > - return 0; > + if (vfio_disable_msi(intr_handle)) > + return -1; > + break; > case RTE_INTR_HANDLE_VFIO_LEGACY: > if (vfio_disable_intx(intr_handle)) > return -1; > -- > 2.8.4