[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCHv5 09/11] tap: add vhost/vhostfd options
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PATCHv5 09/11] tap: add vhost/vhostfd options |
Date: |
Tue, 16 Mar 2010 19:11:20 +0200 |
User-agent: |
Mutt/1.5.19 (2009-01-05) |
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>
---
net.c | 8 ++++++++
net/tap.c | 29 +++++++++++++++++++++++++++++
qemu-options.hx | 4 +++-
3 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/net.c b/net.c
index e47f727..48d9fb0 100644
--- a/net.c
+++ b/net.c
@@ -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 */ }
diff --git a/net/tap.c b/net/tap.c
index fc59fd4..19c4fa2 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;
+ VHostNetState *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,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) {
+ 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;
+ }
+
return 0;
}
diff --git a/qemu-options.hx b/qemu-options.hx
index fd50add..4d9f4da 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -895,7 +895,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"
@@ -905,6 +905,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"
--
1.7.0.18.g0d53a5
- [Qemu-devel] [PATCHv5 00/11] vhost-net: upstream integration, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 01/11] tap: add interface to get device fd, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 03/11] notifier: event notifier implementation, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 04/11] virtio: notifier support + APIs for queue fields, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 05/11] virtio: add set_status callback, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 06/11] virtio: move typedef to qemu-common, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 07/11] virtio-pci: fill in notifier support, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 09/11] tap: add vhost/vhostfd options,
Michael S. Tsirkin <=
- [Qemu-devel] [PATCHv5 10/11] tap: add API to retrieve vhost net header, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 11/11] virtio-net: vhost net support, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 08/11] vhost: vhost net support, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] [PATCHv5 02/11] kvm: add API to set ioeventfd, Michael S. Tsirkin, 2010/03/16
- [Qemu-devel] Re: [PATCHv5 00/11] vhost-net: upstream integration, Juan Quintela, 2010/03/16
- [Qemu-devel] Re: [PATCHv5 00/11] vhost-net: upstream integration, Amit Shah, 2010/03/17