Skip to content

Commit

Permalink
tap: add vhost/vhostfd options
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Anthony Liguori <[email protected]>
  • Loading branch information
mstsirkin authored and Anthony Liguori committed Apr 1, 2010
1 parent d597005 commit 82b0d80
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
8 changes: 8 additions & 0 deletions net.c
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,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 */ }
Expand Down
29 changes: 29 additions & 0 deletions net/tap.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,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
*/
Expand All @@ -58,6 +60,7 @@ typedef struct TAPState {
unsigned int has_vnet_hdr : 1;
unsigned int using_vnet_hdr : 1;
unsigned int has_ufo: 1;
VHostNetState *vhost_net;
} TAPState;

static int launch_script(const char *setup_script, const char *ifname, int fd);
Expand Down Expand Up @@ -253,6 +256,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])
Expand Down Expand Up @@ -308,6 +315,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;
}

Expand Down Expand Up @@ -457,5 +465,26 @@ 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) {
error_report("vhost-net requested but could not be initialized");
return -1;
}
} else if (qemu_opt_get(opts, "vhostfd")) {
error_report("vhostfd= is not valid without vhost");
return -1;
}

return 0;
}
4 changes: 3 additions & 1 deletion qemu-options.hx
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,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"
Expand All @@ -902,6 +902,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"
Expand Down

0 comments on commit 82b0d80

Please sign in to comment.