Darren Hart wrote:
> Subrata Modak wrote:
>>
>>
>> Hi,
>>> We have seen that prio_preempt testcase that is part of realtime 
>>> tests occasionally hangs. This can be easily recreated on a 8-cpu 
>>> system, but can be recreated on a 4-cpu system as well when run for 
>>> a number of iterations.
>>>
>>> The problem occurs because the first worker thread sometimes fails 
>>> to call cond_wait on the condvar through which the master thread 
>>> signals it to start. Since the first thread needs to start the chain 
>>> of signalling from then on, all other threads just sit in a 
>>> cond_wait without ever being woken up.
>>>
>>> The fix is to have a barrier to ensure that the first worker thread 
>>> doesn't miss the cond_signal.
>>>
>>> I have tested this patch by running 10s of thousands of iterations 
>>> of the testcase. Without the patch I can recreate the problem fairly
>>> easily.
>>>
>>> Thanks,
>>> Sripathi.
>>>
>>> Signed-off-by: Sripathi Kodi <[EMAIL PROTECTED]>
>
> Acked-by: Darren Hart <[EMAIL PROTECTED]>
Thanks for the Ack. This has been merged.

Regards--
Subrata
>
>>>   
>>
>> Over to the Real Time Linux Community for comments :-)
>>
>> Regards--
>> Subrata
>>> --- 
>>> ltp-full-20080229/testcases/realtime/func/prio-preempt/prio-preempt.c.org   
>>>  
>>>
>>> 2008-03-12 22:10:05.000000000 +0530
>>> +++ 
>>> ltp-full-20080229/testcases/realtime/func/prio-preempt/prio-preempt.c   
>>> 2008-03-12 22:14:02.000000000 +0530
>>> @@ -90,6 +90,8 @@ static int t_after_wait[NUM_WORKERS];
>>>  static int ret = 0;
>>>  static int run_jvmsim=0;
>>>
>>> +pthread_barrier_t barrier;
>>> +
>>>  void usage(void)
>>>  {
>>>      rt_help();
>>> @@ -184,6 +186,8 @@ void *worker_thread(void* arg)
>>>
>>>      /* block */
>>>      rc = pthread_mutex_lock(&mutex[tid]);
>>> +    if (tid == 0)
>>> +        pthread_barrier_wait(&barrier);
>>>      rc = pthread_cond_wait(&cond[tid], &mutex[tid]);
>>>      rc = pthread_mutex_unlock(&mutex[tid]);
>>>
>>> @@ -234,6 +238,8 @@ void *master_thread(void* arg)
>>>  {
>>>      int i, pri_boost;
>>>
>>> +    pthread_barrier_init(&barrier, NULL, 2);
>>> +
>>>      /* start interrupter thread */
>>>      if (int_threads) {
>>>          pri_boost = 90;
>>> @@ -270,6 +276,9 @@ void *master_thread(void* arg)
>>>      while (threads_running < NUM_WORKERS)
>>>          usleep(100);
>>>
>>> +    /* Ensure the first worker has called cond_wait */
>>> +    pthread_barrier_wait(&barrier);
>>> +
>>>      printf("Signaling first thread\n");
>>>      pthread_mutex_lock(&mutex[0]);
>>>      pthread_cond_signal(&cond[0]);
>>>
>>>   
>>
>>
>
>



-------------------------------------------------------------------------
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