summaryrefslogtreecommitdiffstats
path: root/testsuites
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-11-09 16:21:37 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-11-20 08:36:49 +0100
commitc597fb166e05d315ce5da29c0a43a09992772dad (patch)
tree627d3f248020e0a292fe7dcb2505cf4d90957ae7 /testsuites
parentbsps/powerpc: Fix PPC_EXC_CONFIG_USE_FIXED_HANDLER (diff)
downloadrtems-c597fb166e05d315ce5da29c0a43a09992772dad.tar.bz2
score: Optimize scheduler priority updates
Thread priority changes may append or prepend the thread to its priority group on the scheduler ready queue. Previously, a separate priority value and a prepend-it flag in the scheduler node were used to propagate a priority change to the scheduler. Now, use an append-it bit in the priority control and reduce the plain priority value to 63 bits. This change leads to a significant code size reduction (about 25%) of the SMP schedulers. The negligible increase of the standard priority scheduler is due to some additional shift operations (SCHEDULER_PRIORITY_MAP() and SCHEDULER_PRIORITY_UNMAP()). Before: text filename 136 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleblock.o 464 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimplechangepriority.o 24 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimple.o 108 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleschedule.o 292 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleunblock.o 264 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleyield.o text filename 280 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityblock.o 488 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerprioritychangepriority.o 200 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriority.o 164 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityschedule.o 328 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityunblock.o 200 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityyield.o text filename 24112 arm-rtems5/c/imx7/cpukit/score/src/libscore_a-scheduleredfsmp.o text filename 37204 sparc-rtems5/c/gr740/cpukit/score/src/libscore_a-scheduleredfsmp.o text filename 42236 powerpc-rtems5/c/qoriq_e6500_32/cpukit/score/src/libscore_a-scheduleredfsmp.o After: text filename 136 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleblock.o 272 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimplechangepriority.o 24 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimple.o 108 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleschedule.o 292 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleunblock.o 264 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulersimpleyield.o text filename 280 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityblock.o 488 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerprioritychangepriority.o 208 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriority.o 164 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityschedule.o 332 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityunblock.o 200 sparc-rtems5/c/erc32/cpukit/score/src/libscore_a-schedulerpriorityyield.o text filename 18860 arm-rtems5/c/imx7/cpukit/score/src/libscore_a-scheduleredfsmp.o text filename 28520 sparc-rtems5/c/gr740/cpukit/score/src/libscore_a-scheduleredfsmp.o text filename 32664 powerpc-rtems5/c/qoriq_e6500_32/cpukit/score/src/libscore_a-scheduleredfsmp.o
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/smptests/smpscheduler01/smpscheduler01.doc2
-rw-r--r--testsuites/sptests/spintrcritical23/init.c15
2 files changed, 11 insertions, 6 deletions
diff --git a/testsuites/smptests/smpscheduler01/smpscheduler01.doc b/testsuites/smptests/smpscheduler01/smpscheduler01.doc
index def7dac128..a881fc0fc4 100644
--- a/testsuites/smptests/smpscheduler01/smpscheduler01.doc
+++ b/testsuites/smptests/smpscheduler01/smpscheduler01.doc
@@ -4,7 +4,7 @@ test set name: smpscheduler01
directives:
- - _Scheduler_SMP_Enqueue_ordered()
+ - _Scheduler_SMP_Enqueue()
- _Scheduler_SMP_Block()
concepts:
diff --git a/testsuites/sptests/spintrcritical23/init.c b/testsuites/sptests/spintrcritical23/init.c
index c0a159471c..02c8a7ef37 100644
--- a/testsuites/sptests/spintrcritical23/init.c
+++ b/testsuites/sptests/spintrcritical23/init.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016 embedded brains GmbH. All rights reserved.
+ * Copyright (c) 2015, 2017 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
@@ -43,12 +43,15 @@ static void change_priority(rtems_id timer, void *arg)
/* The arg is NULL */
test_context *ctx = &ctx_instance;
rtems_interrupt_lock_context lock_context;
+ unsigned int next_priority;
rtems_interrupt_lock_acquire(&ctx->lock, &lock_context);
- if (
- ctx->scheduler_node->Ready_queue.current_priority
- != ctx->scheduler_node->Base.Priority.value
- ) {
+
+ next_priority = SCHEDULER_PRIORITY_UNMAP(
+ (unsigned int) ctx->scheduler_node->Base.Priority.value
+ );
+
+ if ( ctx->scheduler_node->Ready_queue.current_priority != next_priority ) {
rtems_task_priority priority_interrupt;
rtems_task_priority priority_task;
rtems_task_priority previous;
@@ -84,11 +87,13 @@ static bool test_body(void *arg)
rtems_task_priority previous;
rtems_interrupt_lock_acquire(&ctx->lock, &lock_context);
+
priority_last = ctx->priority_task;
priority_task = 1 + (priority_last + 1) % 3;
priority_interrupt = 1 + (priority_task + 1) % 3;
ctx->priority_task = priority_task;
ctx->priority_interrupt = priority_interrupt;
+
rtems_interrupt_lock_release(&ctx->lock, &lock_context);
sc = rtems_task_set_priority(