mirror of https://github.com/xqemu/xqemu.git
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: 6798e245a3
("virtio-bus: common ioeventfd infrastructure")
Reported-by: Peter Lieven <pl@kamp.de>
Reported-by: Jason Wang <jasowang@redhat.com>
Reported-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Tested-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Jason Wang <jasowang@redhat.com>
Tested-by: Jason Wang <jasowang@redhat.com>
Tested-by: Peter Lieven <pl@kamp.de>
This commit is contained in:
parent
01c9742d9d
commit
0830c96d70
|
@ -176,8 +176,8 @@ static int set_host_notifier_internal(DeviceState *proxy, VirtioBusState *bus,
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
virtio_queue_set_host_notifier_fd_handler(vq, false, false);
|
|
||||||
k->ioeventfd_assign(proxy, notifier, n, assign);
|
k->ioeventfd_assign(proxy, notifier, n, assign);
|
||||||
|
virtio_queue_set_host_notifier_fd_handler(vq, false, false);
|
||||||
event_notifier_cleanup(notifier);
|
event_notifier_cleanup(notifier);
|
||||||
}
|
}
|
||||||
return r;
|
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);
|
VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(bus);
|
||||||
DeviceState *proxy = DEVICE(BUS(bus)->parent);
|
DeviceState *proxy = DEVICE(BUS(bus)->parent);
|
||||||
VirtIODevice *vdev = virtio_bus_get_device(bus);
|
|
||||||
VirtQueue *vq = virtio_get_queue(vdev, n);
|
|
||||||
|
|
||||||
if (!k->ioeventfd_started) {
|
if (!k->ioeventfd_started) {
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
k->ioeventfd_set_disabled(proxy, assign);
|
||||||
if (assign) {
|
if (assign) {
|
||||||
/*
|
/*
|
||||||
* Stop using the generic ioeventfd, we are doing eventfd handling
|
* Stop using the generic ioeventfd, we are doing eventfd handling
|
||||||
* ourselves below
|
* ourselves below
|
||||||
*/
|
*
|
||||||
k->ioeventfd_set_disabled(proxy, true);
|
* FIXME: We should just switch the handler and not deassign the
|
||||||
}
|
* ioeventfd.
|
||||||
/*
|
|
||||||
* Just switch the handler, don't deassign the ioeventfd.
|
|
||||||
* Otherwise, there's a window where we don't have an
|
* Otherwise, there's a window where we don't have an
|
||||||
* ioeventfd and we may end up with a notification where
|
* ioeventfd and we may end up with a notification where
|
||||||
* we don't expect one.
|
* we don't expect one.
|
||||||
*/
|
*/
|
||||||
virtio_queue_set_host_notifier_fd_handler(vq, assign, !assign);
|
virtio_bus_stop_ioeventfd(bus);
|
||||||
if (!assign) {
|
|
||||||
/* Use generic ioeventfd handler again. */
|
|
||||||
k->ioeventfd_set_disabled(proxy, false);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return set_host_notifier_internal(proxy, bus, n, assign, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *virtio_bus_get_dev_path(DeviceState *dev)
|
static char *virtio_bus_get_dev_path(DeviceState *dev)
|
||||||
|
|
Loading…
Reference in New Issue