Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Strong APA v1.3 #7

Open
wants to merge 29 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
520882a
Added files for version 1.1
Jul 25, 2020
8731311
Removed all compilation errors
Jul 27, 2020
3a9843f
Removed file from wrong place
Jul 27, 2020
af96cca
Corrected Assert Statements
Jul 27, 2020
dfda77a
Removed all compiler errors
Jul 28, 2020
66455b8
Resolving reviews on pull request
Jul 30, 2020
424c500
Started replacing the pseduo codes
Aug 5, 2020
f2d6e42
Added get_lowest_scheduled
Aug 6, 2020
9cc11fb
Added configuration definitions
Aug 6, 2020
9fee2f4
Removed compiler warnings
Aug 10, 2020
dc6477c
Removed error from scheduler.h
Aug 10, 2020
2644463
Finished logic for get_highest_ready
Aug 12, 2020
72781fa
Changed conf def in scheduler.h
Aug 12, 2020
b33f7a0
Rename and remove whiteline
Aug 13, 2020
03650c4
New structure and definitions
Aug 14, 2020
4d93042
Removing errors while trying to debug
Aug 15, 2020
c316213
Latest version Sun 16th Aug
Aug 16, 2020
e679ffa
Corrected error in getting node from the chain and getting its priority
Aug 17, 2020
ae7945c
Added missed semicolon
Aug 18, 2020
b94696c
All errors resolved except assert for a task
Aug 18, 2020
6e455a5
BWorking backtracking code for both the algorithms
Aug 19, 2020
03d08d0
Completed transformation of Get_lowest_scheduled
Aug 20, 2020
418d60c
Version 1.3 release
Aug 22, 2020
d1b3a98
Version 1.3 Updated
Aug 22, 2020
9bb3733
Final update to version 1.3
Aug 22, 2020
c28b76a
Final update to v1.3
Aug 22, 2020
83b59a5
Indentation corrections and minor bug fix
Aug 24, 2020
4bbf5d9
Revisions on review
Aug 26, 2020
e542a76
Releasing final version
Aug 28, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 2 additions & 4 deletions cpukit/include/rtems/scheduler.h
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
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