[libvirt] PATCH: Fix QEMU/UML use of libnuma

Daniel P. Berrange berrange at redhat.com
Thu Nov 27 13:26:28 UTC 2008


The 2.x series of numactl releases changed the ABI/API for certain
libnuma.so functions we use. Fortunately it turns out that they provide
back-compatability of both ABI and API with a combo of linker script
magic, and header file inline compat functions. So, all we need todo
is #define NUMA_VERSION1_COMPATIBILITY before include numa.h in our
code.

This new code did, however, expose a bug in our use of the existing
API. We were calculating size in bytes, instead of size in longs, so
were passing a buffer that was 8 times to large. Harmless, but the
new libnuma validates that the buffer is expected size. So this patch
also fixes us to pass & allocate correct  buffer size. 

Finally, also add a missing BuildRequire on numactl-devel, and fixes
the libvirtd automake build dependancy

Daniel

Index: libvirt.spec.in
===================================================================
RCS file: /data/cvs/libvirt/libvirt.spec.in,v
retrieving revision 1.103
diff -u -p -r1.103 libvirt.spec.in
--- libvirt.spec.in	26 Nov 2008 14:46:49 -0000	1.103
+++ libvirt.spec.in	27 Nov 2008 13:20:24 -0000
@@ -124,6 +124,8 @@ BuildRequires: lvm2
 BuildRequires: iscsi-initiator-utils
 # For disk driver
 BuildRequires: parted-devel
+# For QEMU/LXC numa info
+BuildRequires: numactl-devel
 Obsoletes: libvir
 
 # Fedora build root suckage
Index: qemud/Makefile.am
===================================================================
RCS file: /data/cvs/libvirt/qemud/Makefile.am,v
retrieving revision 1.61
diff -u -p -r1.61 Makefile.am
--- qemud/Makefile.am	21 Nov 2008 12:27:11 -0000	1.61
+++ qemud/Makefile.am	27 Nov 2008 13:20:24 -0000
@@ -87,7 +87,6 @@ libvirtd_LDFLAGS = \
 	$(COVERAGE_LDFLAGS) \
 	$(POLKIT_LIBS)
 
-libvirtd_DEPENDENCIES = ../src/libvirt.la
 libvirtd_LDADD =					\
 		../gnulib/lib/libgnu.la
 
@@ -129,6 +128,9 @@ libvirtd_CFLAGS += $(AVAHI_CFLAGS)
 libvirtd_LDADD += $(AVAHI_LIBS)
 endif
 
+libvirtd_DEPENDENCIES = $(libvirtd_LDADD)
+
+
 default_xml_dest = libvirt/qemu/networks/default.xml
 install-data-local: install-init install-data-sasl install-data-polkit
 	mkdir -p $(DESTDIR)$(sysconfdir)/libvirt/qemu/networks/autostart
Index: src/qemu_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_conf.c,v
retrieving revision 1.108
diff -u -p -r1.108 qemu_conf.c
--- src/qemu_conf.c	19 Nov 2008 16:58:23 -0000	1.108
+++ src/qemu_conf.c	27 Nov 2008 13:20:24 -0000
@@ -37,6 +37,7 @@
 #include <sys/utsname.h>
 
 #if HAVE_NUMACTL
+#define NUMA_VERSION1_COMPATIBILITY 1
 #include <numa.h>
 #endif
 
