All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Wei Wang <wei.w.wang@intel.com>, Jason Wang <jasowang@redhat.com>
Subject: [Qemu-devel] [PULL 01/21] virtio-net: enable configurable tx queue size
Date: Mon, 3 Jul 2017 22:44:32 +0300	[thread overview]
Message-ID: <1499111049-13721-2-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1499111049-13721-1-git-send-email-mst@redhat.com>

From: Wei Wang <wei.w.wang@intel.com>

This patch enables the virtio-net tx queue size to be configurable
between 256 (the default queue size) and 1024 by the user when the
vhost-user backend is used.

Currently, the maximum tx queue size for other backends is 512 due
to the following limitations:
- QEMU backend: the QEMU backend implementation in some cases may
send 1024+1 iovs to writev.
- Vhost_net backend: there are possibilities that the guest sends
a vring_desc of memory which crosses a MemoryRegion thereby
generating more than 1024 iovs after translation from guest-physical
address in the backend.

Signed-off-by: Wei Wang <wei.w.wang@intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/virtio/virtio-net.h |  1 +
 hw/net/virtio-net.c            | 32 ++++++++++++++++++++++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/include/hw/virtio/virtio-net.h b/include/hw/virtio/virtio-net.h
index 602b486..b81b6a4 100644
--- a/include/hw/virtio/virtio-net.h
+++ b/include/hw/virtio/virtio-net.h
@@ -36,6 +36,7 @@ typedef struct virtio_net_conf
     int32_t txburst;
     char *tx;
     uint16_t rx_queue_size;
+    uint16_t tx_queue_size;
     uint16_t mtu;
 } virtio_net_conf;
 
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 91eddaf..a1fc0db 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -34,8 +34,11 @@
 
 /* previously fixed value */
 #define VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE 256
+#define VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE 256
+
 /* for now, only allow larger queues; with virtio-1, guest can downsize */
 #define VIRTIO_NET_RX_QUEUE_MIN_SIZE VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE
