From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andi Kleen Subject: [PATCH] Fix test/prefered v2 Date: Sat, 10 Jan 2009 07:18:09 +0100 Message-ID: <20090110061809.GD26290@one.firstfloor.org> References: <20090110055408.GC26290@one.firstfloor.org> Mime-Version: 1.0 Return-path: Content-Disposition: inline In-Reply-To: <20090110055408.GC26290@one.firstfloor.org> Sender: linux-numa-owner@vger.kernel.org List-ID: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Andi Kleen Cc: cpw@sgi.com, linux-numa@vger.kernel.org > Fix test/prefered > > Couple of bugs here: > > - First the kernel errors out of the nodemask is < MAXNUMNODES, > so have to discover that at runtime. There's no function > in libnuma for this (perhaps there should be one?), so i > wrote one here. > - The loop set the node in the wrong mask, breaking the test Sorry that was the broken version, here's a v2 with a actually working max_numnode. The older version happened to work on my test system, but was obviously not correct. --- Fix test/prefered v2 Couple of bugs here: - First the kernel errors out of the nodemask is < MAXNUMNODES, so have to discover that at runtime. There's no function in libnuma for this (perhaps there should be one?), so i wrote one here. - The loop set the node in the wrong mask, breaking the test v2: Correct max_numnode detection Signed-off-by: Andi Kleen --- numactl-2.0.2/test/prefered.c 2008-08-05 16:36:58.000000000 +0200 +++ numactl-2.0.2-hack/test/prefered.c 2009-01-10 07:00:16.000000000 +0100 @@ -6,20 +6,38 @@ #include #include #include +#include #define err(x) perror(x),exit(1) +/* Discover MAXNUMNODE of the kernel */ +int max_numnode(void) +{ + int v; + unsigned size = 64; + struct bitmask *mask = numa_bitmask_alloc(size); + while (get_mempolicy(NULL, mask->maskp, mask->size, &v, MPOL_F_ADDR) < 0 && + errno == EINVAL) { + numa_bitmask_free(mask); + size <<= 1; + mask = numa_bitmask_alloc(size); + } + numa_bitmask_free(mask); + return size; +} + int main(void) { int max = numa_max_node(); + int maxmask = max_numnode(); struct bitmask *nodes, *mask; int pagesize = getpagesize(); int i; int pol; int node; int err = 0; - nodes = numa_bitmask_alloc(max+1); - mask = numa_bitmask_alloc(max+1); + nodes = numa_bitmask_alloc(maxmask); + mask = numa_bitmask_alloc(maxmask); for (i = max; i >= 0; --i) { char *mem = mmap(NULL, pagesize*(max+1), PROT_READ|PROT_WRITE, @@ -33,8 +51,8 @@ numa_bitmask_clearall(nodes); numa_bitmask_clearall(mask); - numa_bitmask_setbit(mask, i); + numa_bitmask_setbit(nodes, i); if (mbind(adr, pagesize, MPOL_PREFERRED, nodes->maskp, nodes->size, 0) < 0) err("mbind");