From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] libnuma: enumerate CPUs correctly Date: Tue, 22 Jun 2010 08:02:43 +0100 Message-ID: <4C207C3302000078000078E8@vpn.id2.novell.com> Mime-Version: 1.0 Content-Transfer-Encoding: 8BIT Return-path: Content-Disposition: inline Sender: linux-numa-owner@vger.kernel.org List-ID: Content-Type: text/plain; charset="us-ascii" To: linux-numa@vger.kernel.org Cc: trenn@suse.de Just matching the first three characters of the directory entries under /sys/devices/system/cpu/ isn't sufficient, as that also include items like "cpuidle" and "cpufreq". Further, just counting entries isn't right, since there may be holes in the numbering, but the code really is after obtaining the highest possible CPU number. Signed-off-by: Jan Beulich Cc: Thomas Renninger --- 2.0.4-rc2.orig/libnuma.c 2010-06-09 10:22:33.000000000 +0200 +++ 2.0.4-rc2/libnuma.c 2010-06-09 11:07:21.000000000 +0200 @@ -536,7 +536,6 @@ set_numa_max_cpu(void) static void set_configured_cpus(void) { - int filecount=0; char *dirnamep = "/sys/devices/system/cpu"; struct dirent *dirent; DIR *dir; @@ -548,15 +547,19 @@ set_configured_cpus(void) return; } while ((dirent = readdir(dir)) != 0) { - if (!strncmp("cpu", dirent->d_name, 3)) { - filecount++; - } else { - continue; + if (dirent->d_type == DT_DIR + && !strncmp("cpu", dirent->d_name, 3)) { + long cpu = strtol(dirent->d_name + 3, NULL, 10); + + if (cpu < INT_MAX && cpu > maxconfiguredcpu) + maxconfiguredcpu = cpu; } } closedir(dir); - maxconfiguredcpu = filecount-1; /* high cpu number */ - return; + if (maxconfiguredcpu < 0) { + /* fall back to using the online cpu count */ + maxconfiguredcpu = sysconf(_SC_NPROCESSORS_CONF) - 1; + } } /*