From: Robert W. <ro...@us...> - 2002-09-10 15:13:07
|
FYI. Patch applied to CVS and included in this month's release. - Robbie Robert V. Williamson <ro...@us...> Linux Test Project IBM Linux Technology Center Phone: (512) 838-9295 T/L: 638-9295 Fax: (512) 838-4603 http://ltp.sourceforge.net Andrea Arcangeli <an...@su...> To: ltp...@li... Sent by: cc: ltp...@li...ur Subject: [LTP] nanosleep02 ceforge.net 09/10/2002 02:09 AM I was used to get reports of nanosleep02 failing on -aa, so I had a look and as expected they were false positives. So I fixed the problems in the testcase, and now I verify also for a good precision of the order of the usec, to ensure that no userspace live lock can happen under a flood of signals (i.e. with glibc). The live lock can happen with a low precision nanosleep rem field, because to be correct it has to approximate the remaining time for excess, so with mainline it would keep returning that 10msec are missing (or 1msec with 2.4) and one can get 1 signal every msec generating the userspace live lock in nanosleep restart. So I'm afraid the new testcase will work successfully only on -aa based kernels. To allow mainline to pass the test too, increasing USEC_PRECISION to 11000 (11msec) should be enough I guess, I didn't tested it. but I wouldn't recommend to increase the allowed usec precision over 100usec to catch implementations that can introduce userspace live locks under heavy signal handling (again, of the order of one signal every 10msec, or 1msec with 2.5). The fix on the kernel side against mainline that will allow the new testcase to pass successfully is here: http://www.us.kernel.org/pub/linux/kernel/people/andrea/kernels/v2.4/2.4.20pre5aa2/00_nanosleep-6 And here it is the patch against ltp mainline. I would suggest to check it into the cvs. Thanks, Index: nanosleep02.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/nanosleep/nanosleep02.c,v retrieving revision 1.1 diff -u -r1.1 nanosleep02.c --- nanosleep02.c 27 Aug 2001 22:15:14 -0000 1.1 +++ nanosleep02.c 10 Sep 2002 06:34:23 -0000 @@ -87,14 +87,26 @@ void cleanup(); /* cleanup function for the test */ void sig_handler(); /* signal catching function */ +/* + * Define here the "rem" precision in microseconds, + * Various implementations will provide different + * precisions. The -aa tree provides up to usec precision. + * NOTE: all the trees that don't provide a precision of + * the order of the microseconds are subject to an userspace + * live lock condition with glibc under a flood of signals, + * the "rem" field would never change without the increased + * usec precision in the -aa tree. + */ +#define USEC_PRECISION 100 + int main(int ac, char **av) { int lc; /* loop counter */ char *msg; /* message returned from parse_opts */ pid_t cpid; /* Child process id */ - time_t otime; /* time before child execution suspended */ - time_t ntime; /* time after child resumes execution */ + struct timeval otime; /* time before child execution suspended */ + struct timeval ntime; /* time after child resumes execution */ int status; /* child exit status */ /* Parse standard options given to run the test. */ @@ -122,8 +134,10 @@ } if (cpid == 0) { /* Child process */ + unsigned long req, rem, before, after, elapsed; /* usec */ + /* Note down the current time */ - time(&otime); + gettimeofday(&otime, NULL); /* * Call nanosleep() to suspend child process * for specified time 'tv_sec'. @@ -134,7 +148,7 @@ TEST(nanosleep(&timereq, &timerem)); /* time after child resumes execution */ - time(&ntime); + gettimeofday(&ntime, NULL); /* * Check whether the remaining sleep of child updated @@ -142,16 +156,21 @@ * The time remaining should be equal to the * Total time for sleep - time spent on sleep bfr signal */ - if (timerem.tv_sec != (timereq.tv_sec - - (ntime - otime))) { - tst_resm(TFAIL, "Remaining sleep time doesn't " - "match with the expected %d time", - (timereq.tv_sec - (ntime - otime))); + req = timereq.tv_sec * 1000000 + timereq.tv_nsec / 1000; + rem = timerem.tv_sec * 1000000 + timerem.tv_nsec / 1000; + before = otime.tv_sec * 1000000 + otime.tv_usec; + after = ntime.tv_sec * 1000000 + ntime.tv_usec; + elapsed = after - before; + + if (rem - (req - elapsed) > USEC_PRECISION) { + tst_resm(TFAIL, "Remaining sleep time %lu usec doesn't " + "match with the expected %lu usec time", + rem, (req - elapsed)); exit(1); } /* Record the time before suspension */ - time(&otime); + gettimeofday(&otime, NULL); /* * Invoke nanosleep() again to suspend child @@ -161,7 +180,7 @@ TEST(nanosleep(&timereq, &timerem)); /* Record the time after suspension */ - time(&ntime); + gettimeofday(&ntime, NULL); /* check return code of nanosleep() */ if (TEST_RETURN == -1) { @@ -182,7 +201,7 @@ * sleep time specified by 'timerem' * structure. */ - if ((ntime - otime) != timereq.tv_sec) { + if ((ntime.tv_sec - otime.tv_sec) != timereq.tv_sec) { tst_resm(TFAIL, "Child execution not " "suspended for %d seconds", timereq.tv_sec); Andrea ------------------------------------------------------- This sf.net email is sponsored by: OSDN - Tired of that same old cell phone? Get a new here for FREE! https://www.inphonic.com/r.asp?r=sourceforge1&refcode1=vs3390 _______________________________________________ Ltp-list mailing list Ltp...@li... https://lists.sourceforge.net/lists/listinfo/ltp-list |