virtio: quick fix
Fixes a regression in virtio that's causing issues for many people. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJaaMBYAAoJECgfDbjSjVRpH9cH/izjScalZuvCN57+fqEtDW6C oudm+wWac91qAKY4U8UfWsR1Aph8bGqZKXwBPM7c/DTdzPAPjBmkY+P/E392wWAY 6IoJIRTyQUYhABuftWt61UV6+waEGDFXegGlgcse8JZ/ddD62v/9Bll78w4nfivE w5DvMBYPzVJV4N7Q7CiP3XOf4qHD9TNAd/s6wSdmPCLT0VztLYsjvrfwuEY58bTa i3W16BUV3R1SUGBq+EWG2LjAUfyUDleTyTVA6tI+hWbazPFHDFfZO9/xFsAfgTpv Wmx45OAhPwr8lVeatF9ljh1AxBQUiUHHBN8rRKljU5evEERS/4lrR/FXWdalEvI= =2+BS -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging virtio: quick fix Fixes a regression in virtio that's causing issues for many people. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # gpg: Signature made Wed 24 Jan 2018 17:20:24 GMT # gpg: using RSA key 0x281F0DB8D28D5469 # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" # Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67 # Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469 * remotes/mst/tags/for_upstream: Revert "qemu: add a cleanup callback function to EventNotifier" Revert "virtio: postpone the execution of event_notifier_cleanup function" Revert "virtio: improve virtio devices initialization time" Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
834a336eb9
@ -812,10 +812,6 @@ static void kvm_mem_ioeventfd_del(MemoryListener *listener,
|
||||
if (r < 0) {
|
||||
abort();
|
||||
}
|
||||
|
||||
if (e->cleanup) {
|
||||
e->cleanup(e);
|
||||
}
|
||||
}
|
||||
|
||||
static void kvm_io_ioeventfd_add(MemoryListener *listener,
|
||||
|
@ -256,15 +256,6 @@ bool virtio_bus_ioeventfd_enabled(VirtioBusState *bus)
|
||||
return k->ioeventfd_assign && k->ioeventfd_enabled(proxy);
|
||||
}
|
||||
|
||||
static void virtio_bus_cleanup_event_notifier(EventNotifier *notifier)
|
||||
{
|
||||
/* Test and clear notifier after disabling event,
|
||||
* in case poll callback didn't have time to run.
|
||||
*/
|
||||
virtio_queue_host_notifier_read(notifier);
|
||||
event_notifier_cleanup(notifier);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function switches ioeventfd on/off in the device.
|
||||
* The caller must set or clear the handlers for the EventNotifier.
|
||||
@ -292,13 +283,19 @@ int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign)
|
||||
r = k->ioeventfd_assign(proxy, notifier, n, true);
|
||||
if (r < 0) {
|
||||
error_report("%s: unable to assign ioeventfd: %d", __func__, r);
|
||||
virtio_bus_cleanup_event_notifier(notifier);
|
||||
goto cleanup_event_notifier;
|
||||
}
|
||||
return 0;
|
||||
} else {
|
||||
notifier->cleanup = virtio_bus_cleanup_event_notifier;
|
||||
k->ioeventfd_assign(proxy, notifier, n, false);
|
||||
}
|
||||
|
||||
cleanup_event_notifier:
|
||||
/* Test and clear notifier after disabling event,
|
||||
* in case poll callback didn't have time to run.
|
||||
*/
|
||||
virtio_queue_host_notifier_read(notifier);
|
||||
event_notifier_cleanup(notifier);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -2574,7 +2574,6 @@ static int virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)
|
||||
VirtioBusState *qbus = VIRTIO_BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
||||
int n, r, err;
|
||||
|
||||
memory_region_transaction_begin();
|
||||
for (n = 0; n < VIRTIO_QUEUE_MAX; n++) {
|
||||
VirtQueue *vq = &vdev->vq[n];
|
||||
if (!virtio_queue_get_num(vdev, n)) {
|
||||
@ -2597,7 +2596,6 @@ static int virtio_device_start_ioeventfd_impl(VirtIODevice *vdev)
|
||||
}
|
||||
event_notifier_set(&vq->host_notifier);
|
||||
}
|
||||
memory_region_transaction_commit();
|
||||
return 0;
|
||||
|
||||
assign_error:
|
||||
@ -2611,7 +2609,6 @@ assign_error:
|
||||
r = virtio_bus_set_host_notifier(qbus, n, false);
|
||||
assert(r >= 0);
|
||||
}
|
||||
memory_region_transaction_commit();
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -2628,7 +2625,6 @@ static void virtio_device_stop_ioeventfd_impl(VirtIODevice *vdev)
|
||||
VirtioBusState *qbus = VIRTIO_BUS(qdev_get_parent_bus(DEVICE(vdev)));
|
||||
int n, r;
|
||||
|
||||
memory_region_transaction_begin();
|
||||
for (n = 0; n < VIRTIO_QUEUE_MAX; n++) {
|
||||
VirtQueue *vq = &vdev->vq[n];
|
||||
|
||||
@ -2639,7 +2635,6 @@ static void virtio_device_stop_ioeventfd_impl(VirtIODevice *vdev)
|
||||
r = virtio_bus_set_host_notifier(qbus, n, false);
|
||||
assert(r >= 0);
|
||||
}
|
||||
memory_region_transaction_commit();
|
||||
}
|
||||
|
||||
void virtio_device_stop_ioeventfd(VirtIODevice *vdev)
|
||||
|
@ -26,7 +26,6 @@ struct EventNotifier {
|
||||
int rfd;
|
||||
int wfd;
|
||||
#endif
|
||||
void (*cleanup)(EventNotifier *);
|
||||
};
|
||||
|
||||
typedef void EventNotifierHandler(EventNotifier *);
|
||||
|
@ -29,7 +29,6 @@ void event_notifier_init_fd(EventNotifier *e, int fd)
|
||||
{
|
||||
e->rfd = fd;
|
||||
e->wfd = fd;
|
||||
e->cleanup = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -66,7 +65,6 @@ int event_notifier_init(EventNotifier *e, int active)
|
||||
e->rfd = fds[0];
|
||||
e->wfd = fds[1];
|
||||
}
|
||||
e->cleanup = NULL;
|
||||
if (active) {
|
||||
event_notifier_set(e);
|
||||
}
|
||||
@ -82,11 +80,10 @@ void event_notifier_cleanup(EventNotifier *e)
|
||||
{
|
||||
if (e->rfd != e->wfd) {
|
||||
close(e->rfd);
|
||||
e->rfd = -1;
|
||||
}
|
||||
close(e->wfd);
|
||||
e->rfd = -1;
|
||||
e->wfd = -1;
|
||||
e->cleanup = NULL;
|
||||
}
|
||||
|
||||
int event_notifier_get_fd(const EventNotifier *e)
|
||||
|
@ -19,7 +19,6 @@ int event_notifier_init(EventNotifier *e, int active)
|
||||
{
|
||||
e->event = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
assert(e->event);
|
||||
e->cleanup = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -27,7 +26,6 @@ void event_notifier_cleanup(EventNotifier *e)
|
||||
{
|
||||
CloseHandle(e->event);
|
||||
e->event = NULL;
|
||||
e->cleanup = NULL;
|
||||
}
|
||||
|
||||
HANDLE event_notifier_get_handle(EventNotifier *e)
|
||||
|
Loading…
Reference in New Issue
Block a user