[irqbalance] fixing some segfaults on non-numa systems
Neil Horman
nhorman at fedoraproject.org
Tue Oct 25 13:28:40 UTC 2011
commit 2baeffa6df7ae1763bcb8cd9668fd9c7b2e50b2f
Author: Neil Horman <nhorman at tuxdriver.com>
Date: Tue Oct 25 09:28:20 2011 -0400
fixing some segfaults on non-numa systems
irqbalance-bz748070-numa-pkg-assign.patch | 51 +++++++++++++++++++++++++++
irqbalance-bz748070-numa-sysfs.patch | 54 +++++++++++++++++++++++++++++
irqbalance.spec | 13 +++++--
3 files changed, 115 insertions(+), 3 deletions(-)
---
diff --git a/irqbalance-bz748070-numa-pkg-assign.patch b/irqbalance-bz748070-numa-pkg-assign.patch
new file mode 100644
index 0000000..f0f5d36
--- /dev/null
+++ b/irqbalance-bz748070-numa-pkg-assign.patch
@@ -0,0 +1,51 @@
+commit 1c4ad25a74b5b613b1d1972668bf41fc128420db
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date: Mon Oct 24 10:15:49 2011 -0400
+
+ Ensure that packages get valid numa node:
+
+ On non-numa enabled systems, packages will get a NULL pointer to the
+ numa node, instead of the implied unspecified node structure. This
+ resutls in a segfaul. This should fix it.
+
+ Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
+
+diff --git a/cputree.c b/cputree.c
+index 31fefab..26a45db 100644
+--- a/cputree.c
++++ b/cputree.c
+@@ -228,7 +228,7 @@ static void do_one_cpu(char *path)
+ free(line);
+ }
+
+- nodeid=0;
++ nodeid=-1;
+ dir = opendir(path);
+ do {
+ entry = readdir(dir);
+diff --git a/numa.c b/numa.c
+index 9cbbfc0..510fedc 100644
+--- a/numa.c
++++ b/numa.c
+@@ -127,19 +127,15 @@ static gint compare_node(gconstpointer a, gconstpointer b)
+ void add_package_to_node(struct topo_obj *p, int nodeid)
+ {
+ struct topo_obj find, *node;
+- find.number = nodeid;
+- GList *entry;
+
+- find.number = nodeid;
+- entry = g_list_find_custom(numa_nodes, &find, compare_node);
++ node = get_numa_node(nodeid);
+
+- if (!entry) {
++ if (!node) {
+ if (debug_mode)
+ printf("Could not find numa node for node id %d\n", nodeid);
+ return;
+ }
+
+- node = entry->data;
+
+ if (!p->parent) {
+ node->children = g_list_append(node->children, p);
diff --git a/irqbalance-bz748070-numa-sysfs.patch b/irqbalance-bz748070-numa-sysfs.patch
new file mode 100644
index 0000000..05a957e
--- /dev/null
+++ b/irqbalance-bz748070-numa-sysfs.patch
@@ -0,0 +1,54 @@
+commit effc540808e630d1fad423d653c43737e99cc1b6
+Author: Neil Horman <nhorman at tuxdriver.com>
+Date: Thu Oct 20 10:56:48 2011 -0400
+
+ Fix oops on non-numa enabled systems
+
+ Some systems aren't numa enabled, but still have devices that indicate they
+ belong to numa node 0 (rather than -1 as they should). Thats a kernel problem
+ but we still shouldn't crash as a result (which we will when device get a NULL
+ numa_node pointer as a result of trying to find non-existant node 0). This
+ patch fixes the crash by always returning the unspecified node pointer when numa
+ is disabled
+
+ Signed-off-by: Neil Horman <nhorman at tuxdriver.com>
+
+diff --git a/classify.c b/classify.c
+index 6a20480..bb34f04 100644
+--- a/classify.c
++++ b/classify.c
+@@ -281,7 +281,7 @@ struct irq_info *add_misc_irq(int irq)
+ new->irq = irq;
+ new->type = IRQ_TYPE_LEGACY;
+ new->class = IRQ_OTHER;
+- new->numa_node = get_numa_node(0);
++ new->numa_node = get_numa_node(-1);
+ interrupts_db = g_list_append(interrupts_db, new);
+ return new;
+ }
+diff --git a/irqbalance.h b/irqbalance.h
+index a1b1e8a..73a0864 100644
+--- a/irqbalance.h
++++ b/irqbalance.h
+@@ -49,6 +49,7 @@ extern GList *numa_nodes;
+ extern GList *packages;
+ extern GList *cache_domains;
+ extern GList *cpus;
++extern int numa_avail;
+
+ enum hp_e {
+ HINT_POLICY_IGNORE,
+diff --git a/numa.c b/numa.c
+index 0d93091..9cbbfc0 100644
+--- a/numa.c
++++ b/numa.c
+@@ -162,6 +162,9 @@ struct topo_obj *get_numa_node(int nodeid)
+ struct topo_obj find;
+ GList *entry;
+
++ if (!numa_avail)
++ return &unspecified_node;
++
+ if (nodeid == -1)
+ return &unspecified_node;
+
diff --git a/irqbalance.spec b/irqbalance.spec
index 99d7bfb..748a17f 100644
--- a/irqbalance.spec
+++ b/irqbalance.spec
@@ -1,6 +1,6 @@
Name: irqbalance
Version: 1.0
-Release: 2%{?dist}
+Release: 3%{?dist}
Epoch: 2
Summary: IRQ balancing daemon
@@ -10,9 +10,11 @@ Url: http://irqbalance.org/
Source0: http://irqbalance.googlecode.com/files/irqbalance-%{version}.tbz2
Source1: irqbalance.sysconfig
Patch0: irqbalance-bz746159-no-numa-nodes.patch
+Patch1: irqbalance-bz748070-numa-sysfs.patch
+Patch2: irqbalance-bz748070-numa-pkg-assign.patch
-BuildRequires: autoconf automake libtool libcap-ng
-BuildRequires: glib2-devel pkgconfig imake libcap-ng-devel numactl-devel
+BuildRequires: autoconf automake libtool libcap-ng numactl-devel
+BuildRequires: glib2-devel pkgconfig imake libcap-ng-devel
Requires: numactl
Requires(post): systemd-units
Requires(postun):systemd-units
@@ -28,6 +30,8 @@ multiple CPUs for enhanced performance.
%prep
%setup -q -n irqbalance
%patch0 -p1
+%patch1 -p1
+%patch2 -p1
%build
sh ./autogen.sh
@@ -77,6 +81,9 @@ fi
/sbin/chkconfig --del irqbalance >/dev/null 2>&1 || :
%changelog
+* Fri Oct 21 2011 Neil Horman <nhorman at redhat.com> - 2:1.0-3
+- Fix another crash on non-numa systems (bz 748070)
+
* Mon Oct 17 2011 Neil Horman <nhorman at redhat.com> - 2:1.0-2
- Fix crash for systems with no numa node support
More information about the scm-commits
mailing list