160 lines
5.0 KiB
Diff
160 lines
5.0 KiB
Diff
From 3cf2f90a4747547f9877b15c1f573f8a771098e8 Mon Sep 17 00:00:00 2001
|
|
From: Daniel P. Berrange <berrange@redhat.com>
|
|
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
|
|
|