From 70b50ff98a14ef8480e1d96eb5806e14b9d8e731 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 9 Jul 2019 13:24:38 +0200 Subject: EPOCH(9): Avoid inline functions FreeBSD changed the epoch_enter() and epoch_exit() inline functions into proper functions after a performance analysis to avoid code bloat. --- rtemsbsd/include/sys/epoch.h | 29 +++-------------------------- rtemsbsd/rtems/rtems-kernel-epoch.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/rtemsbsd/include/sys/epoch.h b/rtemsbsd/include/sys/epoch.h index af36c90e..4babb4b4 100644 --- a/rtemsbsd/include/sys/epoch.h +++ b/rtemsbsd/include/sys/epoch.h @@ -36,7 +36,6 @@ #include #include #include -#include #endif #include #include @@ -100,7 +99,10 @@ SYSINIT(epoch_##name, SI_SUB_TUNABLES, SI_ORDER_THIRD, \ void _bsd_epoch_init(epoch_t epoch, uintptr_t pcpu_record_offset, int flags); +void epoch_enter(epoch_t epoch); void epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et); + +void epoch_exit(epoch_t epoch); void epoch_exit_preempt(epoch_t epoch, epoch_tracker_t et); void epoch_wait(epoch_t epoch); @@ -113,30 +115,5 @@ int _bsd_in_epoch(epoch_t epoch); #define in_epoch(epoch) _bsd_in_epoch(epoch) #define in_epoch_verbose(epoch, dump_onfail) _bsd_in_epoch(epoch) -#define EPOCH_GET_RECORD(cpu_self, epoch) PER_CPU_DATA_GET_BY_OFFSET( \ - cpu_self, struct epoch_record, epoch->e_pcpu_record_offset) - -static __inline void -epoch_enter(epoch_t epoch) -{ - Per_CPU_Control *cpu_self; - struct epoch_record *er; - - cpu_self = _Thread_Dispatch_disable(); - er = EPOCH_GET_RECORD(cpu_self, epoch); - ck_epoch_begin(&er->er_record, NULL); -} - -static __inline void -epoch_exit(epoch_t epoch) -{ - Per_CPU_Control *cpu_self; - struct epoch_record *er; - - cpu_self = _Per_CPU_Get(); - er = EPOCH_GET_RECORD(cpu_self, epoch); - ck_epoch_end(&er->er_record, NULL); - _Thread_Dispatch_enable(cpu_self); -} #endif /* _KERNEL */ #endif /* _SYS_EPOCH_H_ */ diff --git a/rtemsbsd/rtems/rtems-kernel-epoch.c b/rtemsbsd/rtems/rtems-kernel-epoch.c index 48c0cf64..c7682a6d 100644 --- a/rtemsbsd/rtems/rtems-kernel-epoch.c +++ b/rtemsbsd/rtems/rtems-kernel-epoch.c @@ -42,9 +42,13 @@ #include #include #include +#include #include #include +#define EPOCH_GET_RECORD(cpu_self, epoch) PER_CPU_DATA_GET_BY_OFFSET( \ + cpu_self, struct epoch_record, epoch->e_pcpu_record_offset) + EPOCH_DEFINE(_bsd_global_epoch_preempt, EPOCH_PREEMPT); EPOCH_DEFINE(_bsd_global_epoch, 0); @@ -175,6 +179,29 @@ epoch_sysinit(void) } SYSINIT(epoch, SI_SUB_TUNABLES, SI_ORDER_SECOND, epoch_sysinit, NULL); +void +epoch_enter(epoch_t epoch) +{ + Per_CPU_Control *cpu_self; + struct epoch_record *er; + + cpu_self = _Thread_Dispatch_disable(); + er = EPOCH_GET_RECORD(cpu_self, epoch); + ck_epoch_begin(&er->er_record, NULL); +} + +void +epoch_exit(epoch_t epoch) +{ + Per_CPU_Control *cpu_self; + struct epoch_record *er; + + cpu_self = _Per_CPU_Get(); + er = EPOCH_GET_RECORD(cpu_self, epoch); + ck_epoch_end(&er->er_record, NULL); + _Thread_Dispatch_enable(cpu_self); +} + void epoch_enter_preempt(epoch_t epoch, epoch_tracker_t et) { @@ -266,12 +293,16 @@ epoch_block_handler_preempt(struct ck_epoch *g __unused, { struct epoch_record *er; Per_CPU_Control *cpu_self; - uint32_t cpu_self_index; struct epoch_tracker_mutex etm; +#ifdef RTEMS_SMP + uint32_t cpu_self_index; +#endif er = __containerof(cr, struct epoch_record, er_record); cpu_self = _Per_CPU_Get(); +#ifdef RTEMS_SMP cpu_self_index = _Per_CPU_Get_index(cpu_self); +#endif rtems_mutex_init(&etm.etm_mtx, "epoch"); etm.etm_record = er; -- cgit v1.2.3