0727d3
From bc307149fe4e3fe2a3e0ac52534383c955051e7e Mon Sep 17 00:00:00 2001
0727d3
From: Si-Wei Liu <si-wei.liu@oracle.com>
0727d3
Date: Fri, 6 May 2022 19:28:12 -0700
0727d3
Subject: [PATCH 14/24] virtio-net: setup vhost_dev and notifiers for cvq only
0727d3
 when feature is negotiated
0727d3
MIME-Version: 1.0
0727d3
Content-Type: text/plain; charset=UTF-8
0727d3
Content-Transfer-Encoding: 8bit
0727d3
0727d3
RH-Author: Jason Wang <jasowang@redhat.com>
0727d3
RH-MergeRequest: 187: Multiqueue fixes for vhost-vDPA
0727d3
RH-Commit: [1/7] 38bcfaa661f437b3dfa6b6f152dffd60073dc054
0727d3
RH-Bugzilla: 2069946
0727d3
RH-Acked-by: Eugenio PĂ©rez <eperezma@redhat.com>
0727d3
RH-Acked-by: Cindy Lu <lulu@redhat.com>
0727d3
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
0727d3
0727d3
When the control virtqueue feature is absent or not negotiated,
0727d3
vhost_net_start() still tries to set up vhost_dev and install
0727d3
vhost notifiers for the control virtqueue, which results in
0727d3
erroneous ioctl calls with incorrect queue index sending down
0727d3
to driver. Do that only when needed.
0727d3
0727d3
Fixes: 22288fe ("virtio-net: vhost control virtqueue support")
0727d3
Signed-off-by: Si-Wei Liu <si-wei.liu@oracle.com>
0727d3
Acked-by: Jason Wang <jasowang@redhat.com>
0727d3
Message-Id: <1651890498-24478-2-git-send-email-si-wei.liu@oracle.com>
0727d3
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
0727d3
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
0727d3
(cherry picked from commit aa8581945a13712ff3eed0ad3ba7a9664fc1604b)
0727d3
Signed-off-by: Jason Wang <jasowang@redhat.com>
0727d3
---
0727d3
 hw/net/virtio-net.c | 3 ++-
0727d3
 1 file changed, 2 insertions(+), 1 deletion(-)
0727d3
0727d3
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
0727d3
index e1f4748831..ec045c3f41 100644
0727d3
--- a/hw/net/virtio-net.c
0727d3
+++ b/hw/net/virtio-net.c
0727d3
@@ -244,7 +244,8 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
0727d3
     VirtIODevice *vdev = VIRTIO_DEVICE(n);
0727d3
     NetClientState *nc = qemu_get_queue(n->nic);
0727d3
     int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1;
0727d3
-    int cvq = n->max_ncs - n->max_queue_pairs;
0727d3
+    int cvq = virtio_vdev_has_feature(vdev, VIRTIO_NET_F_CTRL_VQ) ?
0727d3
+              n->max_ncs - n->max_queue_pairs : 0;
0727d3
 
0727d3
     if (!get_vhost_net(nc->peer)) {
0727d3
         return;
0727d3
-- 
0727d3
2.35.3
0727d3