diff options
author | Michael S. Tsirkin <mst@redhat.com> | 2017-07-03 22:25:24 +0300 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2017-07-03 22:29:49 +0300 |
commit | 2eef278b9e6326707410eed23be40e57f6c331b7 (patch) | |
tree | 74362e21b1fb8a9f59958a09d1da343467c0e508 /hw/net | |
parent | 83f3c7091968979ed07869dce9e0df62170f33b4 (diff) | |
download | qemu-2eef278b9e6326707410eed23be40e57f6c331b7.zip qemu-2eef278b9e6326707410eed23be40e57f6c331b7.tar.gz qemu-2eef278b9e6326707410eed23be40e57f6c331b7.tar.bz2 |
virtio-net: fix tx queue size for !vhost-user
Current code segfaults when no nic peer is specified.
Fix it up - fall back to default queue size.
Fixes: 9b02e1618cf26a ("virtio-net: enable configurable tx queue size")
Cc: Wei Wang <wei.w.wang@intel.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/net')
-rw-r--r-- | hw/net/virtio-net.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c index a1fc0db..5630a9e 100644 --- a/hw/net/virtio-net.c +++ b/hw/net/virtio-net.c @@ -498,6 +498,24 @@ static void virtio_net_set_mrg_rx_bufs(VirtIONet *n, int mergeable_rx_bufs, } } +static int virtio_net_max_tx_queue_size(VirtIONet *n) +{ + NetClientState *peer = n->nic_conf.peers.ncs[0]; + + /* + * Backends other than vhost-user don't support max queue size. + */ + if (!peer) { + return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; + } + + if (peer->info->type != NET_CLIENT_DRIVER_VHOST_USER) { + return VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; + } + + return VIRTQUEUE_MAX_SIZE; +} + static int peer_attach(VirtIONet *n, int index) { NetClientState *nc = qemu_get_subqueue(n->nic, index); @@ -1964,14 +1982,8 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp) error_report("Defaulting to \"bh\""); } - /* - * Currently, backends other than vhost-user don't support 1024 queue - * size. - */ - if (n->net_conf.tx_queue_size == VIRTQUEUE_MAX_SIZE && - n->nic_conf.peers.ncs[0]->info->type != NET_CLIENT_DRIVER_VHOST_USER) { - n->net_conf.tx_queue_size = VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE; - } + n->net_conf.tx_queue_size = MIN(virtio_net_max_tx_queue_size(n), + n->net_conf.tx_queue_size); for (i = 0; i < n->max_queues; i++) { virtio_net_add_queue(n, i); |