Re: [PATCH 1/6] cyclictest: Centralize clock option parsing

Florian Bezdeka <[email protected]> Tue, 07 Apr 2026 10:27:39 +0200
Newsgroups org.kernel.vger.linux-rt-users
Message-ID <[email protected]>
On Tue, 2026-04-07 at 08:48 +0200, Thomas Weißschuh (Schneider Electric)
wrote:
> Currently the lookup of the clockid from the commandline options is done
> in multiple places. This makes the addition of symbolic clock names and
> new clocks cumbersome.
> 
> Move all of the clock option parsing into a new helper function.
> 
> As a side-effect fix an off-by-one error in the validation of the
> clock command line argument.
> 
> The new variable can not be named 'clock' as that would conflict with
> the libc function of the same name.
> 
> Signed-off-by: Thomas Weißschuh (Schneider Electric) <[email protected]>
> ---
>  src/cyclictest/cyclictest.c | 35 ++++++++++++++++++-----------------
>  1 file changed, 18 insertions(+), 17 deletions(-)
> 
> diff --git a/src/cyclictest/cyclictest.c b/src/cyclictest/cyclictest.c
> index 960c90560668..592cf9d9387d 100644
> --- a/src/cyclictest/cyclictest.c
> +++ b/src/cyclictest/cyclictest.c
> @@ -1022,7 +1022,7 @@ static int priority;
>  static int policy = SCHED_OTHER;	/* default policy if not specified */
>  static int num_threads = 1;
>  static int max_cycles;
> -static int clocksel = 0;
> +static clockid_t used_clock;
>  static int quiet;
>  static int interval = DEFAULT_INTERVAL;
>  static int distance = -1;
> @@ -1031,10 +1031,17 @@ static struct bitmask *main_affinity_mask = NULL;
>  static int smp = 0;
>  static int setaffinity = AFFINITY_UNSPECIFIED;
>  
> -static int clocksources[] = {
> -	CLOCK_MONOTONIC,
> -	CLOCK_REALTIME,
> -};
> +static int handleclock(const char *clockarg)
> +{
> +	if (strcmp(clockarg, "0") == 0)
> +		used_clock = CLOCK_MONOTONIC;
> +	else if (strcmp(clockarg, "1") == 0)
> +		used_clock = CLOCK_REALTIME;
> +	else
> +		return 1;
> +
> +	return 0;
> +}

What happens to "unexpected" cmdline parameters now? used_clocks will
not be set and ...

>  
>  static void handlepolicy(char *polname)
>  {
> @@ -1195,7 +1202,7 @@ static void process_options(int argc, char *argv[], int max_cpus)
>  			tracelimit = atoi(optarg); break;
>  		case 'c':
>  		case OPT_CLOCK:
> -			clocksel = atoi(optarg); break;
> +			error |= handleclock(optarg); break;
>  		case OPT_DEFAULT_SYSTEM:
>  			power_management = 1; break;
>  		case 'd':
> @@ -1377,9 +1384,6 @@ static void process_options(int argc, char *argv[], int max_cpus)
>  			      "on this processor\n");
>  	}
>  
> -	if (clocksel < 0 || clocksel > ARRAY_SIZE(clocksources))
> -		error = 1;
> -

... the validation check has been removed. As unused_clock is static
(and with that initialized to zero) all invalid parameter values will
silently be "migrated" to CLOCK_REALTIME. Right?

I would vote for an error/warn message to avoid that a fat fingered
cmdline argument invalidates your measurements.

>  	if (oscope_reduction < 1)
>  		error = 1;
>  
> @@ -1983,7 +1987,6 @@ int main(int argc, char **argv)
>  		warn("High resolution timers not available\n");
>  
>  	if (check_clock_resolution) {
> -		int clock;
>  		uint64_t diff;
>  		int k;
>  		uint64_t min_non_zero_diff = UINT64_MAX;
> @@ -1994,9 +1997,7 @@ int main(int argc, char **argv)
>  		struct timespec *time;
>  		int times;
>  
> -		clock = clocksources[clocksel];
> -
> -		if (clock_getres(clock, &res))
> +		if (clock_getres(used_clock, &res))
>  			warn("clock_getres failed");
>  		else
>  			reported_resolution = (NSEC_PER_SEC * res.tv_sec) + res.tv_nsec;
> @@ -2009,9 +2010,9 @@ int main(int argc, char **argv)
>  		 * This will reliably capture resolution <= 500 usec.
>  		 */
>  		times = 1000;
> -		clock_gettime(clock, &prev);
> +		clock_gettime(used_clock, &prev);
>  		for (k=0; k < times; k++)
> -			clock_gettime(clock, &now);
> +			clock_gettime(used_clock, &now);
>  
>  		diff = calcdiff_ns(now, prev);
>  		if (diff == 0) {
> @@ -2035,7 +2036,7 @@ int main(int argc, char **argv)
>  		time = calloc(times, sizeof(*time));
>  
>  		for (k=0; k < times; k++)
> -			clock_gettime(clock, &time[k]);
> +			clock_gettime(used_clock, &time[k]);
>  
>  		info(ct_debug, "For %d consecutive calls to clock_gettime():\n", times);
>  		info(ct_debug, "time, delta time (nsec)\n");
> @@ -2193,7 +2194,7 @@ int main(int argc, char **argv)
>  		}
>  		if (priospread)
>  			priority--;
> -		par->clock = clocksources[clocksel];
> +		par->clock = used_clock;
>  		par->mode = mode;
>  		par->timermode = timermode;
>  		par->signal = signum;
> 
> -- 
> 2.53.0