Re: [patch 3/3] cyclictest: Align measurement threads to the next full second

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

 




On Sat, 30 May 2015, Anna-Maria Gleixner wrote:

> On 2015-05-26 21:07, anna-maria@xxxxxxxxx wrote:
> 
> > +		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.
> 
> > +				offset = atoi(argv[optind]);
> > +			else
> 
> The 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 <anna-maria@xxxxxxxxx>
> ---
>  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, calling
> clock_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
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[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