Actually, let me correct my previous statement that mutexs and semaphores
need critical sections, I think they just need memory barriers. We can look
at how the Linux kernel does it to double check our knowledge. Here’s s
quick stack overflow link, for what it’s worth.
https://stackoverflow.com/questions/33754443/is-linux-mutex-lock-implemented-using-memory-barrier



*Daniel Appiagyei | Embedded Software Engineer *Email:
daniel.appiag...@braincorp.com
<bog...@braincorporation.com>*Brain*
* Corp™ *10182 Telesis Ct, Suite 100
San Diego, CA 92121

(858)-689-7600
www.braincorp.com


On Wed, Aug 28, 2024 at 6:15 PM Daniel Appiagyei <
daniel.appiag...@braincorp.com> wrote:

> Hi Gregory, thank you for the quick response!
>
> RE: 'lockcount' needing to be in a critical section:
> That's good information to know, I wasn't aware before. I'm
> searching nuttx for exact matches of the string 'sched_lock();' to find
> occurrences and seeing this is not always done. Yeah a critical section (
> up_irq_save
> <https://github.com/apache/nuttx/blob/master/arch/arm/include/armv7-m/irq.h#L405>),
> at least on arm arch, calls get_base_pri()
> <https://github.com/apache/nuttx/blob/master/arch/arm/include/armv7-m/irq.h#L317-L326>,
> which does have a memory barrier so that memory will be coherent throughout
> the entire system.
>
> > All places where the lockcount is *incremented* should be within a
> critical section
> Emphasis mine, I believe all places where lockcount is written OR read
> require atomicity and the most up-to-date value in memory with respect to
> another, so we'd need a critical section in those cases too.
> I like the idea of adding a DEBUGASSERT, my only fear is that others users
> such as myself have used 'sched_lock()' in their code and will be met with
> a runtime crash when they pull in these changes.
>
> > If we are in a critical section, then other threads
> > will not run at least until the thread blocks or terminates (even in SMP
> > mode).
>
> Yeah, I agree now, the critical section should solve this since it has the
> barrier i mentioned above.
>
> On a similar note, I believe all mutex and semaphore functions should have
> a critical section as well. E.g., when nxmutex_is_hold()
> <https://github.com/apache/nuttx/blob/master/libs/libc/misc/lib_mutex.c#L147>
> checks mutex->holder, it must absolutely have the latest up-to-date value
> to verify ownership, otherwise there is a bug. What are your thoughts on
> this?
>
> On Wed, Aug 28, 2024 at 5:28 PM Gregory Nutt <spudan...@gmail.com> wrote:
>
>>
>> On 8/28/2024 6:14 PM, Daniel Appiagyei wrote:
>> > Hi all,
>> > Looking at sched_lock.c (
>> >
>> https://github.com/apache/nuttx/blob/master/sched/sched/sched_lock.c#L187
>> ),
>> > , specifically at the non-SMP sched_lock() implementation, how do we
>> ensure
>> > that:
>> > 1. There's no data-race when incrementing the lock count:
>> > 'rtcb->lockcount++;', (given that no mutex or critical section is
>> > surrounding that code so other tasks or IRQs are free to interrupt the
>> > assembly instructions), and
>>
>> All places where the lockcount is incremented should be within a
>> critical section.   I believe that is true.  But if you find place where
>> that is not true, that would indeed be a bug.
>>
>> Perhaps a DEBUGASSERTion that we are in a critical section before
>> incrementing lockcount would be a good verification of this belief.
>>
>> > 2. The scheduler is 100% prevented from allowing a different task to run
>> > after lock_count is incremented given that we don't use a data memory
>> > barrier or data synchronization barrier to ensure the write to
>> 'lock_count'
>> > is visible to the rest of the system in memory?
>> Adding a barrier might be a good idea, although I have never seen this
>> to be an issue.  If we are in a critical section, then other threads
>> will not run at least until the thread blocks or terminates (even in SMP
>> mode).
>> > For 1, see cppreference 'Threads and data races' on data races being
>> > undefined behavior (
>> https://en.cppreference.com/w/c/language/memory_model).
>> >
>> > Best,
>> > Daniel
>
>
>
> --
>
>
> *Daniel Appiagyei | Embedded Software Engineer *Email:
> daniel.appiag...@braincorp.com
> <bog...@braincorporation.com>*Brain*
> * Corp™ *10182 Telesis Ct, Suite 100
> San Diego, CA 92121
>
> (858)-689-7600
> www.braincorp.com
>

Reply via email to