diff --git a/numactl-fix-for-ppc64.patch b/numactl-fix-for-ppc64.patch new file mode 100644 index 0000000..d227fa1 --- /dev/null +++ b/numactl-fix-for-ppc64.patch @@ -0,0 +1,136 @@ +From: Bernhard Walle +Subject: [PATCH] Fix "memset fails with 'mbind: Invalid argument'" on PPC64 +References: bnc #455977 + +Backport of +https://bugzilla.novell.com/attachment.cgi?id=264645 + + +Signed-off-by: Bernhard Walle + +--- + libnuma.c | 56 +++++++++++++++++++++++++++++++++++++++++++++----------- + numaint.h | 1 + + 2 files changed, 46 insertions(+), 11 deletions(-) + +--- a/libnuma.c ++++ b/libnuma.c +@@ -69,12 +69,37 @@ static int maxprocnode = -1; + static int maxproccpu = -1; + static int nodemask_sz = 0; + static int cpumask_sz = 0; ++static int is_bigendian_64; + + int numa_exit_on_error = 0; + int numa_exit_on_warn = 0; + static void set_sizes(void); + + /* ++ * return 1 if this machine is big-endian 64-bit ++ */ ++int ++big_endian64() ++{ ++ union { ++ struct { ++ int a; ++ int b; ++ } ints; ++ struct { ++ long a; ++ } lng; ++ } ua; ++ if (sizeof(long) != 8) ++ return 0; ++ ua.ints.a = 0; ++ ua.ints.b = 3; ++ if (ua.lng.a == 3) ++ return 1; ++ return 0; ++} ++ ++/* + * There are two special functions, _init(void) and _fini(void), which + * are called automatically by the dynamic loader whenever a library is loaded. + * +@@ -91,6 +116,7 @@ numa_init(void) + for (i = 0; i < max; i++) + nodemask_set_compat((nodemask_t *)&numa_all_nodes, i); + memset(&numa_no_nodes, 0, sizeof(numa_no_nodes)); ++ is_bigendian_64 = big_endian64(); + } + + /* +@@ -103,10 +129,18 @@ numa_init(void) + static unsigned int + _getbit(const struct bitmask *bmp, unsigned int n) + { +- if (n < bmp->size) +- return (bmp->maskp[n/bitsperlong] >> (n % bitsperlong)) & 1; +- else +- return 0; ++ unsigned long *ip; ++ ++ if (n < bmp->size) { ++ if (is_bigendian_64) { ++ ip = bmp->maskp; ++ return (ip[n/bitsperlong] >> ++ (n % bitsperlong)) & 1; ++ } else ++ return (bmp->maskp[n/bitsperlong] >> ++ (n % bitsperlong)) & 1; ++ } else ++ return 0; + } + + static void +@@ -372,10 +406,10 @@ read_mask(char *s, struct bitmask *bmp) + { + char *end = s; + char *prevend; +- unsigned int *start = (unsigned int *)bmp->maskp; +- unsigned int *p = start; +- unsigned int *q; +- unsigned int i; ++ unsigned long *start = (unsigned long *)bmp->maskp; ++ unsigned long *p = start; ++ unsigned long *q; ++ unsigned long i; + unsigned int n = 0; + + i = strtoul(s, &end, 16); +@@ -404,21 +438,21 @@ read_mask(char *s, struct bitmask *bmp) + * is the highest and we put it first because we read it first. + */ + for (q = start + n, p = start; p < q; q--, p++) { +- unsigned int x = *q; ++ unsigned long x = *q; + + *q = *p; + *p = x; + } + + /* Poor mans fls() */ +- for(i = 31; i >= 0; i--) ++ for(i = sizeof(unsigned long)*8 - 1; i >= 0; i--) + if (test_bit(i, start + n)) + break; + + /* + * Return the last bit set + */ +- return ((sizeof(unsigned int)*8) * n) + i; ++ return ((sizeof(unsigned long)*8) * n) + i; + } + + /* +--- a/numaint.h ++++ b/numaint.h +@@ -32,6 +32,7 @@ enum numa_warn { + }; + + #define howmany(x,y) (((x)+((y)-1))/(y)) ++#define bitsperint (8 * sizeof(unsigned int)) + #define bitsperlong (8 * sizeof(unsigned long)) + #define longsperbits(n) howmany(n, bitsperlong) + #define bytesperbits(x) ((x+7)/8) diff --git a/numactl.changes b/numactl.changes index 95da7b0..88f849a 100644 --- a/numactl.changes +++ b/numactl.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Jan 13 09:48:27 CET 2009 - bwalle@suse.de + +- Fix "memset fails with 'mbind: Invalid argument'" on PPC64 + (bnc #455977). + ------------------------------------------------------------------- Mon Dec 8 16:46:29 CET 2008 - kukuk@suse.de diff --git a/numactl.spec b/numactl.spec index 9dc39f1..d0f49e5 100644 --- a/numactl.spec +++ b/numactl.spec @@ -1,7 +1,7 @@ # # spec file for package numactl (Version 2.0.2) # -# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,7 +23,7 @@ Name: numactl License: GPL v2 only; GPL v2 or later Summary: NUMA Policy Control Version: 2.0.2 -Release: 19 +Release: 21 AutoReqProv: on Source: numactl-%{version}.tar.bz2 Group: System/Management @@ -31,6 +31,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build ExclusiveArch: ia64 x86_64 ppc64 ppc Requires: perl Patch0: %{name}-compat.diff +Patch1: %{name}-fix-for-ppc64.patch %description Control NUMA policy for individual processes. Offer libnuma for @@ -81,6 +82,9 @@ Authors: %prep %setup %patch0 -p1 +%ifarch ppc ppc64 +%patch1 -p1 +%endif %build make CFLAGS="${RPM_OPT_FLAGS}" @@ -120,6 +124,9 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/lib*so %changelog +* Tue Jan 13 2009 bwalle@suse.de +- Fix "memset fails with 'mbind: Invalid argument'" on PPC64 + (bnc #455977). * Mon Dec 08 2008 kukuk@suse.de - Fix baselibs.conf * Fri Dec 05 2008 bwalle@suse.de