Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions cpukit/include/rtems/scheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,16 +257,14 @@
#define RTEMS_SCHEDULER_STRONG_APA( name, prio_count ) \
static struct { \
Scheduler_strong_APA_Context Base; \
Chain_Control Ready[ ( prio_count ) ]; \
Scheduler_strong_APA_CPU CPU[ CONFIGURE_MAXIMUM_PROCESSORS ]; \
} SCHEDULER_STRONG_APA_CONTEXT_NAME( name )

#define RTEMS_SCHEDULER_TABLE_STRONG_APA( name, obj_name ) \
{ \
&SCHEDULER_STRONG_APA_CONTEXT_NAME( name ).Base.Base.Base, \
SCHEDULER_STRONG_APA_ENTRY_POINTS, \
RTEMS_ARRAY_SIZE( \
SCHEDULER_STRONG_APA_CONTEXT_NAME( name ).Ready \
) - 1, \
SCHEDULER_STRONG_APA_MAXIMUM_PRIORITY, \
( obj_name ) \
SCHEDULER_CONTROL_IS_NON_PREEMPT_MODE_SUPPORTED( false ) \
}
Expand Down
165 changes: 131 additions & 34 deletions cpukit/include/rtems/score/schedulerstrongapa.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,74 +6,144 @@
* @brief Strong APA Scheduler API
*/

/*
* Copyright (c) 2013, 2018 embedded brains GmbH. All rights reserved.
/* SPDX-License-Identifier: BSD-2-Clause
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
* Copyright (C) 2020 Richi Dubey
* Copyright (c) 2013, 2018 embedded brains GmbH
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef _RTEMS_SCORE_SCHEDULERSTRONGAPA_H
#define _RTEMS_SCORE_SCHEDULERSTRONGAPA_H

#include <rtems/score/scheduler.h>
#include <rtems/score/schedulerpriority.h>
#include <rtems/score/schedulersmp.h>
#include <rtems/score/percpu.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#define STRONG_SCHEDULER_NODE_OF_CHAIN( node ) \
RTEMS_CONTAINER_OF( node, Scheduler_strong_APA_Node, Ready_node )

/**
* @defgroup RTEMSScoreSchedulerStrongAPA Strong APA Scheduler
*
* @ingroup RTEMSScoreSchedulerSMP
*
* @brief Strong APA Scheduler
*
* This is an implementation of the global fixed priority scheduler (G-FP). It
* uses one ready chain per priority to ensure constant time insert operations.
* The scheduled chain uses linear insert operations and has at most processor
* count entries. Since the processor and priority count are constants all
* scheduler operations complete in a bounded execution time.
*
* The the_thread preempt mode will be ignored.
* This is an implementation of the Strong APA scheduler defined by
* Cerqueira et al. in Linux's Processor Affinity API, Refined:
* Shifting Real-Time Tasks Towards Higher Schedulability.
*
* The scheduled and ready nodes are accessed via the
* Scheduler_strong_APA_Context::Ready which helps in backtracking when a
* node which is executing on a CPU gets blocked. New node is allocated to
* the cpu by checking all the executing nodes in the affinity set of the
* node and the subsequent nodes executing on the processors in its
* affinity set.
* @{
*/

/**
* @brief Scheduler context specialization for Strong APA
* schedulers.
* @brief Scheduler node specialization for Strong APA schedulers.
*/
typedef struct {
Scheduler_SMP_Context Base;
Priority_bit_map_Control Bit_map;
Chain_Control Ready[ RTEMS_ZERO_LENGTH_ARRAY ];
} Scheduler_strong_APA_Context;
/**
* @brief SMP scheduler node.
*/
Scheduler_SMP_Node Base;

/**
* @brief Chain node for Scheduler_strong_APA_Context::Ready.
*/
Chain_Node Ready_node;

/**
* @brief CPU that this node would preempt in the backtracking part of
* _Scheduler_strong_APA_Get_highest_ready and
* _Scheduler_strong_APA_Do_Enqueue.
*/
Per_CPU_Control *cpu_to_preempt;

/**
* @brief The associated affinity set of this node.
*/
Processor_mask Affinity;
} Scheduler_strong_APA_Node;


/**
* @brief Scheduler node specialization for Strong APA
* schedulers.
* @brief CPU related variables and a CPU_Control to implement BFS.
*/
typedef struct
{
/**
* @brief CPU in a queue.
*/
Per_CPU_Control *cpu;

/**
* @brief The node that would preempt this CPU.
*/
Scheduler_Node *preempting_node;

/**
* @brief Whether or not this cpu has been added to the queue
* (visited in BFS).
*/
bool visited;

/**
* @brief The node currently executing on this cpu.
*/
Scheduler_Node *executing;
} Scheduler_strong_APA_CPU;

/**
* @brief Scheduler context and node definition for Strong APA scheduler.
*/
typedef struct {
/**
* @brief @see Scheduler_SMP_Context.
*/
Scheduler_SMP_Context Base;

/**
* @brief SMP scheduler node.
* @brief Chain of all the ready and scheduled nodes present in
* the Strong APA scheduler.
*/
Scheduler_SMP_Node Base;
Chain_Control Ready;

/**
* @brief The associated ready queue of this node.
* @brief Struct with important variables for each cpu.
*/
Scheduler_priority_Ready_queue Ready_queue;
} Scheduler_strong_APA_Node;
Scheduler_strong_APA_CPU CPU[ RTEMS_ZERO_LENGTH_ARRAY ];
} Scheduler_strong_APA_Context;

#define SCHEDULER_STRONG_APA_MAXIMUM_PRIORITY 255

/**
* @brief Entry points for the Strong APA Scheduler.
Expand All @@ -100,8 +170,8 @@ typedef struct {
_Scheduler_default_Release_job, \
_Scheduler_default_Cancel_job, \
_Scheduler_default_Tick, \
_Scheduler_SMP_Start_idle \
SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \
_Scheduler_strong_APA_Start_idle, \
_Scheduler_strong_APA_Set_affinity \
}

/**
Expand Down Expand Up @@ -168,7 +238,7 @@ void _Scheduler_strong_APA_Update_priority(
/**
* @brief Asks for help.
*
* @param scheduler The scheduler control instance.
* @param scheduler The scheduler control instance.
* @param the_thread The thread that asks for help.
* @param node The node of @a the_thread.
*
Expand Down Expand Up @@ -246,6 +316,33 @@ void _Scheduler_strong_APA_Yield(
Scheduler_Node *node
);

/**
* @brief Starts an idle thread.
*
* @param scheduler The scheduler instance.
* @param[in, out] the_thread An idle thread.
* @param cpu The cpu for the operation.
*/
void _Scheduler_strong_APA_Start_idle(
const Scheduler_Control *scheduler,
Thread_Control *idle,
struct Per_CPU_Control *cpu
);

/**
* @brief Sets the affinity .
*
* @param scheduler The scheduler control instance.
* @param the_thread The thread to yield.
* @param[in, out] node The node of @a the_thread.
*/
bool _Scheduler_strong_APA_Set_affinity(
const Scheduler_Control *scheduler,
Thread_Control *thread,
Scheduler_Node *node_base,
const Processor_mask *affinity
);

/** @} */

#ifdef __cplusplus
Expand Down
Loading