diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c index c3d45f3..e2753db 100644 --- a/src/cyclictest/cyclictest.c +++ b/src/cyclictest/cyclictest.c @@ -892,6 +892,7 @@ static int interval = DEFAULT_INTERVAL; static int distance = -1; static struct bitmask *affinity_mask = NULL; static int smp = 0; +static int setaffinity = AFFINITY_UNSPECIFIED; static int clocksources[] = { CLOCK_MONOTONIC, @@ -1019,12 +1020,22 @@ static void process_options(int argc, char *argv[], int max_cpus) break; if (optarg) { parse_cpumask(optarg, max_cpus, &affinity_mask); + setaffinity = AFFINITY_SPECIFIED; } else if (optind < argc && (atoi(argv[optind]) || argv[optind][0] == '0' || argv[optind][0] == '!')) { parse_cpumask(argv[optind], max_cpus, &affinity_mask); + setaffinity = AFFINITY_SPECIFIED; + } else { + setaffinity = AFFINITY_USEALL; } + + if (setaffinity == AFFINITY_SPECIFIED && !affinity_mask) + display_help(1); + if (verbose) + printf("Using %u cpus.\n", + numa_bitmask_weight(affinity_mask)); break; case 'A': case OPT_ALIGNED: @@ -1117,6 +1128,7 @@ static void process_options(int argc, char *argv[], int max_cpus) case OPT_SMP: /* SMP testing */ smp = 1; num_threads = -1; /* update after parsing */ + setaffinity = AFFINITY_USEALL; break; case 't': case OPT_THREADS: @@ -1185,16 +1197,23 @@ static void process_options(int argc, char *argv[], int max_cpus) use_nanosleep = MODE_CLOCK_NANOSLEEP; } + /* if smp wasn't requested, test for numa automatically */ + if (!smp) { + if (setaffinity == AFFINITY_UNSPECIFIED) + setaffinity = AFFINITY_USEALL; + } + if (option_affinity && smp) { warn("-a ignored due to smp mode\n"); if (affinity_mask) { numa_bitmask_free(affinity_mask); affinity_mask = NULL; } + setaffinity = AFFINITY_USEALL; } if (smi) { - if (affinity_mask) + if (setaffinity == AFFINITY_UNSPECIFIED) fatal("SMI counter relies on thread affinity\n"); if (!has_smi_counter()) @@ -1777,7 +1796,7 @@ int main(int argc, char **argv) } /* Restrict the main pid to the affinity specified by the user */ - if (affinity_mask) { + if (affinity_mask != NULL) { int res; errno = 0; @@ -1940,13 +1959,18 @@ int main(int argc, char **argv) if (status != 0) fatal("error from pthread_attr_init for thread %d: %s\n", i, strerror(status)); - if (affinity_mask) + switch (setaffinity) { + case AFFINITY_UNSPECIFIED: cpu = -1; break; + case AFFINITY_SPECIFIED: cpu = cpu_for_thread_sp(i, max_cpus, affinity_mask); - else + if (verbose) + printf("Thread %d using cpu %d.\n", i, cpu); + break; + case AFFINITY_USEALL: cpu = cpu_for_thread_ua(i, max_cpus); - - if (verbose) - printf("Thread %d using cpu %d.\n", i, cpu); + break; + default: cpu = -1; + } /* find the memory node associated with the cpu i */ node = rt_numa_numa_node_of_cpu(cpu);