summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/score/percpu.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-04-11 15:16:40 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-04-12 09:44:48 +0200
commite90486ab41a4edf045a6153675b6be9dcd422b71 (patch)
treeea0ad25fd9d9324ca02f9a26556d6cc5e2e9a592 /cpukit/include/rtems/score/percpu.h
parentdf8d7bd76f5014583d6cc20f72f335e5fe2bd0cc (diff)
downloadrtems-e90486ab41a4edf045a6153675b6be9dcd422b71.tar.bz2
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.
Diffstat (limited to 'cpukit/include/rtems/score/percpu.h')
-rw-r--r--cpukit/include/rtems/score/percpu.h40
1 files changed, 40 insertions, 0 deletions
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
*
@@ -495,6 +497,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 ) */
/*