From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NkjgN-0001ib-48 for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:47:35 -0500 Received: from [199.232.76.173] (port=42235 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NkjgM-0001iN-GE for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:47:34 -0500 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1NkjgJ-0002pw-MW for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:47:34 -0500 Received: from mail-qy0-f201.google.com ([209.85.221.201]:36037) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NkjgJ-0002pd-6Q for qemu-devel@nongnu.org; Thu, 25 Feb 2010 14:47:31 -0500 Received: by qyk39 with SMTP id 39so1236840qyk.22 for ; Thu, 25 Feb 2010 11:47:30 -0800 (PST) Message-ID: <4B86D3CF.4020601@codemonkey.ws> Date: Thu, 25 Feb 2010 13:47:27 -0600 From: Anthony Liguori MIME-Version: 1.0 References: <886ef6ffeb6748f6dc4fe5431f71cb12bb74edc9.1267122331.git.mst@redhat.com> In-Reply-To: <886ef6ffeb6748f6dc4fe5431f71cb12bb74edc9.1267122331.git.mst@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCHv2 10/12] tap: add vhost/vhostfd options List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael S. Tsirkin" Cc: amit.shah@redhat.com, quintela@redhat.com, qemu-devel@nongnu.org, kraxel@redhat.com 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 > 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" >