From: Subrata M. <su...@li...> - 2008-11-25 13:38:09
|
On Mon, 2008-11-24 at 22:00 +0530, Sripathi Kodi wrote: > Hi, > > The test case gtod_latency in realtime causes soft lockups on some > machines. This is because the test hogs the cpus for a long time, > because it's main loop runs at > SCHED_FIFO, 99. We have seen soft lockups mainly on LS20 machines > (x86_64, Opterons). > > The following patch introduces a sleep after some iterations of the > test. This ensures that the test doesn't hog the cpu completely and > hence avoids soft lockups. > > Testing done: > Compiled with the patch and observed that the soft lockups are gone. > Also observed that the latencies are not affected. In fact latencies > improve with this patch on most hardware. > > Changelog: > * Introduce periodic sleeps in the busy loop of gtod_latency to avoid soft lockups. > > Signed-off-by: Sripathi Kodi <sri...@in...> > Acked-by: John Stultz <joh...@us...> Thanks. Regards-- Subrata > > diff -uprN ltp_cvs_24nov_org/testcases/realtime/func/gtod_latency/gtod_latency.c ltp_cvs_24nov/testcases/realtime/func/gtod_latency/gtod_latency.c > --- ltp_cvs_24nov_org/testcases/realtime/func/gtod_latency/gtod_latency.c 2008-11-24 21:16:20.000000000 +0530 > +++ ltp_cvs_24nov/testcases/realtime/func/gtod_latency/gtod_latency.c 2008-11-24 21:25:33.000000000 +0530 > @@ -216,7 +216,7 @@ struct timespec stop_data[ITERATIONS]; > > int main(int argc, char *argv[]) > { > - int i, err; > + int i, j, k, err; > unsigned long long delta; > unsigned long long max, min; > struct sched_param param; > @@ -262,9 +262,15 @@ int main(int argc, char *argv[]) > latency_trace_enable(); > latency_trace_start(); > } > - for (i = 0; i < ITERATIONS; i++) { > - clock_gettime(CLOCK_MONOTONIC,&start_data[i]); > - clock_gettime(CLOCK_MONOTONIC,&stop_data[i]); > + /* This loop runs for a long time, hence can cause soft lockups. > + Calling sleep periodically avoids this. */ > + for (i=0; i<1000; i++) { > + for (j=0; j < ITERATIONS/1000; j++) { > + k = (i * ITERATIONS/1000) + j; > + clock_gettime(CLOCK_MONOTONIC,&start_data[k]); > + clock_gettime(CLOCK_MONOTONIC,&stop_data[k]); > + } > + usleep(1000); > } > for (i = 0; i < ITERATIONS; i++) { > delta = timespec_subtract(&start_data[i], &stop_data[i]); |