Loading hw/vfio/ccw.c +13 −38 Original line number Diff line number Diff line Loading @@ -198,9 +198,8 @@ static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev, Error **errp) { VFIODevice *vdev = &vcdev->vdev; struct vfio_irq_info *irq_info; struct vfio_irq_set *irq_set; size_t argsz; int32_t *pfd; int fd; if (vdev->num_irqs < VFIO_CCW_IO_IRQ_INDEX + 1) { error_setg(errp, "vfio: unexpected number of io irqs %u", Loading @@ -224,56 +223,32 @@ static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev, Error **errp) goto out_free_info; } argsz = sizeof(*irq_set) + sizeof(*pfd); irq_set = g_malloc0(argsz); irq_set->argsz = argsz; irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; irq_set->index = VFIO_CCW_IO_IRQ_INDEX; irq_set->start = 0; irq_set->count = 1; pfd = (int32_t *) &irq_set->data; *pfd = event_notifier_get_fd(&vcdev->io_notifier); qemu_set_fd_handler(*pfd, vfio_ccw_io_notifier_handler, NULL, vcdev); if (ioctl(vdev->fd, VFIO_DEVICE_SET_IRQS, irq_set)) { error_setg(errp, "vfio: Failed to set up io notification"); qemu_set_fd_handler(*pfd, NULL, NULL, vcdev); fd = event_notifier_get_fd(&vcdev->io_notifier); qemu_set_fd_handler(fd, vfio_ccw_io_notifier_handler, NULL, vcdev); if (vfio_set_irq_signaling(vdev, VFIO_CCW_IO_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) { qemu_set_fd_handler(fd, NULL, NULL, vcdev); event_notifier_cleanup(&vcdev->io_notifier); } g_free(irq_set); out_free_info: g_free(irq_info); } static void vfio_ccw_unregister_io_notifier(VFIOCCWDevice *vcdev) { struct vfio_irq_set *irq_set; size_t argsz; int32_t *pfd; argsz = sizeof(*irq_set) + sizeof(*pfd); irq_set = g_malloc0(argsz); irq_set->argsz = argsz; irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; irq_set->index = VFIO_CCW_IO_IRQ_INDEX; irq_set->start = 0; irq_set->count = 1; pfd = (int32_t *) &irq_set->data; *pfd = -1; Error *err = NULL; if (ioctl(vcdev->vdev.fd, VFIO_DEVICE_SET_IRQS, irq_set)) { error_report("vfio: Failed to de-assign device io fd: %m"); vfio_set_irq_signaling(&vcdev->vdev, VFIO_CCW_IO_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err); if (err) { error_reportf_err(err, VFIO_MSG_PREFIX, vcdev->vdev.name); } qemu_set_fd_handler(event_notifier_get_fd(&vcdev->io_notifier), NULL, NULL, vcdev); event_notifier_cleanup(&vcdev->io_notifier); g_free(irq_set); } static void vfio_ccw_get_region(VFIOCCWDevice *vcdev, Error **errp) Loading Loading
hw/vfio/ccw.c +13 −38 Original line number Diff line number Diff line Loading @@ -198,9 +198,8 @@ static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev, Error **errp) { VFIODevice *vdev = &vcdev->vdev; struct vfio_irq_info *irq_info; struct vfio_irq_set *irq_set; size_t argsz; int32_t *pfd; int fd; if (vdev->num_irqs < VFIO_CCW_IO_IRQ_INDEX + 1) { error_setg(errp, "vfio: unexpected number of io irqs %u", Loading @@ -224,56 +223,32 @@ static void vfio_ccw_register_io_notifier(VFIOCCWDevice *vcdev, Error **errp) goto out_free_info; } argsz = sizeof(*irq_set) + sizeof(*pfd); irq_set = g_malloc0(argsz); irq_set->argsz = argsz; irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; irq_set->index = VFIO_CCW_IO_IRQ_INDEX; irq_set->start = 0; irq_set->count = 1; pfd = (int32_t *) &irq_set->data; *pfd = event_notifier_get_fd(&vcdev->io_notifier); qemu_set_fd_handler(*pfd, vfio_ccw_io_notifier_handler, NULL, vcdev); if (ioctl(vdev->fd, VFIO_DEVICE_SET_IRQS, irq_set)) { error_setg(errp, "vfio: Failed to set up io notification"); qemu_set_fd_handler(*pfd, NULL, NULL, vcdev); fd = event_notifier_get_fd(&vcdev->io_notifier); qemu_set_fd_handler(fd, vfio_ccw_io_notifier_handler, NULL, vcdev); if (vfio_set_irq_signaling(vdev, VFIO_CCW_IO_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, fd, errp)) { qemu_set_fd_handler(fd, NULL, NULL, vcdev); event_notifier_cleanup(&vcdev->io_notifier); } g_free(irq_set); out_free_info: g_free(irq_info); } static void vfio_ccw_unregister_io_notifier(VFIOCCWDevice *vcdev) { struct vfio_irq_set *irq_set; size_t argsz; int32_t *pfd; argsz = sizeof(*irq_set) + sizeof(*pfd); irq_set = g_malloc0(argsz); irq_set->argsz = argsz; irq_set->flags = VFIO_IRQ_SET_DATA_EVENTFD | VFIO_IRQ_SET_ACTION_TRIGGER; irq_set->index = VFIO_CCW_IO_IRQ_INDEX; irq_set->start = 0; irq_set->count = 1; pfd = (int32_t *) &irq_set->data; *pfd = -1; Error *err = NULL; if (ioctl(vcdev->vdev.fd, VFIO_DEVICE_SET_IRQS, irq_set)) { error_report("vfio: Failed to de-assign device io fd: %m"); vfio_set_irq_signaling(&vcdev->vdev, VFIO_CCW_IO_IRQ_INDEX, 0, VFIO_IRQ_SET_ACTION_TRIGGER, -1, &err); if (err) { error_reportf_err(err, VFIO_MSG_PREFIX, vcdev->vdev.name); } qemu_set_fd_handler(event_notifier_get_fd(&vcdev->io_notifier), NULL, NULL, vcdev); event_notifier_cleanup(&vcdev->io_notifier); g_free(irq_set); } static void vfio_ccw_get_region(VFIOCCWDevice *vcdev, Error **errp) Loading