qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [PATCHv2 10/12] tap: add vhost/vhostfd options


From: Anthony Liguori
Subject: [Qemu-devel] Re: [PATCHv2 10/12] tap: add vhost/vhostfd options
Date: Thu, 25 Feb 2010 13:47:27 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091209 Fedora/3.0-4.fc12 Lightning/1.0pre Thunderbird/3.0

On 02/25/2010 12:28 PM, Michael S. Tsirkin wrote:
This adds vhost binary option to tap, to enable vhost net accelerator.
Default is off for now, we'll be able to make default on long term
when we know it's stable.

vhostfd option can be used by management, to pass in the fd. Assigning
vhostfd implies vhost=on.

Signed-off-by: Michael S. Tsirkin<address@hidden>

Since the thinking these days is that macvtap and tap is pretty much all we'll ever need for vhost-net, perhaps we should revisit -net vhost vs. -net tap,vhost=X?

I think -net vhost,fd=X makes a lot more sense than -net tap,vhost=on,vhostfd=X.

Regards,

Anthony Liguori

---
  net.c           |    8 ++++++++
  net/tap.c       |   33 +++++++++++++++++++++++++++++++++
  qemu-options.hx |    4 +++-
  3 files changed, 44 insertions(+), 1 deletions(-)

diff --git a/net.c b/net.c
index a1bf49f..d1e23f1 100644
--- a/net.c
+++ b/net.c
@@ -973,6 +973,14 @@ static const struct {
                  .name = "vnet_hdr",
                  .type = QEMU_OPT_BOOL,
                  .help = "enable the IFF_VNET_HDR flag on the tap interface"
+            }, {
+                .name = "vhost",
+                .type = QEMU_OPT_BOOL,
+                .help = "enable vhost-net network accelerator",
+            }, {
+                .name = "vhostfd",
+                .type = QEMU_OPT_STRING,
+                .help = "file descriptor of an already opened vhost net 
device",
              },
  #endif /* _WIN32 */
              { /* end of list */ }
diff --git a/net/tap.c b/net/tap.c
index fc59fd4..65797ef 100644
--- a/net/tap.c
+++ b/net/tap.c
@@ -41,6 +41,8 @@

  #include "net/tap-linux.h"

+#include "hw/vhost_net.h"
+
  /* Maximum GSO packet size (64k) plus plenty of room for
   * the ethernet and virtio_net headers
   */
@@ -57,6 +59,7 @@ typedef struct TAPState {
      unsigned int has_vnet_hdr : 1;
      unsigned int using_vnet_hdr : 1;
      unsigned int has_ufo: 1;
+    struct vhost_net *vhost_net;
  } TAPState;

  static int launch_script(const char *setup_script, const char *ifname, int 
fd);
@@ -252,6 +255,10 @@ static void tap_cleanup(VLANClientState *nc)
  {
      TAPState *s = DO_UPCAST(TAPState, nc, nc);

+    if (s->vhost_net) {
+        vhost_net_cleanup(s->vhost_net);
+    }
+
      qemu_purge_queued_packets(nc);

      if (s->down_script[0])
@@ -307,6 +314,7 @@ static TAPState *net_tap_fd_init(VLANState *vlan,
      s->has_ufo = tap_probe_has_ufo(s->fd);
      tap_set_offload(&s->nc, 0, 0, 0, 0, 0);
      tap_read_poll(s, 1);
+    s->vhost_net = NULL;
      return s;
  }

@@ -456,5 +464,30 @@ int net_init_tap(QemuOpts *opts, Monitor *mon, const char 
*name, VLANState *vlan
          }
      }

+    if (qemu_opt_get_bool(opts, "vhost", !!qemu_opt_get(opts, "vhostfd"))) {
+        int vhostfd, r;
+        if (qemu_opt_get(opts, "vhostfd")) {
+            r = net_handle_fd_param(mon, qemu_opt_get(opts, "vhostfd"));
+            if (r == -1) {
+                return -1;
+            }
+            vhostfd = r;
+        } else {
+            vhostfd = -1;
+        }
+        s->vhost_net = vhost_net_init(&s->nc, vhostfd);
+        if (!s->vhost_net) {
+            qemu_error("vhost-net requested but could not be initialized\n");
+            return -1;
+        }
+    } else if (qemu_opt_get(opts, "vhostfd")) {
+        qemu_error("vhostfd= is not valid without vhost\n");
+        return -1;
+    }
+
+    if (vlan) {
+        vlan->nb_host_devs++;
+    }
+
      return 0;
  }
diff --git a/qemu-options.hx b/qemu-options.hx
index f53922f..1850906 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -879,7 +879,7 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
      "-net tap[,vlan=n][,name=str],ifname=name\n"
      "                connect the host TAP network interface to VLAN 'n'\n"
  #else
-    "-net 
tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off]\n"
+    "-net 
tap[,vlan=n][,name=str][,fd=h][,ifname=name][,script=file][,downscript=dfile][,sndbuf=nbytes][,vnet_hdr=on|off][,vhost=on|off][,vhostfd=h]\n"
      "                connect the host TAP network interface to VLAN 'n' and use 
the\n"
      "                network scripts 'file' (default=" DEFAULT_NETWORK_SCRIPT 
")\n"
      "                and 'dfile' (default=" DEFAULT_NETWORK_DOWN_SCRIPT ")\n"
@@ -889,6 +889,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
      "                default of 'sndbuf=1048576' can be disabled using 
'sndbuf=0')\n"
      "                use vnet_hdr=off to avoid enabling the IFF_VNET_HDR tap 
flag\n"
      "                use vnet_hdr=on to make the lack of IFF_VNET_HDR support an 
error condition\n"
+    "                use vhost=on to enable experimental in kernel 
accelerator\n"
+    "                use 'vhostfd=h' to connect to an already opened vhost net 
device\n"
  #endif
      "-net 
socket[,vlan=n][,name=str][,fd=h][,listen=[host]:port][,connect=host:port]\n"
      "                connect the vlan 'n' to another VLAN using a socket 
connection\n"





reply via email to

[Prev in Thread] Current Thread [Next in Thread]