[PATCH] cyclictest: Fix setaffinity error on large NUMA machines

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On large NUMA machines still getting the following error
WARN: Couldn't setaffinity in main thread: Invalid argument

Instead of calling numa_bitmask_alloc() with max_cpus, use
numa_allocate_cpumask() to fix this.

Also, make sure numa_available() is called before any other calls to the
numa library. Depending on how the options were invoked this could
happen in parse_cpumask for example. Note, this did not seem to cause
any problems in practice, but let's adhere to the library contract.

Signed-off-by: John Kacur <jkacur@xxxxxxxxxx>
---
 src/cyclictest/cyclictest.c | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
index 989113fb3483..79bb1cb71c68 100644
--- a/src/cyclictest/cyclictest.c
+++ b/src/cyclictest/cyclictest.c
@@ -1135,7 +1135,7 @@ static void use_current_cpuset(const int max_cpus)
 
 	pid = getpid();
 
-	curmask = numa_bitmask_alloc(max_cpus);
+	curmask = numa_allocate_cpumask();
 	numa_sched_getaffinity(pid, curmask);
 
 	/* Clear bits that are not set in both the cpuset from the environment,
@@ -1225,6 +1225,20 @@ enum option_values {
 	OPT_TRACEMARK, OPT_POSIX_TIMERS,
 };
 
+/* numa_available() must be called before any other calls to the numa library */
+static void numa_initialize(void)
+{
+	static int is_initialized;
+
+	if (is_initialized == 1)
+		return;
+
+	if (numa_available() != -1)
+		numa = 1;
+
+	is_initialized = 1;
+}
+
 /* Process commandline options */
 static void process_options (int argc, char *argv[], int max_cpus)
 {
@@ -1288,6 +1302,7 @@ static void process_options (int argc, char *argv[], int max_cpus)
 			/* smp sets AFFINITY_USEALL in OPT_SMP */
 			if (smp)
 				break;
+			numa_initialize();
 			if (optarg != NULL) {
 				parse_cpumask(optarg, max_cpus);
 				setaffinity = AFFINITY_SPECIFIED;
@@ -1460,12 +1475,9 @@ static void process_options (int argc, char *argv[], int max_cpus)
 	/* if smp wasn't requested, test for numa automatically */
 	if (!smp) {
 #ifdef NUMA
-		if (numa_available() != -1) {
-			numa = 1;
-			if (setaffinity == AFFINITY_UNSPECIFIED) {
-				setaffinity = AFFINITY_USEALL;
-			}
-		}
+		numa_initialize();
+		if (setaffinity == AFFINITY_UNSPECIFIED)
+			setaffinity = AFFINITY_USEALL;
 #else
 		warn("cyclictest was not built with the numa option\n");
 		numa = 0;
-- 
2.21.3




[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux