On Thu, Feb 25, 2010 at 01:47:27PM -0600, Anthony Liguori wrote: > 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<m...@redhat.com> >> > > 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
We'll have to duplicate all tap options. I think long term we will just make vhost=on the default. Users do not really care about vhost, it just makes tap go fater. So promoting it to 1st class options is wrong IMO. >> --- >> 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" >>