[libvirt] [PATCH] spec: Fix undefined with_libnl
by Jiri Denemark
When building libvirt RPM without macvtap, with_libnl would be
undefined.
---
libvirt.spec.in | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/libvirt.spec.in b/libvirt.spec.in
index cc3e8e2..e530b1a 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -64,6 +64,7 @@
%define with_nwfilter 0%{!?_without_nwfilter:0}
%define with_libpcap 0%{!?_without_libpcap:0}
%define with_macvtap 0%{!?_without_macvtap:0}
+%define with_libnl 0%{!?_without_libnl:0}
# Non-server/HV driver defaults which are always enabled
%define with_python 0%{!?_without_python:1}
--
1.7.2.2
14 years, 3 months
Re: [libvirt] KVM doesn't send an arp announce after live migrating a domain
by Avi Kivity
On 08/25/2010 12:21 PM, Nils Cant wrote:
> On 08/25/2010 10:38 AM, Gleb Natapov wrote:
>> qemu sends gratuitous ARP after migration. Check forward delay
>> setting on your
>> bridge interface. It should be set to zero.
>>
>
> Aha! That fixed it. Turns out that debian bridge-utils sets the
> default to 15 for bridges.
> Manually setting it to 0 with 'brctl setfd br0 0' or setting the
> 'bridge_fd' parameter to 0 in /etc/network/interfaces solves the issue.
>
I think libvirt is doing something about this, copying list for further
info.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
14 years, 3 months
[libvirt] Add new API for accessing remote guest text console
by Daniel P. Berrange
The 'virsh console' command has been an oddity that only works
when run locally, as the same UID as the QEMU instance. This
is because it directly opens /dev/pty/XXX. This introduces a
formal API for accessing consoles that uses the virStreamPtr
APIs. Now any app can open consoles anywhere it can connect
to libvirt
14 years, 3 months
[libvirt] [PATCH 1/2] Rename qemudShrinkDisks to virDomainDiskRemove and move to domain_conf.c
by soren@linux2go.dk
From: Soren Hansen <soren(a)linux2go.dk>
Other drivers will need this same functionality, so move it to up to
conf/domain_conf.c and give it a more general name.
Signed-off-by: Soren Hansen <soren(a)linux2go.dk>
---
src/conf/domain_conf.c | 18 ++++++++++++++++++
src/conf/domain_conf.h | 2 ++
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 20 ++------------------
4 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ee99cd1..e05d5d7 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -4064,6 +4064,24 @@ void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
}
+void virDomainDiskRemove(virDomainDefPtr def, size_t i)
+{
+ if (def->ndisks > 1) {
+ memmove(def->disks + i,
+ def->disks + i + 1,
+ sizeof(*def->disks) *
+ (def->ndisks - (i + 1)));
+ def->ndisks--;
+ if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
+ /* ignore, harmless */
+ }
+ } else {
+ VIR_FREE(def->disks);
+ def->ndisks = 0;
+ }
+}
+
+
int virDomainControllerInsert(virDomainDefPtr def,
virDomainControllerDefPtr controller)
{
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 92f98bc..7195c04 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1067,6 +1067,8 @@ void virDomainDiskInsertPreAlloced(virDomainDefPtr def,
virDomainDiskDefPtr disk);
int virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def);
+void virDomainDiskRemove(virDomainDefPtr def, size_t i);
+
int virDomainControllerInsert(virDomainDefPtr def,
virDomainControllerDefPtr controller);
void virDomainControllerInsertPreAlloced(virDomainDefPtr def,
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index d5a7a73..c2905ba 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -144,6 +144,7 @@ virDomainDiskDefFree;
virDomainDiskDeviceTypeToString;
virDomainDiskInsert;
virDomainDiskInsertPreAlloced;
+virDomainDiskRemove;
virDomainDiskDefAssignAddress;
virDomainControllerInsert;
virDomainControllerInsertPreAlloced;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 656a1e4..25695df 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8583,22 +8583,6 @@ static inline int qemudFindDisk(virDomainDefPtr def, const char *dst)
return -1;
}
-static inline void qemudShrinkDisks(virDomainDefPtr def, size_t i)
-{
- if (def->ndisks > 1) {
- memmove(def->disks + i,
- def->disks + i + 1,
- sizeof(*def->disks) *
- (def->ndisks - (i + 1)));
- def->ndisks--;
- if (VIR_REALLOC_N(def->disks, def->ndisks) < 0) {
- /* ignore, harmless */
- }
- } else {
- VIR_FREE(def->disks);
- def->ndisks = 0;
- }
-}
static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
virDomainObjPtr vm,
@@ -8655,7 +8639,7 @@ static int qemudDomainDetachPciDiskDevice(struct qemud_driver *driver,
qemuDomainPCIAddressReleaseAddr(priv->pciaddrs, &detach->info) < 0)
VIR_WARN("Unable to release PCI address on %s", dev->data.disk->src);
- qemudShrinkDisks(vm->def, i);
+ virDomainDiskRemove(vm->def, i);
virDomainDiskDefFree(detach);
@@ -8719,7 +8703,7 @@ static int qemudDomainDetachSCSIDiskDevice(struct qemud_driver *driver,
}
qemuDomainObjExitMonitorWithDriver(driver, vm);
- qemudShrinkDisks(vm->def, i);
+ virDomainDiskRemove(vm->def, i);
virDomainDiskDefFree(detach);
--
1.7.0.4
14 years, 3 months
[libvirt] [PATCH] Fix dependancies for remote generated files
by Daniel P. Berrange
Very occasionally during a parallel make, dispatch.c would
be compiled before the generated remote headers had been
fully written. This would cause it to compile an empty
union, and result in really wierd runtime bugs that are
near impossible to diagnose.
* daemon/Makefile.am: Fix remote build deps
---
daemon/Makefile.am | 19 +++++++++++--------
1 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index dbf0ac3..035c149 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -189,14 +189,17 @@ uninstall-data-polkit::
endif
-remote.c: remote_dispatch_prototypes.h \
- remote_dispatch_table.h \
- remote_dispatch_args.h \
- remote_dispatch_ret.h \
- qemu_dispatch_prototypes.h \
- qemu_dispatch_table.h \
- qemu_dispatch_args.h \
- qemu_dispatch_ret.h
+remote.c: \
+ remote_dispatch_prototypes.h \
+ remote_dispatch_table.h \
+ qemu_dispatch_prototypes.h \
+ qemu_dispatch_table.h
+
+remote.h: \
+ remote_dispatch_args.h \
+ remote_dispatch_ret.h \
+ qemu_dispatch_args.h \
+ qemu_dispatch_ret.h
REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x
--
1.7.2.1
14 years, 3 months
[libvirt] [BUG] Xen x86_64 needs PAE?
by Philipp Hahn
Hello,
I tried to install "Microsoft Windows 2008 Server R2" on an Amd64 host using
Xen-3.4.3. The installation aborted with the following error message:
> Windows Boot Mager
...
> File: \windows\system32\boot\winload.exe
> Status: 0xc000035a
> Info: Attempting to load a 64-bit application, however this CPU is not
compatible with 64-bit mode.
For testing I converted the libvirt-XML file to an Xen-Xm file using "virsh
domxml-to-native" and started that file with "xm create", which worked.
Comparing the output of "xm list -a" of the broken libvirt- and the working
xm-configuration I found several differences, especially with "pae":
Using "xm create" pae is set to 1, while with libvirt pae is set to 0. After
adding the /domain/featues/pae node to libvirts XML domain file, Windows
installed fine.
Looking at "virsh capabilities" I get the following (abbreviated) output:
> <capabilities>
> <guest>
> <os_type>hvm</os_type>
> <arch name='i686'>
> <wordsize>32</wordsize>
...
> </arch>
> <features>
> <pae/>
> <nonpae/>
> <acpi default='on' toggle='yes'/>
> <apic default='on' toggle='yes'/>
> </features>
> </guest>
> <guest>
> <os_type>hvm</os_type>
> <arch name='x86_64'>
> <wordsize>64</wordsize>
...
> </arch>
> <features>
> <acpi default='on' toggle='yes'/>
> <apic default='on' toggle='yes'/>
> </features>
> </guest>
> </capabilities>
As you can see, neither "<pae/>" nor "<nopae/>" is listed for for the 64 bit
Xen-Fv domain type, which makes it hard to automatically create a correct
_and_ _working_ XML file for Xen-Fv-64 bit domains
Looking at "/sys/hypervisor/properties/capabilities" I find the following
capabilities reported by Xen
> xen-3.0-x86_64
> xen-3.0-x86_32p
> hvm-3.0-x86_32
> hvm-3.0-x86_32p
> hvm-3.0-x86_64
There's also no "hvm-3.0-x86_64p" which makes me wonder, if "<pae/>" is the
default for Xen-64 bit domains.
If that is true, should libvirt add "<pae/"> by default to the capabilities
report, or should libvirt silently pass "(pae 1)" when pushing the XML domain
description to Xend? Lookign at
<file:xen-3.4.3/tools/python/xen/xm/create.py>:210 I see that "pae" is
enabled by default there, and thus gets enabled for each domain using "xm
create":
> gopts.var('pae', val='PAE',
> fn=set_int, default=1,
> use="Disable or enable PAE of HVM domain.")
Any feedback is appreciated.
BYtE
Philipp
--
Philipp Hahn Open Source Software Engineer hahn(a)univention.de
Univention GmbH Linux for Your Business fon: +49 421 22 232- 0
Mary-Somerville-Str.1 28359 Bremen fax: +49 421 22 232-99
http://www.univention.de
14 years, 3 months
[libvirt] [PATCH] Ensure remote daemon unions are always non-zero length
by Daniel P. Berrange
If the remote daemon args/ret unions ever become zero length
(due to a build / Makefile bug) then bad stuff happens at
runtime. Add a compile time assertion to check for this kind
of problem
* daemon/remote.h: Ensure non-zero length unions
---
daemon/remote.h | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/daemon/remote.h b/daemon/remote.h
index fd8d381..1eb8386 100644
--- a/daemon/remote.h
+++ b/daemon/remote.h
@@ -30,18 +30,22 @@
typedef union {
# include "remote_dispatch_args.h"
} dispatch_args;
+verify(sizeof(dispatch_args) > 0);
typedef union {
# include "remote_dispatch_ret.h"
} dispatch_ret;
+verify(sizeof(dispatch_ret) > 0);
typedef union {
# include "qemu_dispatch_args.h"
} qemu_dispatch_args;
+verify(sizeof(qemu_dispatch_args) > 0);
typedef union {
# include "qemu_dispatch_ret.h"
} qemu_dispatch_ret;
+verify(sizeof(qemu_dispatch_ret) > 0);
--
1.7.2.1
14 years, 3 months
[libvirt] [PATCH] Fix off-by-1 in QEMU boot arg array handling
by Daniel P. Berrange
A QEMU guest can have upto VIR_DOMAIN_BOOT_LAST boot entries
defined. When building the QEMU arg, each entry takes a
single byte. This means the array must be declared to be
VIR_DOMAIN_BOOT_LAST+1 bytes in length to allow for the
trailing null
* src/qemu/qemu_conf.c: Fix off-by-1 boot arg array size
---
src/qemu/qemu_conf.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index aa34d63..7a37c70 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -3662,7 +3662,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
{
int i;
char memory[50];
- char boot[VIR_DOMAIN_BOOT_LAST];
+ char boot[VIR_DOMAIN_BOOT_LAST+1];
struct utsname ut;
int disableKQEMU = 0;
int enableKQEMU = 0;
--
1.7.2.1
14 years, 3 months
[libvirt] [PATCH] Allow chardev of type 'file' for UML domains.
by soren@linux2go.dk
From: Soren Hansen <soren(a)linux2go.dk>
Like that comment suggested, we just open the file and pass the file
descriptor to uml. The input "stream" is set to "null", since I couldn't
find any useful way to actually use a file for input for a chardev and
this also mimics what e.g. QEmu does internally.
Signed-off-by: Soren Hansen <soren(a)linux2go.dk>
---
src/uml/uml_conf.c | 30 +++++++++++++++++++++++++-----
src/uml/uml_conf.h | 1 +
src/uml/uml_driver.c | 6 +-----
3 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
index bc8cbce..659f881 100644
--- a/src/uml/uml_conf.c
+++ b/src/uml/uml_conf.c
@@ -297,7 +297,8 @@ error:
static char *
umlBuildCommandLineChr(virDomainChrDefPtr def,
- const char *dev)
+ const char *dev,
+ fd_set *keepfd)
{
char *ret = NULL;
@@ -346,8 +347,26 @@ umlBuildCommandLineChr(virDomainChrDefPtr def,
break;
case VIR_DOMAIN_CHR_TYPE_FILE:
- case VIR_DOMAIN_CHR_TYPE_PIPE:
- /* XXX could open the file/pipe & just pass the FDs */
+ {
+ int fd_out;
+
+ if ((fd_out = open(def->data.file.path,
+ O_WRONLY | O_APPEND | O_CREAT, 0660)) < 0) {
+ virReportSystemError(errno,
+ _("failed to open chardev file: %s"),
+ def->data.file.path);
+ return NULL;
+ }
+ if (virAsprintf(&ret, "%s%d=null,fd:%d", dev, def->target.port, fd_out) < 0) {
+ virReportOOMError();
+ close(fd_out);
+ return NULL;
+ }
+ FD_SET(fd_out, keepfd);
+ }
+ break;
+ case VIR_DOMAIN_CHR_TYPE_PIPE:
+ /* XXX could open the pipe & just pass the FDs */
case VIR_DOMAIN_CHR_TYPE_VC:
case VIR_DOMAIN_CHR_TYPE_UDP:
@@ -393,6 +412,7 @@ static char *umlNextArg(char *args)
int umlBuildCommandLine(virConnectPtr conn,
struct uml_driver *driver ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
+ fd_set *keepfd,
const char ***retargv,
const char ***retenv)
{
@@ -515,7 +535,7 @@ int umlBuildCommandLine(virConnectPtr conn,
for (i = 0 ; i < UML_MAX_CHAR_DEVICE ; i++) {
char *ret;
if (i == 0 && vm->def->console)
- ret = umlBuildCommandLineChr(vm->def->console, "con");
+ ret = umlBuildCommandLineChr(vm->def->console, "con", keepfd);
else
if (virAsprintf(&ret, "con%d=none", i) < 0)
goto no_memory;
@@ -529,7 +549,7 @@ int umlBuildCommandLine(virConnectPtr conn,
if (vm->def->serials[j]->target.port == i)
chr = vm->def->serials[j];
if (chr)
- ret = umlBuildCommandLineChr(chr, "ssl");
+ ret = umlBuildCommandLineChr(chr, "ssl", keepfd);
else
if (virAsprintf(&ret, "ssl%d=none", i) < 0)
goto no_memory;
diff --git a/src/uml/uml_conf.h b/src/uml/uml_conf.h
index b33acc8..d8b2349 100644
--- a/src/uml/uml_conf.h
+++ b/src/uml/uml_conf.h
@@ -71,6 +71,7 @@ virCapsPtr umlCapsInit (void);
int umlBuildCommandLine (virConnectPtr conn,
struct uml_driver *driver,
virDomainObjPtr dom,
+ fd_set *keepfd,
const char ***retargv,
const char ***retenv);
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 04493ba..5f73ce2 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -737,10 +737,6 @@ static int umlMonitorCommand(const struct uml_driver *driver,
virReportSystemError(errno, _("cannot read reply %s"), cmd);
goto error;
}
- if (nbytes < sizeof res) {
- virReportSystemError(0, _("incomplete reply %s"), cmd);
- goto error;
- }
if (sizeof res.data < res.length) {
virReportSystemError(0, _("invalid length in reply %s"), cmd);
goto error;
@@ -871,7 +867,7 @@ static int umlStartVMDaemon(virConnectPtr conn,
return -1;
}
- if (umlBuildCommandLine(conn, driver, vm,
+ if (umlBuildCommandLine(conn, driver, vm, &keepfd,
&argv, &progenv) < 0) {
close(logfd);
umlCleanupTapDevices(conn, vm);
--
1.7.0.4
14 years, 3 months