Commit 0830c96d authored by Cornelia Huck's avatar Cornelia Huck Committed by Michael S. Tsirkin
Browse files

virtio: revert host notifiers to old semantics



The host notifier rework tried both to unify host notifiers across
transports and plug a possible hole during host notifier
re-assignment. Unfortunately, this meant a change in semantics that
breaks vhost and iSCSI+dataplane.

As the minimal fix, keep the common host notifier code but revert
to the old semantics so that we have time to figure out the proper
fix.

Fixes: 6798e245 ("virtio-bus: common ioeventfd infrastructure")
Reported-by: default avatarPeter Lieven <pl@kamp.de>
Reported-by: default avatarJason Wang <jasowang@redhat.com>
Reported-by: default avatarMarc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Tested-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: default avatarJason Wang <jasowang@redhat.com>
Tested-by: default avatarJason Wang <jasowang@redhat.com>
Tested-by: default avatarPeter Lieven <pl@kamp.de>
parent 01c9742d
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -176,8 +176,8 @@ static int set_host_notifier_internal(DeviceState *proxy, VirtioBusState *bus,
            return r;
        }
    } else {
        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
        k->ioeventfd_assign(proxy, notifier, n, assign);
        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
        event_notifier_cleanup(notifier);
    }
    return r;
@@ -251,31 +251,25 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign)
{
    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
    DeviceState *proxy = DEVICE(BUS(bus)->parent);
    VirtIODevice *vdev = virtio_bus_get_device(bus);
    VirtQueue *vq = virtio_get_queue(vdev, n);

    if (!k->ioeventfd_started) {
        return -ENOSYS;
    }
    k->ioeventfd_set_disabled(proxy, assign);
    if (assign) {
        /*
         * Stop using the generic ioeventfd, we are doing eventfd handling
         * ourselves below
         */
        k->ioeventfd_set_disabled(proxy, true);
    }
    /*
     * Just switch the handler, don't deassign the ioeventfd.
         *
         * FIXME: We should just switch the handler and not deassign the
         * ioeventfd.
         * Otherwise, there's a window where we don't have an
         * ioeventfd and we may end up with a notification where
         * we don't expect one.
         */
    virtio_queue_set_host_notifier_fd_handler(vq, assign, !assign);
    if (!assign) {
        /* Use generic ioeventfd handler again. */
        k->ioeventfd_set_disabled(proxy, false);
        virtio_bus_stop_ioeventfd(bus);
    }
    return 0;
    return set_host_notifier_internal(proxy, bus, n, assign, false);
}

static char *virtio_bus_get_dev_path(DeviceState *dev)