From: Eugenio Pérez <epere...@redhat.com> Qemu falls back on userland handlers even if vhost-user and vhost-vdpa cases. These assumes a tap device can handle the packets.
If a vdpa device fail to start, it can trigger a sigsegv because of that. Do not resort on them unless actually possible. Signed-off-by: Eugenio Pérez <epere...@redhat.com> --- hw/net/virtio-net.c | 4 ++++ hw/virtio/virtio.c | 21 +++++++++++++-------- include/hw/virtio/virtio.h | 2 ++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index ffaf481..9cdf777 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3523,6 +3523,10 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) nc = qemu_get_queue(n->nic); nc->rxfilter_notify_enabled = 1; + if (!nc->peer || nc->peer->info->type != NET_CLIENT_DRIVER_TAP) { + /* Only tap can use userspace networking */ + vdev->disable_ioeventfd_handler = true; + } if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { struct virtio_net_config netcfg = {}; memcpy(&netcfg.mac, &n->nic_conf.macaddr, ETH_ALEN); diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 9d637e0..806603b 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3708,17 +3708,22 @@ static int virtio_device_start_ioeventfd_impl(VirtIODevice *vdev) err = r; goto assign_error; } - event_notifier_set_handler(&vq->host_notifier, - virtio_queue_host_notifier_read); + + if (!vdev->disable_ioeventfd_handler) { + event_notifier_set_handler(&vq->host_notifier, + virtio_queue_host_notifier_read); + } } - for (n = 0; n < VIRTIO_QUEUE_MAX; n++) { - /* Kick right away to begin processing requests already in vring */ - VirtQueue *vq = &vdev->vq[n]; - if (!vq->vring.num) { - continue; + if (!vdev->disable_ioeventfd_handler) { + for (n = 0; n < VIRTIO_QUEUE_MAX; n++) { + /* Kick right away to begin processing requests already in vring */ + VirtQueue *vq = &vdev->vq[n]; + if (!vq->vring.num) { + continue; + } + event_notifier_set(&vq->host_notifier); } - event_notifier_set(&vq->host_notifier); } memory_region_transaction_commit(); return 0; diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index b31c450..b6ce5f0 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -105,6 +105,8 @@ struct VirtIODevice VMChangeStateEntry *vmstate; char *bus_name; uint8_t device_endian; + /* backend does not support userspace handler */ + bool disable_ioeventfd_handler; bool use_guest_notifier_mask; AddressSpace *dma_as; QLIST_HEAD(, VirtQueue) *vector_queues; -- 1.8.3.1