[lwip 2/2] Move and rename sys_arch_data_sync_barier()

Pavel Pisa ppisa4lists at pikron.com
Wed Mar 29 11:40:45 UTC 2023


Hello Sebastian,

On Friday 24 of March 2023 11:21:57 Sebastian Huber wrote:
> Hello Pavel,
>
> On 18.03.23 01:04, Pavel Pisa wrote:
> > As for
> >
> > +static inline void
> > +tms570_data_sync_barier(void)
> > +{
> > +#ifdef __arm__
> > +  _ARM_Data_synchronization_barrier();
> > +#endif
> > +}
> >
> > it is OK but may it be not ideal, because more drivers could require
> > write buffers and instructions memory access order synchronization.
> > We have added that definition to ports/os/rtems/arch/sys_arch.h
> >
> > #ifndef __rtems__
> > static inline sys_prot_t
> > sys_arch_protect(void)
> > {
> >    sys_prot_t pval;
> >
> >    rtems_interrupt_disable(pval);
> >    return pval;
> > }
> >
> > static inline void
> > sys_arch_unprotect(sys_prot_t pval)
> > {
> >    rtems_interrupt_enable(pval);
> > }
> >
> > static inline void
> > sys_arch_data_sync_barier(void){
> >    _ARM_Data_synchronization_barrier();
> > }
> > #else
> >
> > as the generic solution when to allow same drivers to be used
> > with different architectures. There can be more drivers requiring
> > such protection.
>
> ok, I will keep the sys_arch_data_sync_barier(). What I don't understand
> is why this stuff is under #ifndef __rtems__ (NOT defined __rtems__).

this is more complex, I need to refresh my memory. We have been using
uLAN OMK fork of LwIP code code in system less, RTEMS and FreeRTOS
setup.

On simple setups, as is FreeRTOS, the sys_arch_protect()
and sys_arch_unprotect() enables and disables interrupts

https://gitlab.com/pikron/sw-base/lwip/-/blob/omk-devel/ports/os/freertos/arch/sys_arch.h#L103

The same change has been made done for RTEMS by bulk change

https://gitlab.com/pikron/sw-base/lwip/-/blob/omk-devel/ports/os/rtems/arch/sys_arch.h#L103

But solution with IRQ disable only could not work on SMP system.

https://git.rtems.org/rtems-lwip/tree/uLan/ports/os/rtems/arch/sys_arch.c#n371

There is patch by Kinsey Moore which correct code to be safe for SMP
and switches rtems_interrupt_disable() to 

pval = _Thread_Dispatch_disable();
+  rtems_recursive_mutex_lock( &sys_arch_lock );

https://git.rtems.org/rtems-lwip/commit/uLan/ports/os/rtems/arch/sys_arch.c?id=c3b8ce71c4897be9984e555d8f1042e273edaa35

and later to

rtems_recursive_mutex_lock( &sys_arch_lock );

which are correct if the interrupt is never called directly into LwIP
driver but only through worker thread wakeup.

So in actual header file, the part which is under  #ifndef __rtems__
should read as use interrupt disable on generic system
but on RTEMS define declare functions prototypes and actual
implementation is in os/rtems/arch/sys_arch.c and for case of
use of the drivers over worker thread is correct.

But if I remember well then actual protect mechanism
should be used minimally if the driver uses thread
model..

So generally, the part in #ifndef __rtems__ in header file
can be moved away, the decalartions without functions body
are enough.

We need to resolve license update in the files and get
rid of uLAN directory and I hope that it can be cleaned
up. I would like to test code on TMS570LS3137 when I find
time and on TMS570LC43 one day...

Best wishes,

Pavel




More information about the devel mailing list