[LTP] [PATCH v2] sched: starvation: Autocallibrate the timeout
Petr Vorel
pvorel@suse.cz
Wed Jun 12 14:21:20 CEST 2024
Hi Cyril,
> Instead of hardcoding the values we attempt to measure the CPU speed and
> set the timeout accordingly. Given that the difference in the duration
> of the test when the kernel is buggy is about 30x we do not have to have
> a precise callibration, just very rough estimate if we are running on a
> server or small ARM board would suffice.
> So we attempt to measure how long does a bussy loop take and base the
s/bussy/busy/
> default timeout on that. On x86_64 CPUs the resulting timeout is about
> double of the value of the actual test runtime and works fine, but we
> need to make sure that the coeficient we divide the result from
> callibrate works for small boards too. So please run the test on as many
> machines as you can and report if we need to make the dividor smaller or
> not.
This looks much better: ppc64le has Timeout per run is 0h 00m 30s (1m 10s
runtime), others (x68_64, s390x, aarch64) have ~ 1 min or less.
Tested-by: Petr Vorel <pvorel@suse.cz>
...
> +static int callibrate(void)
> +{
> + int i;
> + struct timespec start, stop;
> + long long diff;
> +
> + for (i = 0; i < CALLIBRATE_LOOPS; i++) {
> + __asm__ __volatile__ ("" : "+g" (i) : :);
> + }
> +
> + SAFE_CLOCK_GETTIME(CLOCK_MONOTONIC_RAW, &start);
> +
> + for (i = 0; i < CALLIBRATE_LOOPS; i++) {
> + __asm__ __volatile__ ("" : "+g" (i) : :);
> + }
> +
> + SAFE_CLOCK_GETTIME(CLOCK_MONOTONIC_RAW, &stop);
> +
> + diff = tst_timespec_diff_us(stop, start);
> +
> + tst_res(TINFO, "CPU did %i loops in %llius", CALLIBRATE_LOOPS, diff);
> +
> + return diff;
> +}
> static int wait_for_pid(pid_t pid)
> {
> @@ -59,8 +88,11 @@ static void setup(void)
> if (tst_parse_long(str_loop, &loop, 1, LONG_MAX))
> tst_brk(TBROK, "Invalid number of loop number '%s'", str_loop);
> - if (tst_parse_int(str_timeout, &timeout, 1, INT_MAX))
> + if (tst_parse_int(str_timeout, &timeout, 1, INT_MAX)) {
nit: {} brackets are not needed.
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
> tst_brk(TBROK, "Invalid number of timeout '%s'", str_timeout);
> + } else {
> + timeout = callibrate() / 1000;
> + }
> tst_set_max_runtime(timeout);
> }
More information about the ltp
mailing list