source: rtems/cpukit/score/src/scheduleredfreleasejob.c @ fce900b5

5
Last change on this file since fce900b5 was c597fb1, checked in by Sebastian Huber <sebastian.huber@…>, on 11/09/17 at 15:21:37

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

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/**
2 * @file
3 *
4 * @brief Scheduler EDF Release Job
5 * @ingroup ScoreScheduler
6 */
7
8/*
9 *  Copyright (C) 2011 Petr Benes.
10 *  Copyright (C) 2011 On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/score/scheduleredfimpl.h>
22
23Priority_Control _Scheduler_EDF_Map_priority(
24  const Scheduler_Control *scheduler,
25  Priority_Control         priority
26)
27{
28  return SCHEDULER_EDF_PRIO_MSB | SCHEDULER_PRIORITY_MAP( priority );
29}
30
31Priority_Control _Scheduler_EDF_Unmap_priority(
32  const Scheduler_Control *scheduler,
33  Priority_Control         priority
34)
35{
36  return SCHEDULER_PRIORITY_UNMAP( priority & ~SCHEDULER_EDF_PRIO_MSB );
37}
38
39void _Scheduler_EDF_Release_job(
40  const Scheduler_Control *scheduler,
41  Thread_Control          *the_thread,
42  Priority_Node           *priority_node,
43  uint64_t                 deadline,
44  Thread_queue_Context    *queue_context
45)
46{
47  (void) scheduler;
48
49  _Thread_Wait_acquire_critical( the_thread, queue_context );
50
51  /*
52   * There is no integer overflow problem here due to the
53   * SCHEDULER_PRIORITY_MAP().  The deadline is in clock ticks.  With the
54   * minimum clock tick interval of 1us, the uptime is limited to about 146235
55   * years.
56   */
57  _Priority_Node_set_priority(
58    priority_node,
59    SCHEDULER_PRIORITY_MAP( deadline )
60  );
61
62  if ( _Priority_Node_is_active( priority_node ) ) {
63    _Thread_Priority_changed(
64      the_thread,
65      priority_node,
66      false,
67      queue_context
68    );
69  } else {
70    _Thread_Priority_add( the_thread, priority_node, queue_context );
71  }
72
73  _Thread_Wait_release_critical( the_thread, queue_context );
74}
75
76void _Scheduler_EDF_Cancel_job(
77  const Scheduler_Control *scheduler,
78  Thread_Control          *the_thread,
79  Priority_Node           *priority_node,
80  Thread_queue_Context    *queue_context
81)
82{
83  (void) scheduler;
84
85  _Thread_Wait_acquire_critical( the_thread, queue_context );
86
87  _Thread_Priority_remove( the_thread, priority_node, queue_context );
88  _Priority_Node_set_inactive( priority_node );
89
90  _Thread_Wait_release_critical( the_thread, queue_context );
91}
Note: See TracBrowser for help on using the repository browser.