qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] vfio: check if host device supports INTx
@ 2014-10-22 15:13 Frank Blaschka
  2014-10-22 17:17 ` Alex Williamson
  0 siblings, 1 reply; 5+ messages in thread
From: Frank Blaschka @ 2014-10-22 15:13 UTC (permalink / raw)
  To: alex.williamson; +Cc: pbonzini, Frank Blaschka, agraf, qemu-devel

From: Frank Blaschka <frank.blaschka@de.ibm.com>

Let the kernel announce if INTx is available. Yes, there are platforms
(e.g. s390) which do not support INTx.

Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
---
 hw/misc/vfio.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
index d66f3d2..3e9600b 100644
--- a/hw/misc/vfio.c
+++ b/hw/misc/vfio.c
@@ -109,6 +109,7 @@ typedef struct VFIOVGA {
 } VFIOVGA;
 
 typedef struct VFIOINTx {
+    bool available; /* intx available */
     bool pending; /* interrupt pending */
     bool kvm_accel; /* set when QEMU bypass through KVM enabled */
     uint8_t pin; /* which pin to pull for qemu_set_irq */
@@ -554,7 +555,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
     struct vfio_irq_set *irq_set;
     int32_t *pfd;
 
-    if (!pin) {
+    if (!pin || !vdev->intx.available) {
         return 0;
     }
 
@@ -4032,6 +4033,21 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
                      vdev->host.function);
     }
 
+    irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
+    ret = ioctl(vdev->fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
+    if (ret) {
+        /*
+         * This can fail for an old kernel or legacy PCI dev
+         * we assume intx is available
+         */
+        vdev->intx.available = true;
+        ret = 0;
+    } else if (irq_info.count == 0) {
+        vdev->intx.available = false;
+    } else {
+        vdev->intx.available = true;
+    }
+
 error:
     if (ret) {
         QLIST_REMOVE(vdev, next);
-- 
1.8.5.5

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH] vfio: check if host device supports INTx
  2014-10-22 15:13 [Qemu-devel] [PATCH] vfio: check if host device supports INTx Frank Blaschka
@ 2014-10-22 17:17 ` Alex Williamson
  2014-10-23  8:21   ` Frank Blaschka
  0 siblings, 1 reply; 5+ messages in thread
From: Alex Williamson @ 2014-10-22 17:17 UTC (permalink / raw)
  To: Frank Blaschka; +Cc: pbonzini, Frank Blaschka, agraf, qemu-devel

On Wed, 2014-10-22 at 17:13 +0200, Frank Blaschka wrote:
> From: Frank Blaschka <frank.blaschka@de.ibm.com>
> 
> Let the kernel announce if INTx is available. Yes, there are platforms
> (e.g. s390) which do not support INTx.
> 
> Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
> ---
>  hw/misc/vfio.c | 18 +++++++++++++++++-
>  1 file changed, 17 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> index d66f3d2..3e9600b 100644
> --- a/hw/misc/vfio.c
> +++ b/hw/misc/vfio.c
> @@ -109,6 +109,7 @@ typedef struct VFIOVGA {
>  } VFIOVGA;
>  
>  typedef struct VFIOINTx {
> +    bool available; /* intx available */
>      bool pending; /* interrupt pending */
>      bool kvm_accel; /* set when QEMU bypass through KVM enabled */
>      uint8_t pin; /* which pin to pull for qemu_set_irq */
> @@ -554,7 +555,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
>      struct vfio_irq_set *irq_set;
>      int32_t *pfd;
>  
> -    if (!pin) {
> +    if (!pin || !vdev->intx.available) {
>          return 0;
>      }
>  
> @@ -4032,6 +4033,21 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
>                       vdev->host.function);
>      }
>  
> +    irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
> +    ret = ioctl(vdev->fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
> +    if (ret) {
> +        /*
> +         * This can fail for an old kernel or legacy PCI dev
> +         * we assume intx is available
> +         */

Is this true?  It's unfortunately from an ABI stability standpoint that
we weren't calling this, but the ioctl should have always been there and
worked.  I'd rather error out here than add a fallback if this is just
paranoia.  Note that SR-IOV VFs will also report count=0 but their IRQ
pin register will read 0.  We do also have the option to virtualize the
IRQ pin register for s390 devices which would make them look the same as
an SR-IOV VF from an INTx perspective to the user.  That may be the more
consistent option so that the VFIO IRQ INFO aligns with config space.
Thanks,

Alex

> +        vdev->intx.available = true;
> +        ret = 0;
> +    } else if (irq_info.count == 0) {
> +        vdev->intx.available = false;
> +    } else {
> +        vdev->intx.available = true;
> +    }
> +
>  error:
>      if (ret) {
>          QLIST_REMOVE(vdev, next);

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH] vfio: check if host device supports INTx
  2014-10-22 17:17 ` Alex Williamson
