diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-11-09 16:21:37 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-11-20 08:36:49 +0100 |
commit | c597fb166e05d315ce5da29c0a43a09992772dad (patch) | |
tree | 627d3f248020e0a292fe7dcb2505cf4d90957ae7 /testsuites | |
parent | bsps/powerpc: Fix PPC_EXC_CONFIG_USE_FIXED_HANDLER (diff) | |
download | rtems-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.doc | 2 | ||||
-rw-r--r-- | testsuites/sptests/spintrcritical23/init.c | 15 |
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( |