On Fri, Oct 5, 2012 at 5:11 PM, Alex Williamson <alex.williamson@xxxxxxxxxx> wrote: > On Fri, 2012-10-05 at 16:54 +0000, Blue Swirl wrote: >> On Wed, Sep 26, 2012 at 5:19 PM, Alex Williamson >> <alex.williamson@xxxxxxxxxx> wrote: >> > + >> > +typedef struct QEMU_PACKED VFIOIRQSetFD { >> > + struct vfio_irq_set irq_set; >> > + int32_t fd; >> > +} VFIOIRQSetFD; >> >> I'm now getting this error from Clang: >> >> /src/qemu/hw/vfio_pci.c:126:25: error: field 'irq_set' with variable >> sized type 'struct vfio_irq_set' not at the end of a struct or class >> is a GNU extension [-Werror,-Wgnu] >> struct vfio_irq_set irq_set; >> >> Does the kernel really use the fd field, isn't it implicit from the >> ioctl fd or are they different? > > The kernel side is defined as: > > struct vfio_irq_set { > __u32 argsz; > __u32 flags; > __u32 index; > __u32 start; > __u32 count; > __u8 data[]; > }; Then the kernel only expects vfio_irq_set structure, not VFIOIRQSetFD, so you should use &irq_set_fd.irq_set instead of &irq_set_fd for the ioctl(). Then VFIOIRQSetFD can be rearranged to have fd field first, also QEMU_PACKED is not necessary. > > Where data is the start of a variable sized array. The data type of the > array depends on the flags. The purpose of VFIOIRQSetFD is simply to > make a data type that I don't need to dynamically allocate. You can > find other cases for MSI and MSIX where we don't know the array size and > do malloc the whole structure. For this interrupt type we know there's > only one entry. If there's a better way to do this, let me know. VFIO > is only available on Linux hosts, so I have no particular reason to > avoid GNU extensions. > >> > + >> > +static int vfio_enable_intx(VFIODevice *vdev) >> > +{ >> > + VFIOIRQSetFD irq_set_fd = { >> > + .irq_set = { >> > + .argsz = sizeof(irq_set_fd), >> > + .flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER, >> > + .index = VFIO_PCI_INTX_IRQ_INDEX, >> > + .start = 0, >> > + .count = 1, >> > + }, >> >> Here the field is not even initialized. > > It's initialized later... > >> > + }; >> > + uint8_t pin = vfio_pci_read_config(&vdev->pdev, PCI_INTERRUPT_PIN, 1); >> > + int ret; >> > + >> > + if (vdev->intx.disabled || !pin) { >> > + return 0; >> > + } >> > + >> > + vfio_disable_interrupts(vdev); >> > + >> > + vdev->intx.pin = pin - 1; /* Pin A (1) -> irq[0] */ >> > + ret = event_notifier_init(&vdev->intx.interrupt, 0); >> > + if (ret) { >> > + error_report("vfio: Error: event_notifier_init failed\n"); >> > + return ret; >> > + } >> > + >> > + irq_set_fd.fd = event_notifier_get_fd(&vdev->intx.interrupt); > > Here. > > Thanks, > Alex > -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html