+#define VIRTIO_NET_TX_QUEUE_MIN_SIZE VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE
 
 /*
  * Calculate the number of bytes up to and including the given 'field' of
@@ -1508,15 +1511,18 @@ static void virtio_net_add_queue(VirtIONet *n, int index)
 
     n->vqs[index].rx_vq = virtio_add_queue(vdev, n->net_conf.rx_queue_size,
                                            virtio_net_handle_rx);
+
     if (n->net_conf.tx && !strcmp(n->net_conf.tx, "timer")) {
         n->vqs[index].tx_vq =
-            virtio_add_queue(vdev, 256, virtio_net_handle_tx_timer);
+            virtio_add_queue(vdev, n->net_conf.tx_queue_size,
+                             virtio_net_handle_tx_timer);
         n->vqs[index].tx_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
                                               virtio_net_tx_timer,
                                               &n->vqs[index]);
     } else {
         n->vqs[index].tx_vq =
-            virtio_add_queue(vdev, 256, virtio_net_handle_tx_bh);
+            virtio_add_queue(vdev, n->net_conf.tx_queue_size,
+                             virtio_net_handle_tx_bh);
         n->vqs[index].tx_bh = qemu_bh_new(virtio_net_tx_bh, &n->vqs[index]);
     }
 
@@ -1927,6 +1933,17 @@ static void virtio_net_device_realize(DeviceState *dev, Error **errp)
         return;
     }
 
+    if (n->net_conf.tx_queue_size < VIRTIO_NET_TX_QUEUE_MIN_SIZE ||
+        n->net_conf.tx_queue_size > VIRTQUEUE_MAX_SIZE ||
+        !is_power_of_2(n->net_conf.tx_queue_size)) {
+        error_setg(errp, "Invalid tx_queue_size (= %" PRIu16 "), "
+                   "must be a power of 2 between %d and %d",
+                   n->net_conf.tx_queue_size, VIRTIO_NET_TX_QUEUE_MIN_SIZE,
+                   VIRTQUEUE_MAX_SIZE);
+        virtio_cleanup(vdev);
+        return;
+    }
+
     n->max_queues = MAX(n->nic_conf.peers.queues, 1);
     if (n->max_queues * 2 + 1 > VIRTIO_QUEUE_MAX) {
         error_setg(errp, "Invalid number of queues (= %" PRIu32 "), "
@@ -1947,6 +1964,15 @@ 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;
+    }
+
     for (i = 0; i < n->max_queues; i++) {
         virtio_net_add_queue(n, i);
     }
@@ -2106,6 +2132,8 @@ static Property virtio_net_properties[] = {
     DEFINE_PROP_STRING("tx", VirtIONet, net_conf.tx),
     DEFINE_PROP_UINT16("rx_queue_size", VirtIONet, net_conf.rx_queue_size,
                        VIRTIO_NET_RX_QUEUE_DEFAULT_SIZE),
+    DEFINE_PROP_UINT16("tx_queue_size", VirtIONet, net_conf.tx_queue_size,
+                       VIRTIO_NET_TX_QUEUE_DEFAULT_SIZE),
     DEFINE_PROP_UINT16("host_mtu", VirtIONet, net_conf.mtu, 0),
     DEFINE_PROP_BOOL("x-mtu-bypass-backend", VirtIONet, mtu_bypass_backend,
                      true),
-- 
MST

  reply	other threads:[~2017-07-03 19:44 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-07-03 19:44 [Qemu-devel] [PULL 00/21] pc, acpi, pci, virtio: fixes, cleanups, features, tests Michael S. Tsirkin
2017-07-03 19:44 ` Michael S. Tsirkin [this message]
2017-07-04  1:44   ` [Qemu-devel] [PULL 01/21] virtio-net: enable configurable tx queue size Wei Wang
2017-07-13  8:01     ` Michal Privoznik
2017-07-03 19:44 ` [Qemu-devel] [PULL 02/21] hw/pci-bridge/dec: Classify the DEC PCI bridge as bridge device Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 03/21] intel_iommu: relax iq tail check on VTD_GCMD_QIE enable Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 04/21] pci: Clean up error checking in pci_add_capability() Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 05/21] pci: Add comment for pci_add_capability2() Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 06/21] pci: Fix the wrong assertion Michael S. Tsirkin
2017-07-03 19:44 ` [Qemu-devel] [PULL 07/21] pci: Make errp the last parameter of pci_add_capability() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 08/21] pci: Replace pci_add_capability2() with pci_add_capability() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 09/21] pci: Convert to realize Michael S. Tsirkin
2017-08-25 15:17   ` Eduardo Habkost
2017-08-25 16:57     ` Michael S. Tsirkin
2017-08-25 17:49       ` Eduardo Habkost
2017-07-03 19:45 ` [Qemu-devel] [PULL 10/21] pci: Convert shpc_init() to Error Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 11/21] i386/kvm/pci-assign: Fix return type of verify_irqchip_kernel() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 12/21] i386/kvm/pci-assign: Use errp directly rather than local_err Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 13/21] fw_cfg: don't map the fw_cfg IO ports in fw_cfg_io_realize() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 14/21] fw_cfg: move setting of FW_CFG_VERSION_DMA bit to fw_cfg_init1() Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 15/21] hw/acpi: remove dead acpi code Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 16/21] intel_iommu: fix migration breakage on mr switch Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 17/21] vhost: ensure vhost_ops are set before calling iotlb callback Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 18/21] vhost-user: unregister slave req handler at cleanup time Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 19/21] tests: Add unit tests for the VM Generation ID feature Michael S. Tsirkin
2017-07-11 13:32   ` Peter Maydell
2017-07-11 15:07     ` Ben Warren
2017-07-11 15:22       ` Peter Maydell
2017-07-11 16:49         ` Peter Maydell
2017-07-11 19:10           ` Michael S. Tsirkin
2017-07-11 20:42             ` Peter Maydell
2017-07-11 22:13               ` Laszlo Ersek
2017-07-11 23:43                 ` Ben Warren
2017-07-12  0:42                   ` Michael S. Tsirkin
2017-07-13 10:47                   ` Peter Maydell
2017-07-13 11:31                     ` Laszlo Ersek
2017-07-13 11:51                       ` Marc-André Lureau
2017-07-13 13:34                         ` Ben Warren
2017-07-13 16:38                           ` Michael S. Tsirkin
2017-07-14 13:11                             ` Peter Maydell
2017-07-14 15:14                               ` Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 20/21] virtio-net: fix tx queue size for !vhost-user Michael S. Tsirkin
2017-07-03 19:45 ` [Qemu-devel] [PULL 21/21] i386/acpi: update expected acpi files Michael S. Tsirkin
2017-07-04 12:05 ` [Qemu-devel] [PULL 00/21] pc, acpi, pci, virtio: fixes, cleanups, features, tests Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1499111049-13721-2-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=wei.w.wang@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.