From e90486ab41a4edf045a6153675b6be9dcd422b71 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 11 Apr 2019 15:16:40 +0200 Subject: score: Rework SMP multicast action Use a FIFO list of jobs per processor to carry out the SMP multicast action. Use a done indicator per job to reduce the bus traffic a bit. --- cpukit/include/rtems/score/percpu.h | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'cpukit/include/rtems/score/percpu.h') diff --git a/cpukit/include/rtems/score/percpu.h b/cpukit/include/rtems/score/percpu.h index 27f4e93a46..cd7713db6d 100644 --- a/cpukit/include/rtems/score/percpu.h +++ b/cpukit/include/rtems/score/percpu.h @@ -74,6 +74,8 @@ struct _Thread_Control; struct Scheduler_Context; +struct Per_CPU_Job; + /** * @defgroup PerCPU RTEMS Per CPU Information * @@ -494,6 +496,37 @@ typedef struct Per_CPU_Control { */ Atomic_Uintptr before_multitasking_action; + /** + * @brief FIFO list of jobs to be performed by this processor. + * + * @see _SMP_Multicast_action(). + */ + struct { + /** + * @brief Lock to protect the FIFO list of jobs to be performed by this + * processor. + */ + ISR_lock_Control Lock; + + /** + * @brief Head of the FIFO list of jobs to be performed by this + * processor. + * + * This member is protected by the Per_CPU_Control::Jobs::Lock lock. + */ + struct Per_CPU_Job *head; + + /** + * @brief Tail of the FIFO list of jobs to be performed by this + * processor. + * + * This member is only valid if the head is not @c NULL. + * + * This member is protected by the Per_CPU_Control::Jobs::Lock lock. + */ + struct Per_CPU_Job **tail; + } Jobs; + /** * @brief Indicates if the processor has been successfully started via * _CPU_SMP_Start_processor(). @@ -710,6 +743,13 @@ bool _Per_CPU_State_wait_for_non_initial_state( uint32_t timeout_in_ns ); +/** + * @brief Performs the jobs of the specified processor. + * + * @param[in, out] cpu The jobs of this processor will be performed. + */ +void _Per_CPU_Perform_jobs( Per_CPU_Control *cpu ); + #endif /* defined( RTEMS_SMP ) */ /* -- cgit v1.2.3