Only the vdpa device support configure interrupt, we need to disable the configure interrupt process in all other device. In order to achieve this, I added a check in the virtio_net_device_realize(). When the peer's type is vdpa, the value of config_irq_enabled in the structure VirtIODevice will set to true.
Signed-off-by: Cindy Lu <l...@redhat.com> --- hw/net/virtio-net.c | 5 ++++- hw/virtio/virtio.c | 1 + include/hw/virtio/virtio.h | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index 80c56f0cfc..3b487864a8 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -3749,12 +3749,15 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) nc = qemu_get_queue(n->nic); nc->rxfilter_notify_enabled = 1; + vdev->config_irq_enabled = false; - if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_VHOST_VDPA) { + 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); vhost_net_set_config(get_vhost_net(nc->peer), (uint8_t *)&netcfg, 0, ETH_ALEN, VHOST_SET_CONFIG_TYPE_FRONTEND); + + vdev->config_irq_enabled = true; } QTAILQ_INIT(&n->rsc_chains); n->qdev = dev; diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c index 3a160f86ed..6b52a7190d 100644 --- a/hw/virtio/virtio.c +++ b/hw/virtio/virtio.c @@ -3255,6 +3255,7 @@ void virtio_init(VirtIODevice *vdev, uint16_t device_id, size_t config_size) virtio_vmstate_change, vdev); vdev->device_endian = virtio_default_endian(); vdev->use_guest_notifier_mask = true; + vdev->config_irq_enabled = false; } /* diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index c8f72850bc..a7763b71e0 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -164,6 +164,7 @@ struct VirtIODevice */ EventNotifier config_notifier; bool device_iotlb_enabled; + bool config_irq_enabled; }; struct VirtioDeviceClass { -- 2.43.0