@ 2014-10-23  8:21   ` Frank Blaschka
  2014-10-23 14:26     ` Alex Williamson
  0 siblings, 1 reply; 5+ messages in thread
From: Frank Blaschka @ 2014-10-23  8:21 UTC (permalink / raw)
  To: Alex Williamson; +Cc: pbonzini, Frank Blaschka, agraf, qemu-devel

On Wed, Oct 22, 2014 at 11:17:11AM -0600, Alex Williamson wrote:
> On Wed, 2014-10-22 at 17:13 +0200, Frank Blaschka wrote:
> > From: Frank Blaschka <frank.blaschka@de.ibm.com>
> > 
> > Let the kernel announce if INTx is available. Yes, there are platforms
> > (e.g. s390) which do not support INTx.
> > 
> > Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
> > ---
> >  hw/misc/vfio.c | 18 +++++++++++++++++-
> >  1 file changed, 17 insertions(+), 1 deletion(-)
> > 
> > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> > index d66f3d2..3e9600b 100644
> > --- a/hw/misc/vfio.c
> > +++ b/hw/misc/vfio.c
> > @@ -109,6 +109,7 @@ typedef struct VFIOVGA {
> >  } VFIOVGA;
> >  
> >  typedef struct VFIOINTx {
> > +    bool available; /* intx available */
> >      bool pending; /* interrupt pending */
> >      bool kvm_accel; /* set when QEMU bypass through KVM enabled */
> >      uint8_t pin; /* which pin to pull for qemu_set_irq */
> > @@ -554,7 +555,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
> >      struct vfio_irq_set *irq_set;
> >      int32_t *pfd;
> >  
> > -    if (!pin) {
> > +    if (!pin || !vdev->intx.available) {
> >          return 0;
> >      }
> >  
> > @@ -4032,6 +4033,21 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
> >                       vdev->host.function);
> >      }
> >  
> > +    irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
> > +    ret = ioctl(vdev->fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
> > +    if (ret) {
> > +        /*
> > +         * This can fail for an old kernel or legacy PCI dev
> > +         * we assume intx is available
> > +         */
> 
> Is this true?  It's unfortunately from an ABI stability standpoint that
> we weren't calling this, but the ioctl should have always been there and
> worked.  I'd rather error out here than add a fallback if this is just

ok

> paranoia.  Note that SR-IOV VFs will also report count=0 but their IRQ
> pin register will read 0.  We do also have the option to virtualize the
> IRQ pin register for s390 devices which would make them look the same as

sounds interesting, can you elaborate a little bit more on this?
At what point can we hook in and modify the pci device config space?

> an SR-IOV VF from an INTx perspective to the user.  That may be the more
> consistent option so that the VFIO IRQ INFO aligns with config space.
> Thanks,
> 
> Alex
> 
> > +        vdev->intx.available = true;
> > +        ret = 0;
> > +    } else if (irq_info.count == 0) {
> > +        vdev->intx.available = false;
> > +    } else {
> > +        vdev->intx.available = true;
> > +    }
> > +
> >  error:
> >      if (ret) {
> >          QLIST_REMOVE(vdev, next);
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH] vfio: check if host device supports INTx
  2014-10-23  8:21   ` Frank Blaschka
@ 2014-10-23 14:26     ` Alex Williamson
  2014-10-24  9:28       ` Frank Blaschka
  0 siblings, 1 reply; 5+ messages in thread
From: Alex Williamson @ 2014-10-23 14:26 UTC (permalink / raw)
  To: Frank Blaschka; +Cc: pbonzini, Frank Blaschka, agraf, qemu-devel

On Thu, 2014-10-23 at 10:21 +0200, Frank Blaschka wrote:
> On Wed, Oct 22, 2014 at 11:17:11AM -0600, Alex Williamson wrote:
> > On Wed, 2014-10-22 at 17:13 +0200, Frank Blaschka wrote:
> > > From: Frank Blaschka <frank.blaschka@de.ibm.com>
> > > 
> > > Let the kernel announce if INTx is available. Yes, there are platforms
> > > (e.g. s390) which do not support INTx.
> > > 
> > > Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
> > > ---
> > >  hw/misc/vfio.c | 18 +++++++++++++++++-
> > >  1 file changed, 17 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> > > index d66f3d2..3e9600b 100644
> > > --- a/hw/misc/vfio.c
> > > +++ b/hw/misc/vfio.c
> > > @@ -109,6 +109,7 @@ typedef struct VFIOVGA {
> > >  } VFIOVGA;
> > >  
> > >  typedef struct VFIOINTx {
> > > +    bool available; /* intx available */
> > >      bool pending; /* interrupt pending */
> > >      bool kvm_accel; /* set when QEMU bypass through KVM enabled */
> > >      uint8_t pin; /* which pin to pull for qemu_set_irq */
> > > @@ -554,7 +555,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
> > >      struct vfio_irq_set *irq_set;
> > >      int32_t *pfd;
> > >  
> > > -    if (!pin) {
> > > +    if (!pin || !vdev->intx.available) {
> > >          return 0;
> > >      }
> > >  
> > > @@ -4032,6 +4033,21 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
> > >                       vdev->host.function);
> > >      }
> > >  
> > > +    irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
> > > +    ret = ioctl(vdev->fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
> > > +    if (ret) {
> > > +        /*
> > > +         * This can fail for an old kernel or legacy PCI dev
> > > +         * we assume intx is available
> > > +         */
> > 
> > Is this true?  It's unfortunately from an ABI stability standpoint that
> > we weren't calling this, but the ioctl should have always been there and
> > worked.  I'd rather error out here than add a fallback if this is just
> 
> ok
> 
> > paranoia.  Note that SR-IOV VFs will also report count=0 but their IRQ
> > pin register will read 0.  We do also have the option to virtualize the
> > IRQ pin register for s390 devices which would make them look the same as
> 
> sounds interesting, can you elaborate a little bit more on this?
> At what point can we hook in and modify the pci device config space?

Untested, but I think it would be something like this:

--- a/drivers/vfio/pci/vfio_pci_config.c
+++ b/drivers/vfio/pci/vfio_pci_config.c
@@ -609,6 +609,10 @@ static int __init init_pci_cap_basic_perm(struct perm_bits 
 
        /* Sometimes used by sw, just virtualize */
        p_setb(perm, PCI_INTERRUPT_LINE, (u8)ALL_VIRT, (u8)ALL_WRITE);
+
+       /* Virtualize interrupt pin to allow hiding INTx */
+       p_setb(perm, PCI_INTERRUPT_PIN, (u8)ALL_VIRT, (u8)NO_WRITE);
+
        return 0;
 }
 
@@ -1445,6 +1449,9 @@ int vfio_config_init(struct vfio_pci_device *vdev)
                *(__le16 *)&vconfig[PCI_DEVICE_ID] = cpu_to_le16(pdev->device);
        }
 
+       if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX))
+               vconfig[PCI_INTERRUPT_PIN] = 0;
+
        ret = vfio_cap_init(vdev);
        if (ret)
                goto out;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Qemu-devel] [PATCH] vfio: check if host device supports INTx
  2014-10-23 14:26     ` Alex Williamson
@ 2014-10-24  9:28       ` Frank Blaschka
  0 siblings, 0 replies; 5+ messages in thread
From: Frank Blaschka @ 2014-10-24  9:28 UTC (permalink / raw)
  To: Alex Williamson; +Cc: pbonzini, Frank Blaschka, agraf, qemu-devel

On Thu, Oct 23, 2014 at 08:26:51AM -0600, Alex Williamson wrote:
> On Thu, 2014-10-23 at 10:21 +0200, Frank Blaschka wrote:
> > On Wed, Oct 22, 2014 at 11:17:11AM -0600, Alex Williamson wrote:
> > > On Wed, 2014-10-22 at 17:13 +0200, Frank Blaschka wrote:
> > > > From: Frank Blaschka <frank.blaschka@de.ibm.com>
> > > > 
> > > > Let the kernel announce if INTx is available. Yes, there are platforms
> > > > (e.g. s390) which do not support INTx.
> > > > 
> > > > Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
> > > > ---
> > > >  hw/misc/vfio.c | 18 +++++++++++++++++-
> > > >  1 file changed, 17 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c
> > > > index d66f3d2..3e9600b 100644
> > > > --- a/hw/misc/vfio.c
> > > > +++ b/hw/misc/vfio.c
> > > > @@ -109,6 +109,7 @@ typedef struct VFIOVGA {
> > > >  } VFIOVGA;
> > > >  
> > > >  typedef struct VFIOINTx {
> > > > +    bool available; /* intx available */
> > > >      bool pending; /* interrupt pending */
> > > >      bool kvm_accel; /* set when QEMU bypass through KVM enabled */
> > > >      uint8_t pin; /* which pin to pull for qemu_set_irq */
> > > > @@ -554,7 +555,7 @@ static int vfio_enable_intx(VFIODevice *vdev)
> > > >      struct vfio_irq_set *irq_set;
> > > >      int32_t *pfd;
> > > >  
> > > > -    if (!pin) {
> > > > +    if (!pin || !vdev->intx.available) {
> > > >          return 0;
> > > >      }
> > > >  
> > > > @@ -4032,6 +4033,21 @@ static int vfio_get_device(VFIOGroup *group, const char *name, VFIODevice *vdev)
> > > >                       vdev->host.function);
> > > >      }
> > > >  
> > > > +    irq_info.index = VFIO_PCI_INTX_IRQ_INDEX;
> > > > +    ret = ioctl(vdev->fd, VFIO_DEVICE_GET_IRQ_INFO, &irq_info);
> > > > +    if (ret) {
> > > > +        /*
> > > > +         * This can fail for an old kernel or legacy PCI dev
> > > > +         * we assume intx is available
> > > > +         */
> > > 
> > > Is this true?  It's unfortunately from an ABI stability standpoint that
> > > we weren't calling this, but the ioctl should have always been there and
> > > worked.  I'd rather error out here than add a fallback if this is just
> > 
> > ok
> > 
> > > paranoia.  Note that SR-IOV VFs will also report count=0 but their IRQ
> > > pin register will read 0.  We do also have the option to virtualize the
> > > IRQ pin register for s390 devices which would make them look the same as
> > 
> > sounds interesting, can you elaborate a little bit more on this?
> > At what point can we hook in and modify the pci device config space?
> 
> Untested, but I think it would be something like this:
>

This is great, works perfect and there is no need to do any qemu vfio changes
anymore. You can forget about this patch.

Thx,
Frank
 
> --- a/drivers/vfio/pci/vfio_pci_config.c
> +++ b/drivers/vfio/pci/vfio_pci_config.c
> @@ -609,6 +609,10 @@ static int __init init_pci_cap_basic_perm(struct perm_bits 
> 
>         /* Sometimes used by sw, just virtualize */
>         p_setb(perm, PCI_INTERRUPT_LINE, (u8)ALL_VIRT, (u8)ALL_WRITE);
> +
> +       /* Virtualize interrupt pin to allow hiding INTx */
> +       p_setb(perm, PCI_INTERRUPT_PIN, (u8)ALL_VIRT, (u8)NO_WRITE);
> +
>         return 0;
>  }
> 
> @@ -1445,6 +1449,9 @@ int vfio_config_init(struct vfio_pci_device *vdev)
>                 *(__le16 *)&vconfig[PCI_DEVICE_ID] = cpu_to_le16(pdev->device);
>         }
> 
> +       if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX))
> +               vconfig[PCI_INTERRUPT_PIN] = 0;
> +
>         ret = vfio_cap_init(vdev);
>         if (ret)
>                 goto out;
> 
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-10-24  9:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-22 15:13 [Qemu-devel] [PATCH] vfio: check if host device supports INTx Frank Blaschka
2014-10-22 17:17 ` Alex Williamson
2014-10-23  8:21   ` Frank Blaschka
2014-10-23 14:26     ` Alex Williamson
2014-10-24  9:28       ` Frank Blaschka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).