linux-numa.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sharyathi Nagesh <sharyath@in.ibm.com>
To: linux-numa@vger.kernel.org, Andi Kleen <andi@firstfloor.org>,
	Christoph Lameter <clameter@sgi.com>, Cliff Wickman <cpw@sgi.com>,
	Lee Schermerhorn <lee.schermerhorn@hp.com>,
	Amit
Subject: Fix to numa_node_to_cpus_v2
Date: Thu, 28 Jan 2010 11:23:05 +0530	[thread overview]
Message-ID: <4B612641.6050305@in.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 2681 bytes --]

Hi

   We observed that numa_node_to_cpus api() api converts  a node number to a bitmask of
CPUs. The user must pass a long enough buffer. If the buffer is not long enough
errno will be set to ERANGE and -1 returned. On success 0 is returned.
This api has been changed in numa version 2.0. It has new implementation (_v2)

Analysis:
  Now within the numa_node_to_cpus code there is a check if the size of buffer
passed from the user matches the one returned by the sched_getaffinity. This
check fails and hence we see "map size mismatch: abort" messages coming out on
console. My system has 4 node and 8 CPUs.

------------------------------------------------------------------------------------
Testcase to reproduce the problem

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <numa.h>

typedef unsigned long BUF[64];

int numa_exit_on_error = 0;

void node_to_cpus(void)
{
         int i;
         BUF cpubuf;
         BUF affinityCPUs;
         int maxnode = numa_max_node();
         printf("available: %d nodes (0-%d)\n", 1+maxnode, maxnode);
         for (i = 0; i <= maxnode; i++) {
                 printf("Calling numa_node_to_cpus()\n");
                 printf("Size of BUF is : %d \n",sizeof(BUF));
                 if ( 0 == numa_node_to_cpus(i, cpubuf, sizeof(BUF)) ) {
                         printf("Calling numa_node_to_cpus() again \n");
                         if ( 0 == numa_node_to_cpus(i, cpubuf, sizeof(BUF)) ) {
                         } else {
                                 printf("Got < 0 \n");
                                 numa_error("numa_node_to_cpu");
                                 numa_exit_on_error = 1;
                                 exit(numa_exit_on_error);
                         }
                 } else {
                         numa_error("numa_node_to_cpu 0");
                         numa_exit_on_error = 1;
                         exit(numa_exit_on_error);
                 }
         }
}
int main()
{
         void node_to_cpus();
         if (numa_available() < 0)
         {
             printf("This system does not support NUMA policy\n");
             numa_error("numa_available");
             numa_exit_on_error = 1;
             exit(numa_exit_on_error);
         }
         node_to_cpus();
         return numa_exit_on_error;
}
------------------------------------------------------------------------------------

Problem Fix:
    The fix is to allow numa_node_to_cpus_v2() to fail only when the supplied buffer is 
smaller than the bitmask required to represent online NUMA nodes.
Attaching the patch to address this issues, patch is generated against numactl-2.0.4-rc1

Regards
Yeehaw


[-- Attachment #2: fix_numa_node_to_cpus_v2.patch --]
[-- Type: text/x-patch, Size: 530 bytes --]

Index: numactl-2.0.4-rc1/libnuma.c
===================================================================
--- numactl-2.0.4-rc1.orig/libnuma.c	2009-12-16 02:48:26.000000000 +0530
+++ numactl-2.0.4-rc1/libnuma.c	2010-01-27 17:06:30.000000000 +0530
@@ -1272,7 +1272,7 @@
 
 	if (node_cpu_mask_v2[node]) {
 		/* have already constructed a mask for this node */
-		if (buffer->size != node_cpu_mask_v2[node]->size) {
+		if (buffer->size < node_cpu_mask_v2[node]->size) {
 			numa_error("map size mismatch; abort\n");
 			return -1;
 		}

             reply	other threads:[~2010-01-28  5:53 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-28  5:53 Sharyathi Nagesh [this message]
  -- strict thread matches above, loose matches on Subject: below --
2010-02-01 22:37 Fix to numa_node_to_cpus_v2 Cliff Wickman
2010-02-02  5:16 ` Sharyathi Nagesh
2010-02-02 13:40   ` Cliff Wickman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4B612641.6050305@in.ibm.com \
    --to=sharyath@in.ibm.com \
    --cc=andi@firstfloor.org \
    --cc=clameter@sgi.com \
    --cc=cpw@sgi.com \
    --cc=lee.schermerhorn@hp.com \
    --cc=linux-numa@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).