Hi,
The routine busy_work_us(), which is the busy work loop function in
realtime test suite is supposed run for as many microseconds as
requested for. However, I have observed that it runs too fast on some
hardware. I looked at the code and saw that we are statically setting
the loop counters, which means the duration of the busy loop varies
with the cpu speed. Further, the busy loop is affected by compiler
optimizations. On some hardware it provides only 50% of requested
delay, whereas with -O3, it finishes even faster.
What we need is a method to dynamically tune the delay loop based on the
machine where the test is being run. It should not be affected by
compiler optimizations as well. The following patch does that. It applies
on the latest cvs.
Thanks,
Sripathi.
Signed-off-by: Sripathi Kodi <[EMAIL PROTECTED]>
Acked-by: Chirag <chirag at linux.vnet.ibm.com>
diff -uprN ltp_org/testcases/realtime/include/librttest.h
ltp/testcases/realtime/include/librttest.h
--- ltp_org/testcases/realtime/include/librttest.h 2008-11-20
03:58:01.000000000 -0500
+++ ltp/testcases/realtime/include/librttest.h 2008-11-20 03:58:11.000000000
-0500
@@ -63,7 +63,8 @@ extern int optind, opterr, optopt;
extern char *optarg;
#define _MAXTHREADS 256
-#define ITERS_PER_US 12 /* appropriate for a 2393.174 MHz 64 bit CPU */
+#define CALIBRATE_LOOPS 100000
+unsigned long iters_per_us;
#define NS_PER_MS 1000000
#define NS_PER_US 1000
diff -uprN ltp_org/testcases/realtime/lib/librttest.c
ltp/testcases/realtime/lib/librttest.c
--- ltp_org/testcases/realtime/lib/librttest.c 2008-11-20 03:58:01.000000000
-0500
+++ ltp/testcases/realtime/lib/librttest.c 2008-11-20 03:58:11.000000000
-0500
@@ -82,6 +82,21 @@ void rt_help(void)
printf(" -c Set pass criteria\n");
}
+/* Calibrate the busy work loop */
+void calibrate_busyloop(void)
+{
+ volatile int i = CALIBRATE_LOOPS;
+ nsec_t start, end;
+
+ start = rt_gettime();
+ while (--i > 0) {
+ continue;
+ }
+ end = rt_gettime();
+
+ iters_per_us = (CALIBRATE_LOOPS * NS_PER_US) / (end-start);
+}
+
int rt_init(const char *options, int (*parse_arg)(int option, char *value),
int argc, char *argv[])
{
int use_buffer = 1;
@@ -147,6 +162,8 @@ int rt_init(const char *options, int (*p
if (use_buffer)
buffer_init();
+ calibrate_busyloop();
+
/*
* atexit() order matters here - buffer_print() will be called before
* buffer_fini().
@@ -466,23 +483,18 @@ void *busy_work_ms(int ms)
void *busy_work_us(int us)
{
- int i;
- int scale;
- double pi_scaled;
- double pi_value;
+ volatile int i;
nsec_t start, now;
int delta; /* time in us */
- volatile double a=16, b=1.0, c=5.0, d=4, e=1.0, f=239.0;
- scale = us * ITERS_PER_US;
- pi_scaled = 0;
+ i = us * iters_per_us;
+
start = rt_gettime();
- for (i = 0; i < scale; i++) {
- double pi = a*atan(b/c) - d*atan(e/f);
- pi_scaled += pi;
+ while (--i > 0) {
+ continue;
}
- pi_value = pi_scaled / scale;
now = rt_gettime();
+
delta = (now - start)/NS_PER_US;
/* uncomment to tune to your machine */
/* printf("busy_work_us requested: %dus actual: %dus\n", us, delta);
*/
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list