Hi, The pass criterion in pi_perf test case is wrong. It compares the minimum amount of time taken by the low priority thread with the maximum amount of time taken by the high priority thread to calculate the PI delay. Obviously, these min and max don't necessarily happen in the same iteration, resulting in a number of false failures. The correct way is to compare the time taken by low and high priority threads in each iteration and then find the maximum delay experienced by high priority thread across the iterations. This patch implements the change. Additionally, this patch removes lock_wait_dat array, which is not needed anymore as well as makes a couple of messages easier to understand.
This patch changes the messages displayed by this test case slightly. They look like the following now: Low prio thread started High prio thread started Busy 0 started Busy 1 started Busy 2 started Busy 3 started Time taken for high prio thread to get the lock once released by low prio thread Min delay = 10 us Max delay = 36 us Average delay = 17.06 us Standard Deviation = 8.11 us Quantiles: 99.0% < 36 Criteria: High prio lock wait time < (Low prio lock held time + 200 us) Result: PASS I have tested this by running 1000 iterations of pi_perf test on a couple of machines. Thanks, Sripathi. --- realtime: Fix the pass criterion of pi_perf test case. Signed-off-by: Sripathi Kodi <[email protected]> Acked-by: Will Schmidt <[email protected]> Acked-by: Gowrishankar <[email protected]> diff -uprN ltp_cvs_3jul_org/testcases/realtime/func/pi_perf/pi_perf.c ltp_cvs_3jul/testcases/realtime/func/pi_perf/pi_perf.c --- ltp_cvs_3jul_org/testcases/realtime/func/pi_perf/pi_perf.c 2009-07-03 12:21:41.000000000 +0530 +++ ltp_cvs_3jul/testcases/realtime/func/pi_perf/pi_perf.c 2009-07-03 12:24:44.000000000 +0530 @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright © International Business Machines Corp., 2007, 2008 + * Copyright © International Business Machines Corp., 2007, 2008, 2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,6 +36,8 @@ * * HISTORY * 2007-Nov-20: Initial version by Sripathi Kodi <[email protected]> + * 2009-Jul-03: Pass criteria corrected by Sripathi Kodi + * <[email protected]> * *****************************************************************************/ @@ -71,9 +73,9 @@ static unsigned int high_work_time = DEF static unsigned int busy_work_time; static int num_busy = -1; -nsec_t low_unlock, high_get_lock; +nsec_t low_unlock, max_pi_delay; -stats_container_t lock_wait_dat, low_dat, cpu_delay_dat; +stats_container_t low_dat, cpu_delay_dat; stats_container_t cpu_delay_hist; stats_quantiles_t cpu_delay_quantiles; @@ -165,10 +167,9 @@ void * low_prio_thread(void *arg) void * high_prio_thread(void *arg) { - nsec_t high_start, high_spent, high_end; + nsec_t high_start, high_end, high_get_lock; unsigned int i; - stats_container_init(&lock_wait_dat, iterations); stats_container_init(&cpu_delay_dat, iterations); stats_container_init(&cpu_delay_hist, HIST_BUCKETS); stats_quantiles_init(&cpu_delay_quantiles, (int)log10(iterations)); @@ -184,14 +185,11 @@ void * high_prio_thread(void *arg) high_start = rt_gettime(); pthread_mutex_lock(&lock); high_end = rt_gettime(); - high_spent = high_end - high_start; high_get_lock = high_end - low_unlock; busy_work_ms(high_work_time); pthread_mutex_unlock(&lock); - lock_wait_dat.records[i].x = i; - lock_wait_dat.records[i].y = high_spent / NS_PER_US; cpu_delay_dat.records[i].x = i; cpu_delay_dat.records[i].y = high_get_lock / NS_PER_US; @@ -206,14 +204,16 @@ void * high_prio_thread(void *arg) "Latency (us)", "Samples", &cpu_delay_hist, "steps"); printf("Time taken for high prio thread to get the lock once released by low prio thread\n"); - printf("Min wait time = %ld us\n", stats_min(&cpu_delay_dat)); - printf("Max wait time = %ld us\n", stats_max(&cpu_delay_dat)); - printf("Average wait time = %4.2f us\n", stats_avg(&cpu_delay_dat)); + printf("Min delay = %ld us\n", stats_min(&cpu_delay_dat)); + printf("Max delay = %ld us\n", stats_max(&cpu_delay_dat)); + printf("Average delay = %4.2f us\n", stats_avg(&cpu_delay_dat)); printf("Standard Deviation = %4.2f us\n", stats_stddev(&cpu_delay_dat)); printf("Quantiles:\n"); stats_quantiles_calc(&cpu_delay_dat, &cpu_delay_quantiles); stats_quantiles_print(&cpu_delay_quantiles); + max_pi_delay = stats_max(&cpu_delay_dat); + return NULL; } @@ -261,13 +261,11 @@ int main(int argc, char *argv[]) } join_threads(); - printf("Low prio lock held time (min) = %ld us\n", stats_min(&low_dat)); - printf("High prio lock wait time (max) = %ld us\n", stats_max(&lock_wait_dat)); printf("Criteria: High prio lock wait time < " "(Low prio lock held time + %d us)\n", (int)pass_criteria); ret = 0; - if (stats_max(&lock_wait_dat) > stats_min(&low_dat) + (int)pass_criteria) + if (max_pi_delay > pass_criteria) ret = 1; printf("Result: %s\n", ret ? "FAIL" : "PASS"); ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
