On Wed, May 28, 2014 at 10:46:27AM +0200, Luke Gorrie wrote:
vhost-user is a networking backend based on unix domain sockets
instead of tap devices and ioctl(). This makes it possible for
userspace networking stacks (vswitches) to provide vhost-networking to
guests.
Signed-off-by: Luke Gorrie <luke(a)snabb.co>
---
docs/schemas/domaincommon.rng | 23 ++++++++
Also need to update docs/formatdomain.html.in to describe the
new XML syntax
src/conf/domain_conf.c | 42
++++++++++++++
src/conf/domain_conf.h | 5 ++
src/lxc/lxc_process.c | 1 +
src/qemu/qemu_command.c | 66 +++++++++++++++++++++-
src/uml/uml_conf.c | 5 ++
src/xenxs/xen_sxpr.c | 1 +
tests/qemuxml2argvdata/qemuxml2argv-hugepages.args | 2 +-
8 files changed, 142 insertions(+), 3 deletions(-)
You need to introduce a new data file in tests/qemuxml2argvdata/
and add it to tests/qemuxml2argvtest.c and tests/qemuxml2xmltest.c
to validate correct XML parsing, formatting and QEMU CLI arg
generation for the new NIC type.
@@ -6804,6 +6817,25 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr
xmlopt,
}
break;
+ case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
+ if (vhostuser_socket == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("No <socket> 'path' attribute "
_( should be aligned with the 'VIR_' on the line above - it indented
2 more spaces.
+ "specified with <interface
type='vhostuser'/>"));
+ goto error;
Indentation is wonky for the goto.
+ }
+ if (vhostuser_mode == NULL) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("No <socket> 'mode' attribute "
And here too
+ "specified with <interface
type='vhostuser'/>"));
+ goto error;
And here too
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1d5bce6..755bf9d 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7007,6 +7007,62 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg,
}
static int
+qemuBuildVhostuserCommandLine(virCommandPtr cmd,
+ virDomainDefPtr def,
+ virDomainNetDefPtr net,
+ virQEMUCapsPtr qemuCaps)
+{
+ virBuffer buf1 = VIR_BUFFER_INITIALIZER;
+ virBuffer buf2 = VIR_BUFFER_INITIALIZER;
+
+ char* nic = NULL;
+
+ if (!qemuDomainSupportsNetdev(def, qemuCaps, net)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Netdev support unavailable"));
+ goto error;
+ }
+
+ if (!qemuDomainSupportsNicdev(def, qemuCaps, net)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Nicdev support unavailable"));
+ goto error;
+ }
+
+ virBufferAsprintf(&buf1, "socket,id=char%s,path=%s%s",
+ net->info.alias, net->data.vhostuser.socket,
+ STRCASEEQ(net->data.vhostuser.mode, "server") ? ",server"
: "");
Again these trailing lines should be aligned with the '&buf1' - eg as
is done in the line below:
+ virBufferAsprintf(&buf2,
"type=vhost-user,id=host%s,chardev=char%s",
+ net->info.alias, net->info.alias);
+
+ if (virBufferError(&buf1) || virBufferError(&buf2)) {
+ virReportOOMError();
+ goto error;
+ }
+
+ virCommandAddArgList(cmd, "-chardev",
virBufferContentAndReset(&buf1),
+ NULL);
+ virCommandAddArgList(cmd, "-netdev", virBufferContentAndReset(&buf2),
+ NULL);
+
+ if (!(nic = qemuBuildNicDevStr(def, net, -1, 0, 0, qemuCaps))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Error generating NIC -device
string"));
+ goto error;
+ }
+
+ virCommandAddArgList(cmd, "-device", nic, NULL);
+
+ return 0;
+
+error:
+ virBufferFreeAndReset(&buf1);
+ virBufferFreeAndReset(&buf2);
+
+ return -1;
+}
+
+static int
qemuBuildInterfaceCommandLine(virCommandPtr cmd,
virQEMUDriverPtr driver,
virConnectPtr conn,
@@ -7029,6 +7085,10 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
int actualType = virDomainNetGetActualType(net);
size_t i;
+ if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER) {
+ return qemuBuildVhostuserCommandLine(cmd, def, net, qemuCaps);
+ }
No need for '{...}' on single line if()s
+
if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
/* NET_TYPE_HOSTDEV devices are really hostdev devices, so
* their commandlines are constructed with other hostdevs.
@@ -7374,8 +7434,10 @@ qemuBuildCommandLine(virConnectPtr conn,
def->emulator);
goto error;
}
- virCommandAddArgList(cmd, "-mem-prealloc", "-mem-path",
- cfg->hugepagePath, NULL);
+ virCommandAddArg(cmd, "-mem-path");
+ virCommandAddArgFormat(cmd, "%s,prealloc=on,share=%s",
+ cfg->hugepagePath,
+ def->mem.nosharepages ? "off" :
"on");
This is totally bogus and should be removed from the patch.
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hugepages.args
b/tests/qemuxml2argvdata/qemuxml2argv-hugepages.args
index d42d9fc..5f8df71 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hugepages.args
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hugepages.args
@@ -1,5 +1,5 @@
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \
/usr/bin/qemu -S -M \
-pc -m 214 -mem-prealloc -mem-path /dev/hugepages/libvirt/qemu -smp 1 \
+pc -m 214 -mem-path /dev/hugepages/libvirt/qemu,prealloc=on,share=on -smp 1 \
-nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb -hda \
/dev/HostVG/QEMUGuest1 -net none -serial none -parallel none
This change is also bogus.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|