Skip to content

Commit 22288fe

Browse files
jasowangmstsirkin
authored andcommitted
virtio-net: vhost control virtqueue support
This patch implements the control virtqueue support for vhost. This requires virtio-net to figure out the datapath queue pairs and control virtqueue via is_datapath and pass the number of those two types of virtqueues to vhost_net_start()/vhost_net_stop(). Signed-off-by: Jason Wang <[email protected]> Message-Id: <[email protected]> Reviewed-by: Michael S. Tsirkin <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]>
1 parent 049eb15 commit 22288fe

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

hw/net/vhost_net.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ int vhost_net_start(VirtIODevice *dev, NetClientState *ncs,
326326
VirtIONet *n = VIRTIO_NET(dev);
327327
int nvhosts = data_queue_pairs + cvq;
328328
struct vhost_net *net;
329-
int r, e, i, last_index = data_qps * 2;
329+
int r, e, i, last_index = data_queue_pairs * 2;
330330
NetClientState *peer;
331331

332332
if (!cvq) {

hw/net/virtio-net.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
244244
VirtIODevice *vdev = VIRTIO_DEVICE(n);
245245
NetClientState *nc = qemu_get_queue(n->nic);
246246
int queue_pairs = n->multiqueue ? n->max_queue_pairs : 1;
247+
int cvq = n->max_ncs - n->max_queue_pairs;
247248

248249
if (!get_vhost_net(nc->peer)) {
249250
return;
@@ -285,14 +286,14 @@ static void virtio_net_vhost_status(VirtIONet *n, uint8_t status)
285286
}
286287

287288
n->vhost_started = 1;
288-
r = vhost_net_start(vdev, n->nic->ncs, queue_pairs, 0);
289+
r = vhost_net_start(vdev, n->nic->ncs, queue_pairs, cvq);
289290
if (r < 0) {
290291
error_report("unable to start vhost net: %d: "
291292
"falling back on userspace virtio", -r);
292293
n->vhost_started = 0;
293294
}
294295
} else {
295-
vhost_net_stop(vdev, n->nic->ncs, queue_pairs, 0);
296+
vhost_net_stop(vdev, n->nic->ncs, queue_pairs, cvq);
296297
n->vhost_started = 0;
297298
}
298299
}
@@ -3411,9 +3412,23 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
34113412
return;
34123413
}
34133414

3414-
n->max_queue_pairs = MAX(n->nic_conf.peers.queues, 1);
3415+
n->max_ncs = MAX(n->nic_conf.peers.queues, 1);
3416+
3417+
/*
3418+
* Figure out the datapath queue pairs since the backend could
3419+
* provide control queue via peers as well.
3420+
*/
3421+
if (n->nic_conf.peers.queues) {
3422+
for (i = 0; i < n->max_ncs; i++) {
3423+
if (n->nic_conf.peers.ncs[i]->is_datapath) {
3424+
++n->max_queue_pairs;
3425+
}
3426+
}
3427+
}
3428+
n->max_queue_pairs = MAX(n->max_queue_pairs, 1);
3429+
34153430
if (n->max_queue_pairs * 2 + 1 > VIRTIO_QUEUE_MAX) {
3416-
error_setg(errp, "Invalid number of queue_pairs (= %" PRIu32 "), "
3431+
error_setg(errp, "Invalid number of queue pairs (= %" PRIu32 "), "
34173432
"must be a positive integer less than %d.",
34183433
n->max_queue_pairs, (VIRTIO_QUEUE_MAX - 1) / 2);
34193434
virtio_cleanup(vdev);

include/hw/virtio/virtio-net.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ struct VirtIONet {
196196
int multiqueue;
197197
uint16_t max_queue_pairs;
198198
uint16_t curr_queue_pairs;
199+
uint16_t max_ncs;
199200
size_t config_size;
200201
char *netclient_name;
201202
char *netclient_type;

0 commit comments

Comments
 (0)