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 <jbeulich@xxxxxxxxxx> Cc: Thomas Renninger <trenn@xxxxxxx> --- 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; + } } /* -- To unsubscribe from this list: send the line "unsubscribe linux-numa" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html