Re: [patch 3/3] cyclictest: Align measurement threads to the next full second
From: John Kacur <jkacur@redhat.com>
Date: 2015-06-02 13:05:58
On Sat, 30 May 2015, Anna-Maria Gleixner wrote:
quoted hunk ↗ jump to hunk
On 2015-05-26 21:07, anna-maria@glx-um.de wrote:quoted
+ case OPT_SECALIGNED: + secaligned = 1; + if (optarg != NULL) + offset = atoi(optarg) * 1000; + else if (optind < argc && atoi(argv[optind]))The conversion to microseconds is missing as well.quoted
+ offset = atoi(argv[optind]); + elseThe patch is fixed. Anna-Maria cyclictest starts the test threads at a random point in time. For fully reproducible tests it is required to schedule the threads with a specified offset from the timer tick. The influence of the tick can be measured by running the test with offset = 0 and offset = tickinterval/2. To achieve this we rely on the fact, that the kernel starts the tick at CLOCK_MONOTONIC time 0. So it's guaranteed that the tick timer expires always every second (if the interval between the ticks defined by CONFIG_HZ is a whole-number divider of a second). Setting the global start time of the test threads to a full second (plus offset) and the interval to the interval between the ticks, the threads are scheduled with the specified offset to the tick. Add a new option --secaligned which select this mode and modify the --aligned option code to support this. The --secaligned and --aligned options are mutually exclusive. Signed-off-by Anna-Maria Gleixner [off-list ref] --- src/cyclictest/cyclictest.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) Index: rt-tests/src/cyclictest/cyclictest.c ===================================================================--- rt-tests.orig/src/cyclictest/cyclictest.c +++ rt-tests/src/cyclictest/cyclictest.c@@ -185,6 +185,7 @@ static int ct_debug; static int use_fifo = 0; static pthread_t fifo_threadid; static int aligned = 0; +static int secaligned = 0; static int offset = 0; static int laptop = 0;@@ -798,14 +799,27 @@ void *timerthread(void *param) fatal("timerthread%d: failed to set priority to %d\n",par->cpu, par->prio); /* Get current time */ - if(aligned){ + if (aligned || secaligned) { pthread_barrier_wait(&globalt_barr); - if(par->tnum==0) + if (par->tnum == 0) { clock_gettime(par->clock, &globalt); + if (secaligned) { + /* Ensure that the thread start timestamp is not + in the past */ + if (globalt.tv_nsec > 900000000) + globalt.tv_sec += 2; + else + globalt.tv_sec++; + globalt.tv_nsec = 0; + } + } pthread_barrier_wait(&align_barr); now = globalt; if(offset) { - now.tv_nsec += offset * par->tnum; + if (aligned) + now.tv_nsec += offset * par->tnum; + else + now.tv_nsec += offset; tsnorm(&now); } }@@ -1056,6 +1070,8 @@ static void display_help(int error) "-R --resolution check clock resolution, callingclock_gettime() many\n" " times. list of clock_gettime() values will be\n" " reported with -X\n" + " --secaligned [USEC] align thread wakeups to the next full second,\n" + " and apply the optional offset\n" "-s --system use sys_nanosleep and sys_setitimer\n" "-S --smp Standard SMP testing: options -a -t -n and\n" " same priority of all threads\n"@@ -1204,7 +1220,7 @@ enum option_values { OPT_QUIET, OPT_PRIOSPREAD, OPT_RELATIVE, OPT_RESOLUTION, OPT_SYSTEM, OPT_SMP, OPT_THREADS, OPT_TRACER, OPT_UNBUFFERED, OPT_NUMA,OPT_VERBOSE, OPT_WAKEUP, OPT_WAKEUPRT, OPT_DBGCYCLIC, OPT_POLICY, OPT_HELP, OPT_NUMOPTS, - OPT_ALIGNED, OPT_LAPTOP, + OPT_ALIGNED, OPT_LAPTOP, OPT_SECALIGNED, }; /* Process commandline options */@@ -1251,6 +1267,7 @@ static void process_options (int argc, c {"priospread", no_argument, NULL,OPT_PRIOSPREAD }, {"relative", no_argument, NULL, OPT_RELATIVE }, {"resolution", no_argument, NULL, OPT_RESOLUTION }, + {"secaligned", optional_argument, NULL, OPT_SECALIGNED }, {"system", no_argument, NULL, OPT_SYSTEM }, {"smp", no_argument, NULL, OPT_SMP }, {"threads", optional_argument, NULL, OPT_THREADS },@@ -1391,6 +1408,15 @@ static void process_options (int argc, c case OPT_RESOLUTION: check_clock_resolution = 1; break; case 's': + case OPT_SECALIGNED: + secaligned = 1; + if (optarg != NULL) + offset = atoi(optarg) * 1000; + else if (optind < argc && atoi(argv[optind])) + offset = atoi(argv[optind]) * 1000; + else + offset = 0; + break; case OPT_SYSTEM: use_system = MODE_SYS_OFFSET; break; case 'S':@@ -1528,7 +1554,10 @@ static void process_options (int argc, c if (num_threads < 1) error = 1; - if (aligned) { + if (aligned && secaligned) + error = 1; + + if (aligned || secaligned) { pthread_barrier_init(&globalt_barr, NULL, num_threads); pthread_barrier_init(&align_barr, NULL, num_threads); } --
Sorry, this one isn't applying either, perhaps your emailer is doing automatic word wrap? Can you fix this up, and resend please? Thank you John Kacur