From: Subrata M. <su...@li...> - 2008-03-26 09:49:36
|
Forwarding this to Ankita, as she was not in the Cc/To list ;-) Regards-- Subrata -------- Forwarded Message -------- From: Sebastien Dugue <seb...@bu...> To: su...@li... Cc: Jean-Pierre Dion <jea...@bu...>, gilles.carry <gil...@bu...> Subject: Re: Fwd: [LTP] Fixes to realtime/func/pi_perf testcase Date: Wed, 26 Mar 2008 10:32:32 +0100 Hi Subrata, Ankita, On Tue, 25 Mar 2008 18:57:07 +0530 Subrata Modak <su...@li...> wrote: > Sebastien/Jean/Gilles, > > Can you kindly provide your comments on this Patch ? > > Regards-- > Subrata > > Hello, > > The following patch fixes a minor issue with pi_perf testcase > (testcases/realtime/func/). The wait_dat is intended to measure the > amount of time it took for the high priority thread to actually obtain > the lock from the time it was released by the low priority thread. The > patch fixes this computation to measure it more accurately. The > PASS/FAIL computation is unaffected. > > Also, the patch modifies the variable names to make them more intuitive. > > Testing done: Compile tested and run successfully without error. Your patch does not apply cleanly on the latest cvs, see below hunk #3. Furthermore it is rooted at ltp/testcases/realtime, it would be better if it were based on the ltp root to avoid integration problems. Functionaly wise, it looks sane to me. Sebastien. > > > Signed-off-by: Ankita Garg <an...@in...> > Acked-by: Sripathi Kodi <sri...@in...> > > Index: realtime/func/pi_perf/pi_perf.c > =================================================================== > --- realtime.orig/func/pi_perf/pi_perf.c 2008-03-04 16:23:14.000000000 +0530 > +++ realtime/func/pi_perf/pi_perf.c 2008-03-04 17:13:36.000000000 +0530 > @@ -74,9 +74,11 @@ > static unsigned int busy_work_time; > static int num_busy = -1; > > -stats_container_t high_dat, low_dat, wait_dat; > -stats_container_t wait_hist; > -stats_quantiles_t wait_quantiles; > +nsec_t low_unlock, high_get_lock; > + > +stats_container_t lock_wait_dat, low_dat, cpu_delay_dat; > +stats_container_t cpu_delay_hist; > +stats_quantiles_t cpu_delay_quantiles; > > void usage(void) > { > @@ -145,7 +147,8 @@ > > low_start = rt_gettime(); > busy_work_ms(low_work_time); > - low_hold = rt_gettime() - low_start; > + low_unlock = rt_gettime(); > + low_hold = low_unlock - low_start; > > pthread_mutex_unlock(&lock); > > @@ -165,13 +168,13 @@ > > void * high_prio_thread(void *arg) > { > - nsec_t high_start, high_spent; > + nsec_t high_start, high_spent, high_end; > unsigned int i; > > - stats_container_init(&high_dat, iterations); > - stats_container_init(&wait_dat, iterations); > - stats_container_init(&wait_hist, HIST_BUCKETS); > - stats_quantiles_init(&wait_quantiles, log10(iterations)); In latest cvs, this is (int)log10(iterations) > + 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, log10(iterations)); > > printf("High prio thread started\n"); > > @@ -183,33 +186,36 @@ > > high_start = rt_gettime(); > pthread_mutex_lock(&lock); > - high_spent = rt_gettime() - high_start; > + 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); > > - high_dat.records[i].x = i; > - high_dat.records[i].y = high_spent / NS_PER_US; > - wait_dat.records[i].x = i; > - wait_dat.records[i].y = high_dat.records[i].y - low_dat.records[i].y; > + 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; > > /* Wait for all threads to finish this iteration */ > pthread_barrier_wait(&bar2); > } > > - stats_hist(&wait_hist, &wait_dat); > + stats_hist(&cpu_delay_hist, &cpu_delay_dat); > stats_container_save("samples", "pi_perf Latency Scatter Plot", > - "Iteration", "Latency (us)", &wait_dat, "points"); > + "Iteration", "Latency (us)", &cpu_delay_dat, "points"); > stats_container_save("hist", "pi_perf Latency Histogram", > - "Latency (us)", "Samples", &wait_hist, "steps"); > + "Latency (us)", "Samples", &cpu_delay_hist, "steps"); > > - printf("Min wait time = %ld us\n", stats_min(&wait_dat)); > - printf("Max wait time = %ld us\n", stats_max(&wait_dat)); > - printf("Average wait time = %4.2f us\n", stats_avg(&wait_dat)); > - printf("Standard Deviation = %4.2f us\n", stats_stddev(&wait_dat)); > + 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("Standard Deviation = %4.2f us\n", stats_stddev(&cpu_delay_dat)); > printf("Quantiles:\n"); > - stats_quantiles_calc(&wait_dat, &wait_quantiles); > - stats_quantiles_print(&wait_quantiles); > + stats_quantiles_calc(&cpu_delay_dat, &cpu_delay_quantiles); > + stats_quantiles_print(&cpu_delay_quantiles); > > return NULL; > } > @@ -253,12 +259,12 @@ > > 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(&high_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", THRESHOLD); > > ret = 0; > - if (stats_max(&high_dat) > stats_min(&low_dat) + THRESHOLD) > + if (stats_max(&lock_wait_dat) > stats_min(&low_dat) + THRESHOLD) > ret = 1; > > printf("Result: %s\n", ret ? "FAIL" : "PASS"); > > > > |