From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58358) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bPPdG-0007IE-6O for qemu-devel@nongnu.org; Tue, 19 Jul 2016 03:39:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bPPdE-000866-0k for qemu-devel@nongnu.org; Tue, 19 Jul 2016 03:39:57 -0400 Received: from m199-177.yeah.net ([123.58.177.199]:24833) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bPPdC-00084t-L8 for qemu-devel@nongnu.org; Tue, 19 Jul 2016 03:39:55 -0400 References: <1468913563-21456-1-git-send-email-zhoujie2011@cn.fujitsu.com> <1468913563-21456-2-git-send-email-zhoujie2011@cn.fujitsu.com> From: Chen Fan Message-ID: <578DD936.7010800@easystack.cn> Date: Tue, 19 Jul 2016 15:39:34 +0800 MIME-Version: 1.0 In-Reply-To: <1468913563-21456-2-git-send-email-zhoujie2011@cn.fujitsu.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v2 1/2] vfio : resume notifier List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Zhou Jie , alex.williamson@redhat.com Cc: linux-kernel@vger.kernel.org, qemu-devel@nongnu.org, izumi.taku@jp.fujitsu.com, root On 2016=E5=B9=B407=E6=9C=8819=E6=97=A5 15:32, Zhou Jie wrote: > From: root Pls add your username and email by using git config --global user.name /=20 user.email to update your git config, and git send-email again. Thanks, Chen > > --- > drivers/vfio/pci/vfio_pci.c | 28 +++++++++++++++++++++++++++- > drivers/vfio/pci/vfio_pci_intrs.c | 18 ++++++++++++++++++ > drivers/vfio/pci/vfio_pci_private.h | 1 + > include/uapi/linux/vfio.h | 1 + > 4 files changed, 47 insertions(+), 1 deletion(-) > > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c > index 188b1ff..2d12b03 100644 > --- a/drivers/vfio/pci/vfio_pci.c > +++ b/drivers/vfio/pci/vfio_pci.c > @@ -363,7 +363,8 @@ static int vfio_pci_get_irq_count(struct vfio_pci_d= evice *vdev, int irq_type) > =20 > return (flags & PCI_MSIX_FLAGS_QSIZE) + 1; > } > - } else if (irq_type =3D=3D VFIO_PCI_ERR_IRQ_INDEX) { > + } else if (irq_type =3D=3D VFIO_PCI_ERR_IRQ_INDEX || > + irq_type =3D=3D VFIO_PCI_RESUME_IRQ_INDEX) { > if (pci_is_pcie(vdev->pdev)) > return 1; > } else if (irq_type =3D=3D VFIO_PCI_REQ_IRQ_INDEX) { > @@ -731,6 +732,7 @@ static long vfio_pci_ioctl(void *device_data, > case VFIO_PCI_REQ_IRQ_INDEX: > break; > case VFIO_PCI_ERR_IRQ_INDEX: > + case VFIO_PCI_RESUME_IRQ_INDEX: > if (pci_is_pcie(vdev->pdev)) > break; > /* pass thru to return error */ > @@ -1234,8 +1236,32 @@ static pci_ers_result_t vfio_pci_aer_err_detecte= d(struct pci_dev *pdev, > return PCI_ERS_RESULT_CAN_RECOVER; > } > =20 > +static void vfio_pci_aer_resume(struct pci_dev *pdev) > +{ > + struct vfio_pci_device *vdev; > + struct vfio_device *device; > + > + device =3D vfio_device_get_from_dev(&pdev->dev); > + if (device =3D=3D NULL) > + return; > + > + vdev =3D vfio_device_data(device); > + if (vdev =3D=3D NULL) { > + vfio_device_put(device); > + return; > + } > + > + mutex_lock(&vdev->igate); > + if (vdev->resume_trigger) > + eventfd_signal(vdev->resume_trigger, 1); > + > + mutex_unlock(&vdev->igate); > + vfio_device_put(device); > +} > + > static const struct pci_error_handlers vfio_err_handlers =3D { > .error_detected =3D vfio_pci_aer_err_detected, > + .resume =3D vfio_pci_aer_resume, > }; > =20 > static struct pci_driver vfio_pci_driver =3D { > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_= pci_intrs.c > index 15ecfc9..3a01a62 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -617,6 +617,16 @@ static int vfio_pci_set_err_trigger(struct vfio_pc= i_device *vdev, > return vfio_pci_set_ctx_trigger_single(&vdev->err_trigger, flags, da= ta); > } > =20 > +static int vfio_pci_set_resume_trigger(struct vfio_pci_device *vdev, > + unsigned index, unsigned start, > + unsigned count, uint32_t flags, void *data) > +{ > + if (index !=3D VFIO_PCI_RESUME_IRQ_INDEX) > + return -EINVAL; > + > + return vfio_pci_set_ctx_trigger_single(&vdev->resume_trigger, flags, = data); > +} > + > static int vfio_pci_set_req_trigger(struct vfio_pci_device *vdev, > unsigned index, unsigned start, > unsigned count, uint32_t flags, void *data) > @@ -676,6 +686,14 @@ int vfio_pci_set_irqs_ioctl(struct vfio_pci_device= *vdev, uint32_t flags, > break; > } > break; > + case VFIO_PCI_RESUME_IRQ_INDEX: > + switch (flags & VFIO_IRQ_SET_ACTION_TYPE_MASK) { > + case VFIO_IRQ_SET_ACTION_TRIGGER: > + if (pci_is_pcie(vdev->pdev)) > + func =3D vfio_pci_set_resume_trigger; > + break; > + } > + break; > } > =20 > if (!func) > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfi= o_pci_private.h > index 016c14a..80d4ddd 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -88,6 +88,7 @@ struct vfio_pci_device { > int refcnt; > struct eventfd_ctx *err_trigger; > struct eventfd_ctx *req_trigger; > + struct eventfd_ctx *resume_trigger; > }; > =20 > #define is_intx(vdev) (vdev->irq_type =3D=3D VFIO_PCI_INTX_IRQ_INDEX) > diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h > index 255a211..34ab138 100644 > --- a/include/uapi/linux/vfio.h > +++ b/include/uapi/linux/vfio.h > @@ -433,6 +433,7 @@ enum { > VFIO_PCI_MSIX_IRQ_INDEX, > VFIO_PCI_ERR_IRQ_INDEX, > VFIO_PCI_REQ_IRQ_INDEX, > + VFIO_PCI_RESUME_IRQ_INDEX, > VFIO_PCI_NUM_IRQS > }; > =20 --=20 Sincerely, Chen Fan