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

>>   
> 
> 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]);
>>
>>   
> 
> 


-- 
Darren Hart
IBM Linux Technology Center
Real-Time Linux Team

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