[PATCH 6/6] score: Need for help indicator for scheduler ops
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Jun 13 16:41:56 UTC 2014
On 06/13/2014 06:13 PM, Gedare Bloom wrote:
> On Fri, Jun 13, 2014 at 10:37 AM, Sebastian Huber
> <sebastian.huber at embedded-brains.de> wrote:
>> Return the displaced thread for the following scheduler operations
>>
>> - unblock,
>> - change priority, and
>> - yield.
>>
>> A displaced thread is a thread that encounters a scheduler state change
>> from scheduled to ready. Such a displaced thread can ask threads which
>> depend on resources owned by the displaced thread for help.
>>
>> In case the unblock operation returns no displaced thread, then this
>> indicates that the unblocked thread is now in the ready state and has no
>> processor allocated. Such a thread can ask now also for help.
>> ---
>> cpukit/score/include/rtems/score/scheduler.h | 27 ++-
>> cpukit/score/include/rtems/score/schedulercbs.h | 2 +-
>> cpukit/score/include/rtems/score/scheduleredf.h | 6 +-
>> cpukit/score/include/rtems/score/schedulerimpl.h | 33 ++
>> .../score/include/rtems/score/schedulerpriority.h | 6 +-
>> .../rtems/score/schedulerpriorityaffinitysmp.h | 4 +-
>> .../include/rtems/score/schedulerprioritysmp.h | 6 +-
>> cpukit/score/include/rtems/score/schedulersimple.h | 6 +-
>> .../score/include/rtems/score/schedulersimplesmp.h | 6 +-
>> .../score/include/rtems/score/schedulersmpimpl.h | 46 ++-
>> cpukit/score/src/schedulercbsunblock.c | 4 +-
>> cpukit/score/src/scheduleredfchangepriority.c | 4 +-
>> cpukit/score/src/scheduleredfunblock.c | 4 +-
>> cpukit/score/src/scheduleredfyield.c | 4 +-
>> cpukit/score/src/schedulerpriorityaffinitysmp.c | 39 ++-
>> cpukit/score/src/schedulerprioritychangepriority.c | 4 +-
>> cpukit/score/src/schedulerprioritysmp.c | 34 +-
>> cpukit/score/src/schedulerpriorityunblock.c | 4 +-
>> cpukit/score/src/schedulerpriorityyield.c | 4 +-
>> cpukit/score/src/schedulersimplechangepriority.c | 4 +-
>> cpukit/score/src/schedulersimplesmp.c | 34 +-
>> cpukit/score/src/schedulersimpleunblock.c | 4 +-
>> cpukit/score/src/schedulersimpleyield.c | 4 +-
>> testsuites/smptests/smpscheduler03/init.c | 385 +++++++++++++++++++-
>> 24 files changed, 562 insertions(+), 112 deletions(-)
>>
>> diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h
>> index d9d21d3..d2436ff 100644
>> --- a/cpukit/score/include/rtems/score/scheduler.h
>> +++ b/cpukit/score/include/rtems/score/scheduler.h
>> @@ -44,6 +44,16 @@ typedef struct Scheduler_Control Scheduler_Control;
>>
>> typedef struct Scheduler_Node Scheduler_Node;
>>
>> +#if defined(RTEMS_SMP)
>> + typedef Thread_Control * Scheduler_Void_or_thread;
>> +
>> + #define SCHEDULER_RETURN_VOID_OR_NULL return NULL
>> +#else
>> + typedef void Scheduler_Void_or_thread;
>> +
>> + #define SCHEDULER_RETURN_VOID_OR_NULL return
>> +#endif
>> +
> What's the cost to always return a thread even if it is NULL for the
> uniprocessor case? It seems abstracting the return value is probably
> more trouble for understanding the code than it is worth for saving a
> few cycles for these schedule operations?
The cost is not that high, on RISC machines normally one opcode. I am
not sure which alternative is better.
>
>> diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
>> index f3284eb..0f7150f 100644
>> --- a/cpukit/score/include/rtems/score/schedulerimpl.h
>> +++ b/cpukit/score/include/rtems/score/schedulerimpl.h
>> @@ -107,6 +107,11 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( Thread_Control *the_thread )
>> ( *scheduler->Operations.schedule )( scheduler, the_thread );
>> }
>>
>> +RTEMS_INLINE_ROUTINE void _Scheduler_Ask_for_help( Thread_Control *needs_help )
>> +{
>> + (void) needs_help;
>> +}
>> +
>> /**
>> * @brief Scheduler yield with a particular thread.
>> *
>> @@ -118,8 +123,14 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( Thread_Control *the_thread )
>> RTEMS_INLINE_ROUTINE void _Scheduler_Yield( Thread_Control *the_thread )
>> {
>> const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
>> + Thread_Control *needs_help;
>>
>> +#if defined(RTEMS_SMP)
>> + needs_help =
>> +#endif
>> ( *scheduler->Operations.yield )( scheduler, the_thread );
>> +
>> + _Scheduler_Ask_for_help( needs_help );
> For non-SMP this passes an uninitialized pointer to a function. This
> seems like a poor design choice. I'd either wrap the call with
> #ifdef(SMP) or make sure there is an ifdef in the function that gets
> called. Of course right now that function does nothing and does not
> use the pointer, but it should be explicit that the non-SMP case will
> never do anything with this pointer.
Yes, you are right, this is bad style. I tend to #ifdef it away for
non-SMP.
[...]
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list