From 3cf2f90a4747547f9877b15c1f573f8a771098e8 Mon Sep 17 00:00:00 2001 From: Daniel P. Berrange Date: Mon, 29 Jun 2009 10:41:56 +0000 Subject: [PATCH] Fix crash in QEMU driver with bad capabilities data (cherry picked from commit 39c7e7a6b79bbdfa36928a430d56fa88a204e8fd) Fedora-patch: libvirt-0.6.2-numa-ignore-fail.patch --- src/capabilities.c | 16 +++++++++++++--- src/capabilities.h | 3 +++ src/libvirt_private.syms | 1 + src/lxc_conf.c | 11 +++++++++-- src/qemu_conf.c | 10 ++++++++-- src/uml_conf.c | 11 +++++++++-- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/capabilities.c b/src/capabilities.c index d6e3478..8dc32a1 100644 --- a/src/capabilities.c +++ b/src/capabilities.c @@ -122,6 +122,18 @@ virCapabilitiesFreeGuest(virCapsGuestPtr guest) } +void +virCapabilitiesFreeNUMAInfo(virCapsPtr caps) +{ + int i; + + for (i = 0 ; i < caps->host.nnumaCell ; i++) + virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]); + VIR_FREE(caps->host.numaCell); + caps->host.nnumaCell = 0; +} + + /** * virCapabilitiesFree: * @caps: object to free @@ -141,9 +153,7 @@ virCapabilitiesFree(virCapsPtr caps) { for (i = 0 ; i < caps->host.nfeatures ; i++) VIR_FREE(caps->host.features[i]); VIR_FREE(caps->host.features); - for (i = 0 ; i < caps->host.nnumaCell ; i++) - virCapabilitiesFreeHostNUMACell(caps->host.numaCell[i]); - VIR_FREE(caps->host.numaCell); + virCapabilitiesFreeNUMAInfo(caps); for (i = 0 ; i < caps->host.nmigrateTrans ; i++) VIR_FREE(caps->host.migrateTrans[i]); diff --git a/src/capabilities.h b/src/capabilities.h index 5b0bbab..1b49666 100644 --- a/src/capabilities.h +++ b/src/capabilities.h @@ -118,6 +118,9 @@ extern void virCapabilitiesFree(virCapsPtr caps); extern void +virCapabilitiesFreeNUMAInfo(virCapsPtr caps); + +extern void virCapabilitiesSetMacPrefix(virCapsPtr caps, unsigned char *prefix); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 350a931..9249a1a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -24,6 +24,7 @@ virCapabilitiesDefaultGuestEmulator; virCapabilitiesDefaultGuestMachine; virCapabilitiesFormatXML; virCapabilitiesFree; +virCapabilitiesFreeNUMAInfo; virCapabilitiesNew; virCapabilitiesSetMacPrefix; virCapabilitiesGenerateMac; diff --git a/src/lxc_conf.c b/src/lxc_conf.c index 34c8aea..fe721e3 100644 --- a/src/lxc_conf.c +++ b/src/lxc_conf.c @@ -30,6 +30,7 @@ #include "lxc_conf.h" #include "nodeinfo.h" #include "virterror_internal.h" +#include "logging.h" #define VIR_FROM_THIS VIR_FROM_LXC @@ -46,8 +47,14 @@ virCapsPtr lxcCapsInit(void) 0, 0)) == NULL) goto no_memory; - if (virCapsInitNUMA(caps) < 0) - goto no_memory; + /* Some machines have problematic NUMA toplogy causing + * unexpected failures. We don't want to break the QEMU + * driver in this scenario, so log errors & carry on + */ + if (virCapsInitNUMA(caps) < 0) { + virCapabilitiesFreeNUMAInfo(caps); + VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities"); + } /* XXX shouldn't 'borrow' KVM's prefix */ virCapabilitiesSetMacPrefix(caps, (unsigned char []){ 0x52, 0x54, 0x00 }); diff --git a/src/qemu_conf.c b/src/qemu_conf.c index 99f13c6..1194e36 100644 --- a/src/qemu_conf.c +++ b/src/qemu_conf.c @@ -376,8 +376,14 @@ virCapsPtr qemudCapsInit(void) { /* Using KVM's mac prefix for QEMU too */ virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x52, 0x54, 0x00 }); - if (virCapsInitNUMA(caps) < 0) - goto no_memory; + /* Some machines have problematic NUMA toplogy causing + * unexpected failures. We don't want to break the QEMU + * driver in this scenario, so log errors & carry on + */ + if (virCapsInitNUMA(caps) < 0) { + virCapabilitiesFreeNUMAInfo(caps); + VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities"); + } /* First the pure HVM guests */ for (i = 0 ; i < ARRAY_CARDINALITY(arch_info_hvm) ; i++) diff --git a/src/uml_conf.c b/src/uml_conf.c index c0d086e..9dd4967 100644 --- a/src/uml_conf.c +++ b/src/uml_conf.c @@ -44,6 +44,7 @@ #include "memory.h" #include "nodeinfo.h" #include "verify.h" +#include "logging.h" #define VIR_FROM_THIS VIR_FROM_UML @@ -62,8 +63,14 @@ virCapsPtr umlCapsInit(void) { 0, 0)) == NULL) goto no_memory; - if (virCapsInitNUMA(caps) < 0) - goto no_memory; + /* Some machines have problematic NUMA toplogy causing + * unexpected failures. We don't want to break the QEMU + * driver in this scenario, so log errors & carry on + */ + if (virCapsInitNUMA(caps) < 0) { + virCapabilitiesFreeNUMAInfo(caps); + VIR_WARN0("Failed to query host NUMA topology, disabling NUMA capabilities"); + } if ((guest = virCapabilitiesAddGuest(caps, "uml", -- 1.6.2.5