sched_getaffinity() and sched_setaffinity() cares about number of possible
CPUs the OS or hardware can support, which can be larger than what
sysconf(_SC_NPROCESSORS_CONF) currently provides (by enumarating
/sys/devices/system/cpu/cpu* entries).

Use /sys/devices/system/cpu/kernel_max, if available. This represents
NR_CPUS-1, a compile time option which specifies "maximum number of CPUs
which this kernel will support". This should give us cpu mask size
large enough for any purposes.

If the kernel_max sysfs file is not available, fall back to
_SC_NPROCESSORS_CONF.

Signed-off-by: Jan Stancek <jstan...@redhat.com>
---
 lib/tst_cpu.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

Tested on system supporting CPU hotplug:
NR_CPUS:4096 nr_cpumask_bits:144 nr_cpu_ids:144 nr_node_ids:1

# cat /sys/devices/system/cpu/online 
0-15
# cat /sys/devices/system/cpu/offline 
16-143
# cat /sys/devices/system/cpu/possible 
0-143
# cat /sys/devices/system/cpu/kernel_max 
4095

diff --git a/lib/tst_cpu.c b/lib/tst_cpu.c
index e8ab34e..b492dc2 100644
--- a/lib/tst_cpu.c
+++ b/lib/tst_cpu.c
@@ -33,13 +33,35 @@ long tst_ncpus(void)
        return ncpus;
 }
 
+#define KERNEL_MAX "/sys/devices/system/cpu/kernel_max"
+
 long tst_ncpus_max(void)
 {
        long ncpus_max = -1;
+       struct stat buf;
+
+       /* sched_getaffinity() and sched_setaffinity() cares about number of
+        * possible CPUs the OS or hardware can support, which can be larger
+        * than what sysconf(_SC_NPROCESSORS_CONF) currently provides
+        * (by enumarating /sys/devices/system/cpu/cpu* entries).
+        *
+        *  Use /sys/devices/system/cpu/kernel_max, if available. This
+        *  represents NR_CPUS-1, a compile time option which specifies
+        *  "maximum number of CPUs which this kernel will support".
+        *  This should provide cpu mask size large enough for any purposes. */
+       if (stat(KERNEL_MAX, &buf) == 0) {
+               SAFE_FILE_SCANF(NULL, KERNEL_MAX, "%ld", &ncpus_max);
+               /* this is maximum CPU index allowed by the kernel
+                * configuration, so # of cpus allowed by config is +1 */
+               ncpus_max++;
+       } else {
+               /* fall back to _SC_NPROCESSORS_CONF */
 #ifdef _SC_NPROCESSORS_CONF
-       ncpus_max = SAFE_SYSCONF(NULL, _SC_NPROCESSORS_CONF);
+               ncpus_max = SAFE_SYSCONF(NULL, _SC_NPROCESSORS_CONF);
 #else
-       tst_brkm(TBROK, NULL, "could not determine number of CPUs configured");
+               tst_brkm(TBROK, NULL, "could not determine number of CPUs"
+                       " configured");
 #endif
+       }
        return ncpus_max;
 }
-- 
1.7.1


------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to