Hi Gilles,

Gilles Carry wrote:
> This flag is set by timer_thread when the sampling is finished.
> This fixes this deadlock/race condition:
>       1. busy threads run until main thread exits
>       2. main thread waits for timer_thread to finish
>       3. timer_thread is writing samples results into
>          files and waits for a filesystem global lock to be released
>       4. sync threads (kjournald, pdflush) with non-rt prio hold
>          the above mentioned lock and cannot finish their job because
>          cpu is hogged by busy threads.
>
> Solution: tell busy threads to quit before writing to disk.
>
> Signed-off-by: Gilles Carry <[EMAIL PROTECTED]>
> Cc: Darren Hart <[EMAIL PROTECTED]>
> Cc: Tim Chavez <[EMAIL PROTECTED]>
>   
I first ran the "hrtimer-prio" test case without this patch and could 
get the system to hang repeatedly and frequently (nearly every attempt, 
actually).  After applying this patch and running the test about 100,000 
times, I saw no more hangs.  Thanks, Gilles!

Acked-by: Timothy R. Chavez <[EMAIL PROTECTED]>

> ---
>  .../realtime/func/hrtimer-prio/hrtimer-prio.c      |    4 +++-
>  1 files changed, 3 insertions(+), 1 deletions(-)
>
> diff --git a/testcases/realtime/func/hrtimer-prio/hrtimer-prio.c 
> b/testcases/realtime/func/hrtimer-prio/hrtimer-prio.c
> index f22ca83..9e051aa 100644
> --- a/testcases/realtime/func/hrtimer-prio/hrtimer-prio.c
> +++ b/testcases/realtime/func/hrtimer-prio/hrtimer-prio.c
> @@ -63,6 +63,7 @@ static int busy_time = DEF_BUSY_TIME;
>  static int iterations = DEF_ITERATIONS;
>  static unsigned long criteria = DEF_CRITERIA;
>  static int busy_threads;
> +static int busy_exit = 0;
>
>  static stats_container_t dat;
>  static atomic_t busy_threads_started;
> @@ -117,7 +118,7 @@ int parse_args(int c, char *v)
>  void *busy_thread(void *thread)
>  {
>       atomic_inc(&busy_threads_started);
> -     while (1) {
> +     while (!busy_exit) {
>               busy_work_ms(busy_time);
>               sched_yield();
>       }
> @@ -146,6 +147,7 @@ void *timer_thread(void *thread)
>               max_delta = MAX(max_delta, delta_us);
>               min_delta = (i == 0) ? delta_us : MIN(min_delta, delta_us);
>       }
> +     busy_exit = 1; // Tell busy_threads to exit.
>       return NULL;
>  }
>
>   
-tim

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to