@@ -154,5 +154,8 @@ void virtio_bus_release_ioeventfd(VirtioBusState *bus);
int virtio_bus_set_host_notifier(VirtioBusState *bus, int n, bool assign);
/* Tell the bus that the ioeventfd handler is no longer required. */
void virtio_bus_cleanup_host_notifier(VirtioBusState *bus, int n);
+/* Call virtio_bus_set_host_notifier() for several consecutive vqs */
+int virtio_bus_set_host_notifiers(VirtioBusState *bus, int nvqs, int n_offset,
+ bool assign);
#endif /* VIRTIO_BUS_H */
@@ -308,6 +308,42 @@ void virtio_bus_cleanup_host_notifier(VirtioBusState *bus, int n)
event_notifier_cleanup(notifier);
}
+static void virtio_bus_unset_and_cleanup_host_notifiers(VirtioBusState *bus,
+ int nvqs, int n_offset)
+{
+ int i;
+
+ for (i = 0; i < nvqs; i++) {
+ virtio_bus_set_host_notifier(bus, i + n_offset, false);
+ virtio_bus_cleanup_host_notifier(bus, i + n_offset);
+ }
+}
+
+int virtio_bus_set_host_notifiers(VirtioBusState *bus, int nvqs, int n_offset,
+ bool assign)
+{
+ VirtIODevice *vdev = virtio_bus_get_device(bus);
+ int i;
+ int rc;
+
+ if (assign) {
+ for (i = 0; i < nvqs; i++) {
+ rc = virtio_bus_set_host_notifier(bus, i + n_offset, true);
+ if (rc != 0) {
+ warn_report_once("%s: Failed to set host notifier (%s).\n",
+ vdev->name, strerror(-rc));
+
+ virtio_bus_unset_and_cleanup_host_notifiers(bus, i, n_offset);
+ return rc;
+ }
+ }
+ } else {
+ virtio_bus_unset_and_cleanup_host_notifiers(bus, nvqs, n_offset);
+ }
+
+ return 0;
+}
+
static char *virtio_bus_get_dev_path(DeviceState *dev)
{
BusState *bus = qdev_get_parent_bus(dev);
Multiqueue devices such as virtio-scsi or virtio-blk, all open-code the same pattern to setup/tear down host notifiers of the request virtqueues. Consolidate the pattern in a new virtio_bus_set_host_notifiers() API. Since virtio-scsi and virtio-blk both fallback to userspace if host notifiers can't be set, e.g. file descriptor exhaustion, go for a warning rather than an error. Also make it oneshot to avoid flooding the logs since the message would be very likely the same for all virtqueues. Devices will be converted to use virtio_bus_set_host_notifiers() in separate patches. Signed-off-by: Greg Kurz <groug@kaod.org> --- include/hw/virtio/virtio-bus.h | 3 +++ hw/virtio/virtio-bus.c | 36 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+)