Is there a data race problem while acquiring a mutex with priority inheritance protocol
Saurabh Gadia
gadia at usc.edu
Fri Jul 24 02:16:23 UTC 2015
As per thread initialization in threadinitialize.c we should acquire
default lock i.e the_thread->Lock.Default. Am I right?
Thanks,
Saurabh Gadia
On Thu, Jul 23, 2015 at 6:58 PM, Saurabh Gadia <gadia at usc.edu> wrote:
> basically every time we try to acquire mutex there should be lock
> acquisition related executing thread.
>
> Thanks,
>
> Saurabh Gadia
>
> On Thu, Jul 23, 2015 at 6:47 PM, Saurabh Gadia <gadia at usc.edu> wrote:
>
>> hi,
>>
>>
>> Scenario:
>> thread t1: current_priority = 5, mutex acquired = m1, m2
>> thread t2: current_priority = 3, mutex_acquired = None
>>
>> flow: thread t1 tries to acquire mutex m3 and thread t2 tries to acquire
>> mutex m1 which is already acquired by thread t1 simultaneously on SMP.
>>
>> Action:
>> thred t1 finds that m3 ->holder==NULL, so following code snippet of
>> coremuteximpl.h executes on one processor:
>>
>> /////
>> RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock_body(
>> CORE_mutex_Control *the_mutex,
>> Thread_Control *executing,
>> ISR_lock_Context *lock_context
>> )
>> {
>> /* disabled when you get here */
>>
>> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
>> if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
>> the_mutex->holder = executing;
>> the_mutex->nest_count = 1;
>> if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
>> _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ){
>>
>> #ifdef __RTEMS_STRICT_ORDER_MUTEX__
>> /* Doesn't this lead to data race. If the executing thread is holder os
>> some other mutex and its priority is promoted by other
>> thread
>> */
>> _Chain_Prepend_unprotected( &executing->lock_mutex,
>> &the_mutex->queue.lock_queue );
>> *the_mutex->queue.priority_before = executing->current_priority;*
>> #endif
>>
>> executing->resource_count++;
>> }
>>
>> if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
>> _Thread_queue_Release( &the_mutex->Wait_queue, lock_context );
>> return 0;
>> }
>>
>>
>> //////
>>
>> And thread t2 tries to acquire m1 and following snippet of
>> threadchangepriority.c executes:
>>
>> /////// (the_thread is holder for mutex m1 and new_priority == priority
>> of thread t2 ==3)
>> lock = _Thread_Lock_acquire( the_thread, &lock_context );
>>
>> /*
>> * For simplicity set the priority restore hint unconditionally since
>> this is
>> * an average case optimization. Otherwise complicated atomic
>> operations
>> * would be necessary. Synchronize with a potential read of the
>> resource
>> * count in the filter function. See also _CORE_mutex_Surrender(),
>> * _Thread_Set_priority_filter() and _Thread_Restore_priority_filter().
>> */
>> the_thread->priority_restore_hint = true;
>> _Atomic_Fence( ATOMIC_ORDER_ACQ_REL );
>>
>> /*
>> * Do not bother recomputing all the priority related information if
>> * we are not REALLY changing priority.
>> */
>> if ( ( *filter )( the_thread, &new_priority, arg ) ) {
>> uint32_t my_generation;
>>
>> my_generation = the_thread->priority_generation + 1;
>> * the_thread->current_priority = new_priority;*
>> the_thread->priority_generation = my_generation;
>>
>> ( *the_thread->Wait.operations->priority_change )(
>> the_thread,
>> new_priority,
>> the_thread->Wait.queue
>> );
>> ////
>>
>> So can interleaving of highlighted code result in data race? From my
>> perspective and from JPF model experience this is a data race and we need
>> to have locking on executing thread and holder thread if it exists for
>> mutex while acquiring any mutex.
>> So for 2nd case when there is already holder we do acquire holder lock by
>> calling *lock = _Thread_Lock_acquire( the_thread, &lock_context ); *in
>> 2nd snippet but we should do the same on executing thread when holder==NULL
>> in 1st code snippet.
>> Am I right? or is there something I am missing?
>>
>> Thanks,
>>
>> Saurabh Gadia
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20150723/3ed6ba0d/attachment-0002.html>
More information about the devel
mailing list