Message ID | 1436780855-3617-10-git-send-email-feng.wu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Feng, On 07/13/2015 11:47 AM, Feng Wu wrote: > This patch adds the registration/unregistration of an > irq_bypass_producer for MSI/MSIx on vfio pci devices. may be worth mentioning this is a dummy producer with callbacks not yet implemented. > > Signed-off-by: Feng Wu <feng.wu@intel.com> > --- > drivers/vfio/pci/vfio_pci_intrs.c | 19 +++++++++++++++++++ > drivers/vfio/pci/vfio_pci_private.h | 2 ++ > 2 files changed, 21 insertions(+) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 1f577b4..4795606 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -305,6 +305,16 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) > return 0; > } > > +void vfio_pci_add_consumer(struct irq_bypass_producer *prod, > + struct irq_bypass_consumer *cons) static? Also Paolo encouraged me to use vfio_pci_irq_bypass_add_consumer naming. Same below. > +{ > +} > + > +void vfio_pci_del_consumer(struct irq_bypass_producer *prod, > + struct irq_bypass_consumer *cons) static? Eric > +{ > +} > + > static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > int vector, int fd, bool msix) > { > @@ -319,6 +329,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > > if (vdev->ctx[vector].trigger) { > free_irq(irq, vdev->ctx[vector].trigger); > + irq_bypass_unregister_producer(&vdev->ctx[vector].producer); > kfree(vdev->ctx[vector].name); > eventfd_ctx_put(vdev->ctx[vector].trigger); > vdev->ctx[vector].trigger = NULL; > @@ -360,6 +371,14 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > return ret; > } > > + INIT_LIST_HEAD(&vdev->ctx[vector].producer.node); > + vdev->ctx[vector].producer.token = trigger; > + vdev->ctx[vector].producer.irq = irq; > + vdev->ctx[vector].producer.add_consumer = vfio_pci_add_consumer; > + vdev->ctx[vector].producer.del_consumer = vfio_pci_del_consumer; > + ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); > + WARN_ON(ret); > + > vdev->ctx[vector].trigger = trigger; > > return 0; > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > index ae0e1b4..0e7394f 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -13,6 +13,7 @@ > > #include <linux/mutex.h> > #include <linux/pci.h> > +#include <linux/irqbypass.h> > > #ifndef VFIO_PCI_PRIVATE_H > #define VFIO_PCI_PRIVATE_H > @@ -29,6 +30,7 @@ struct vfio_pci_irq_ctx { > struct virqfd *mask; > char *name; > bool masked; > + struct irq_bypass_producer producer; > }; > > struct vfio_pci_device { > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2015-07-13 at 17:47 +0800, Feng Wu wrote: > This patch adds the registration/unregistration of an > irq_bypass_producer for MSI/MSIx on vfio pci devices. > > Signed-off-by: Feng Wu <feng.wu@intel.com> > --- > drivers/vfio/pci/vfio_pci_intrs.c | 19 +++++++++++++++++++ > drivers/vfio/pci/vfio_pci_private.h | 2 ++ > 2 files changed, 21 insertions(+) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 1f577b4..4795606 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -305,6 +305,16 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) > return 0; > } > > +void vfio_pci_add_consumer(struct irq_bypass_producer *prod, > + struct irq_bypass_consumer *cons) > +{ > +} > + > +void vfio_pci_del_consumer(struct irq_bypass_producer *prod, > + struct irq_bypass_consumer *cons) > +{ > +} > + Yes, as Eric says, these should be static > static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > int vector, int fd, bool msix) > { > @@ -319,6 +329,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > > if (vdev->ctx[vector].trigger) { > free_irq(irq, vdev->ctx[vector].trigger); > + irq_bypass_unregister_producer(&vdev->ctx[vector].producer); > kfree(vdev->ctx[vector].name); > eventfd_ctx_put(vdev->ctx[vector].trigger); > vdev->ctx[vector].trigger = NULL; > @@ -360,6 +371,14 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, > return ret; > } > > + INIT_LIST_HEAD(&vdev->ctx[vector].producer.node); nit, INIT_LIST_HEAD isn't really needed, irq-bypass-manager shouldn't trust incoming data here anyway. > + vdev->ctx[vector].producer.token = trigger; > + vdev->ctx[vector].producer.irq = irq; > + vdev->ctx[vector].producer.add_consumer = vfio_pci_add_consumer; > + vdev->ctx[vector].producer.del_consumer = vfio_pci_del_consumer; > + ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); > + WARN_ON(ret); This is only an acceleration path, so a dev_dbg() or dev_info() is probably more appropriate. Same for kvm side. > + > vdev->ctx[vector].trigger = trigger; > > return 0; > diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h > index ae0e1b4..0e7394f 100644 > --- a/drivers/vfio/pci/vfio_pci_private.h > +++ b/drivers/vfio/pci/vfio_pci_private.h > @@ -13,6 +13,7 @@ > > #include <linux/mutex.h> > #include <linux/pci.h> > +#include <linux/irqbypass.h> > > #ifndef VFIO_PCI_PRIVATE_H > #define VFIO_PCI_PRIVATE_H > @@ -29,6 +30,7 @@ struct vfio_pci_irq_ctx { > struct virqfd *mask; > char *name; > bool masked; > + struct irq_bypass_producer producer; > }; > > struct vfio_pci_device { -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 1f577b4..4795606 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -305,6 +305,16 @@ static int vfio_msi_enable(struct vfio_pci_device *vdev, int nvec, bool msix) return 0; } +void vfio_pci_add_consumer(struct irq_bypass_producer *prod, + struct irq_bypass_consumer *cons) +{ +} + +void vfio_pci_del_consumer(struct irq_bypass_producer *prod, + struct irq_bypass_consumer *cons) +{ +} + static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, int vector, int fd, bool msix) { @@ -319,6 +329,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, if (vdev->ctx[vector].trigger) { free_irq(irq, vdev->ctx[vector].trigger); + irq_bypass_unregister_producer(&vdev->ctx[vector].producer); kfree(vdev->ctx[vector].name); eventfd_ctx_put(vdev->ctx[vector].trigger); vdev->ctx[vector].trigger = NULL; @@ -360,6 +371,14 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, return ret; } + INIT_LIST_HEAD(&vdev->ctx[vector].producer.node); + vdev->ctx[vector].producer.token = trigger; + vdev->ctx[vector].producer.irq = irq; + vdev->ctx[vector].producer.add_consumer = vfio_pci_add_consumer; + vdev->ctx[vector].producer.del_consumer = vfio_pci_del_consumer; + ret = irq_bypass_register_producer(&vdev->ctx[vector].producer); + WARN_ON(ret); + vdev->ctx[vector].trigger = trigger; return 0; diff --git a/drivers/vfio/pci/vfio_pci_private.h b/drivers/vfio/pci/vfio_pci_private.h index ae0e1b4..0e7394f 100644 --- a/drivers/vfio/pci/vfio_pci_private.h +++ b/drivers/vfio/pci/vfio_pci_private.h @@ -13,6 +13,7 @@ #include <linux/mutex.h> #include <linux/pci.h> +#include <linux/irqbypass.h> #ifndef VFIO_PCI_PRIVATE_H #define VFIO_PCI_PRIVATE_H @@ -29,6 +30,7 @@ struct vfio_pci_irq_ctx { struct virqfd *mask; char *name; bool masked; + struct irq_bypass_producer producer; }; struct vfio_pci_device {
This patch adds the registration/unregistration of an irq_bypass_producer for MSI/MSIx on vfio pci devices. Signed-off-by: Feng Wu <feng.wu@intel.com> --- drivers/vfio/pci/vfio_pci_intrs.c | 19 +++++++++++++++++++ drivers/vfio/pci/vfio_pci_private.h | 2 ++ 2 files changed, 21 insertions(+)