@@ -300,11 +301,11 @@ qemudCapsInitGuest(virCapsPtr caps,
 #if HAVE_NUMACTL
 #define MAX_CPUS 4096
 #define MAX_CPUS_MASK_SIZE (sizeof(unsigned long))
-#define MAX_CPUS_MASK_LEN (MAX_CPUS / MAX_CPUS_MASK_SIZE)
-#define MAX_CPUS_MASK_BYTES (MAX_CPUS / 8)
+#define MAX_CPUS_MASK_BITS (MAX_CPUS_MASK_SIZE * 8)
+#define MAX_CPUS_MASK_LEN (MAX_CPUS / (MAX_CPUS_MASK_BITS))
 
 #define MASK_CPU_ISSET(mask, cpu) \
-    (((mask)[((cpu) / MAX_CPUS_MASK_SIZE)] >> ((cpu) % MAX_CPUS_MASK_SIZE)) & 1)
+    (((mask)[((cpu) / MAX_CPUS_MASK_BITS)] >> ((cpu) % MAX_CPUS_MASK_BITS)) & 1)
 
 static int
 qemudCapsInitNUMA(virCapsPtr caps)
@@ -322,7 +323,8 @@ qemudCapsInitNUMA(virCapsPtr caps)
         goto cleanup;
 
     for (n = 0 ; n <= numa_max_node() ; n++) {
-        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_BYTES) < 0)
+
+        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN) < 0)
             goto cleanup;
 
         for (ncpus = 0, i = 0 ; i < MAX_CPUS ; i++)
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.160
diff -u -p -r1.160 qemu_driver.c
--- src/qemu_driver.c	21 Nov 2008 12:16:08 -0000	1.160
+++ src/qemu_driver.c	27 Nov 2008 13:20:25 -0000
@@ -45,6 +45,7 @@
 #include <sys/ioctl.h>
 
 #if HAVE_NUMACTL
+#define NUMA_VERSION1_COMPATIBILITY 1
 #include <numa.h>
 #endif
 
Index: src/uml_conf.c
===================================================================
RCS file: /data/cvs/libvirt/src/uml_conf.c,v
retrieving revision 1.1
diff -u -p -r1.1 uml_conf.c
--- src/uml_conf.c	19 Nov 2008 16:58:23 -0000	1.1
+++ src/uml_conf.c	27 Nov 2008 13:20:25 -0000
@@ -37,6 +37,7 @@
 #include <sys/utsname.h>
 
 #if HAVE_NUMACTL
+#define NUMA_VERSION1_COMPATIBILITY 1
 #include <numa.h>
 #endif
 
@@ -56,11 +57,11 @@
 #if HAVE_NUMACTL
 #define MAX_CPUS 4096
 #define MAX_CPUS_MASK_SIZE (sizeof(unsigned long))
-#define MAX_CPUS_MASK_LEN (MAX_CPUS / MAX_CPUS_MASK_SIZE)
-#define MAX_CPUS_MASK_BYTES (MAX_CPUS / 8)
+#define MAX_CPUS_MASK_BITS (MAX_CPUS_MASK_SIZE * 8)
+#define MAX_CPUS_MASK_LEN (MAX_CPUS / (MAX_CPUS_MASK_BITS))
 
 #define MASK_CPU_ISSET(mask, cpu) \
-    (((mask)[((cpu) / MAX_CPUS_MASK_SIZE)] >> ((cpu) % MAX_CPUS_MASK_SIZE)) & 1)
+    (((mask)[((cpu) / MAX_CPUS_MASK_BITS)] >> ((cpu) % MAX_CPUS_MASK_BITS)) & 1)
 
 static int
 umlCapsInitNUMA(virCapsPtr caps)
@@ -78,7 +79,8 @@ umlCapsInitNUMA(virCapsPtr caps)
         goto cleanup;
 
     for (n = 0 ; n <= numa_max_node() ; n++) {
-        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_BYTES) < 0)
+
+        if (numa_node_to_cpus(n, mask, MAX_CPUS_MASK_LEN) < 0)
             goto cleanup;
 
         for (ncpus = 0, i = 0 ; i < MAX_CPUS ; i++)
Index: src/uml_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/uml_driver.c,v
retrieving revision 1.2
diff -u -p -r1.2 uml_driver.c
--- src/uml_driver.c	21 Nov 2008 10:06:28 -0000	1.2
+++ src/uml_driver.c	27 Nov 2008 13:20:25 -0000
@@ -46,6 +46,7 @@
 #include <sys/inotify.h>
 
 #if HAVE_NUMACTL
+#define NUMA_VERSION1_COMPATIBILITY 1
 #include <numa.h>
 #endif
 

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list