Message ID | 20200813172957.8289-5-philmd@redhat.com |
---|---|
State | New |
Headers | show |
Series | util/vfio-helpers: Add support for multiple IRQs | expand |
On Thu, 13 Aug 2020 19:29:54 +0200 Philippe Mathieu-Daudé <philmd@redhat.com> wrote: > As we want to use more than one single IRQ, add a check that > the device accept our request to use multiple IRQs. > > Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> > --- > util/vfio-helpers.c | 6 ++++++ > util/trace-events | 1 + > 2 files changed, 7 insertions(+) > > diff --git a/util/vfio-helpers.c b/util/vfio-helpers.c > index bad60076f3..b81d4c70c2 100644 > --- a/util/vfio-helpers.c > +++ b/util/vfio-helpers.c > @@ -335,6 +335,12 @@ static int qemu_vfio_init_pci(QEMUVFIOState *s, const char *device, > ret = -errno; > goto fail; > } > + trace_qemu_vfio_init_pci(device_info.num_irqs); > + if (device_info.num_irqs < irq_count) { > + error_setg(errp, "Invalid device IRQ count"); > + ret = -EINVAL; > + goto fail; > + } This is confusing the number of IRQ indexes (ie. IRQ types - INTx/MSI/MSIx plus virtual interrupts like error reporting and device request) with the number of sub-indexes available for a given type again. You actually need to look at VFIO_DEVICE_GET_IRQ_INFO for the specified irq_type to see if it supports irq_count sub-indexes. Maybe think of interrupts as a 2-dimensional array, we have: INDEX \ SUBINDEX \ 0 1 2 3 4 ... N ========================== INTx [0]| MSI [1]| MSI-X [2]| ... [M]| VFIO_DEVICE_GET_INFO only tells us essentially the last INDEX that the device supports. In order to learn about the number of SUBINDEXes, or vectors, if any, that each INDEX provides, we need to look at VFIO_DEVICE_GET_IRQ_INFO. When we're wanting to probe support for some number of concurrent device interrupt vectors, we need to look at the vfio_irq_info.count value for the desired index, ie. the extent of the entries in the row associated with our column index type. Thanks, Alex > s->irq_type = irq_type; > s->irq_count = irq_count; > > diff --git a/util/trace-events b/util/trace-events > index 0ce42822eb..2e85555be3 100644 > --- a/util/trace-events > +++ b/util/trace-events > @@ -83,3 +83,4 @@ qemu_vfio_new_mapping(void *s, void *host, size_t size, int index, uint64_t iova > qemu_vfio_do_mapping(void *s, void *host, size_t size, uint64_t iova) "s %p host %p size %zu iova 0x%"PRIx64 > qemu_vfio_dma_map(void *s, void *host, size_t size, bool temporary, uint64_t *iova) "s %p host %p size %zu temporary %d iova %p" > qemu_vfio_dma_unmap(void *s, void *host) "s %p host %p" > +qemu_vfio_init_pci(uint32_t count) "device interrupt count: %"PRIu32
diff --git a/util/vfio-helpers.c b/util/vfio-helpers.c index bad60076f3..b81d4c70c2 100644 --- a/util/vfio-helpers.c +++ b/util/vfio-helpers.c @@ -335,6 +335,12 @@ static int qemu_vfio_init_pci(QEMUVFIOState *s, const char *device, ret = -errno; goto fail; } + trace_qemu_vfio_init_pci(device_info.num_irqs); + if (device_info.num_irqs < irq_count) { + error_setg(errp, "Invalid device IRQ count"); + ret = -EINVAL; + goto fail; + } s->irq_type = irq_type; s->irq_count = irq_count; diff --git a/util/trace-events b/util/trace-events index 0ce42822eb..2e85555be3 100644 --- a/util/trace-events +++ b/util/trace-events @@ -83,3 +83,4 @@ qemu_vfio_new_mapping(void *s, void *host, size_t size, int index, uint64_t iova qemu_vfio_do_mapping(void *s, void *host, size_t size, uint64_t iova) "s %p host %p size %zu iova 0x%"PRIx64 qemu_vfio_dma_map(void *s, void *host, size_t size, bool temporary, uint64_t *iova) "s %p host %p size %zu temporary %d iova %p" qemu_vfio_dma_unmap(void *s, void *host) "s %p host %p" +qemu_vfio_init_pci(uint32_t count) "device interrupt count: %"PRIu32
As we want to use more than one single IRQ, add a check that the device accept our request to use multiple IRQs. Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com> --- util/vfio-helpers.c | 6 ++++++ util/trace-events | 1 + 2 files changed, 7 insertions(+)