Commit Graph

3189 Commits

Author SHA1 Message Date
Joel Sherrill
b6343c6100 Enhance Semaphore Blocking and Readying Time Test Cases
tm02 and tm03 were modified to be reused for multiple configurations
of RTEMS Classic API Semaphores. This added tm31-36.  The messages for
tm02 and tm03 were modified to indicate the semaphore attributes.
tm31 - tm36 were added. This resulted in the following cases:

tm02 - rtems_semaphore_obtain: Counting/FIFO not available caller blocks
tm03 - rtems_semaphore_release: Counting/FIFO task readied preempts caller
tm31 - rtems_semaphore_obtain: Counting/priority not available caller blocks
tm32 - rtems_semaphore_release: Counting/priority task readied preempts caller
tm33 - rtems_semaphore_obtain: Binary/FIFO not available caller blocks
tm34 - rtems_semaphore_release: Binary/FIFO task readied preempts caller
tm35 - rtems_semaphore_obtain: Binary/priority not available caller blocks
tm36 - rtems_semaphore_release: Binary/priority task readied preempts caller
2014-07-14 19:31:00 -05:00
Jennifer Averett
648c86c26a capture01: Add include of assert.h. 2014-07-14 13:12:31 -05:00
Jennifer Averett
247118bf51 smpschedsem01: new test.
This test verifies priority is inherited from a high priority
semaphore by a lower  priority task.
2014-07-11 10:12:48 -05:00
Jennifer Averett
7eb3fd4782 smpschedaffinity05: Add test for worst case migration for affintiy scheduler.
This test uses a combination of priority and affinity to cause
the tasks running on all 4 cores to change due to one task priority
change.
2014-07-11 10:12:48 -05:00
Jennifer Averett
61d26f939d smpschedaffinity04: New test.
This test walks a secondary high prority task across
all the cores.
2014-07-11 10:12:48 -05:00
Jennifer Averett
28d6674966 smpschedaffinity03: New test.
This task walks the affinity of self across all the cores.
2014-07-11 10:12:48 -05:00
Jennifer Averett
0929306933 smpschedaffinity02: New test.
This test checks setting the affinity of a secondary task
on a two core system.
2014-07-11 10:12:48 -05:00
Jennifer Averett
d88b0e7fc8 smpschedaffinity01: New test.
This test verifies that affinity is honored when set prior to task start.
2014-07-11 10:12:47 -05:00
Jennifer Averett
82d137ae21 capture01: New non-interactive test for capture engine. 2014-07-11 09:49:55 -05:00
Sebastian Huber
27783f6ca8 score: Fix scheduler helping implementation
Do not extract the idle threads from the ready set so that there is
always a thread available for comparison.
2014-07-10 15:29:57 +02:00
Sebastian Huber
93726e5205 termios: Add rtems_termios_set_best_baud() 2014-07-09 15:56:43 +02:00
Sebastian Huber
a0fb29fb80 termios: PR1279: Use first open status 2014-07-09 12:07:49 +02:00
Sebastian Huber
32fc6a3490 termios: PR1279: Use set attributes status 2014-07-09 12:07:49 +02:00
Sebastian Huber
ef8c00bc88 termios: PR2153: New low-level device API
Add a new low-level device API to Termios that passes the TTY structure
to the low-level device functions.  This greatly simplifies the
low-level device drivers since they are no longer forced to derive their
private data from the minor number.

It makes it possible to use the TTY low-level lock in the device driver
low-level functions which is necessary for proper SMP support.  For
example to set the attributes it is often necessary to perform a
read-modify-write operation on a control register used also by interrupt
routines.

A compatibility layer is provided to support device drivers using the
old callback functions so it is not necessary to modify existing device
drivers.
2014-07-09 11:55:00 +02:00
Sebastian Huber
9f228beaa6 smptests/smpmrsp01: Add and update test cases 2014-07-09 10:05:21 +02:00
Sebastian Huber
8568341d69 score: Need for help indicator for scheduler ops
Return a thread in need for help for the following scheduler operations

- unblock,
- change priority, and
- yield.

A thread in need for help is a thread that encounters a scheduler state
change from scheduled to ready or a thread that cannot be scheduled in
an unblock operation.  Such a thread can ask threads which depend on
resources owned by this thread for help.
2014-07-08 16:30:48 +02:00
Sebastian Huber
08d9760daf score: Rename *_Node_get() to *_Thread_get_node()
This emphasizes that the scheduler node of a thread is returned and this
is not a function working with scheduler nodes like the other *_Node_*()
functions.
2014-07-08 16:30:48 +02:00
Sebastian Huber
88525944f3 sptests/spcontext01: Avoid NULL pointer access 2014-07-01 12:03:12 +02:00
Sebastian Huber
0b4ec4d74e smptests/smpfatal08: Support RTEMS_PARAVIRT 2014-06-30 12:30:12 +02:00
Sebastian Huber
b42e148587 smptests/smpmigration02: PR2183: Add test case 2014-06-24 09:53:11 +02:00
Sebastian Huber
a92989a8bd score: Fix thread deletion on SMP
Close the thread object in _Thread_Make_zombie() so that all blocking
operations that use _Thread_Get() in the corresponding release directive
can find a terminating thread and can complete the operation.
2014-06-23 09:54:05 +02:00
Sebastian Huber
2d36931823 score: Collect scheduler related fields in TCB
Add Thread_Scheduler_control to collect scheduler related fields of the
TCB.
2014-06-23 09:13:00 +02:00
Sebastian Huber
bd56356b58 smptests/smpwakeafter01: New test 2014-06-18 14:03:59 +02:00
Sebastian Huber
11947299a0 smptests: Avoid use of uninitialized data 2014-06-13 16:07:47 +02:00
Sebastian Huber
4962d24d62 smptests/smpscheduler03: Test all SMP schedulers 2014-06-12 10:02:10 +02:00
Sebastian Huber
647859e9bb samples/pppd: Fix extra drivers initializer 2014-06-11 14:38:32 +02:00
Sebastian Huber
2a2a16951e smptest/smpfatal03: Update due to API changes 2014-06-10 11:42:19 +02:00
Sebastian Huber
f6fc635943 sptests/spsem03: New test 2014-06-03 12:01:13 +02:00
Sebastian Huber
1d799ad6d6 rhealstone: Produce proper begin/end messages 2014-06-03 10:24:55 +02:00
Christian Mauderer
5abe5a8122 smptests/smpthreadlife01: Fix for debug enabled 2014-06-03 08:17:12 +02:00
Christian Mauderer
1ee0d5f719 smptests/smpmrsp01: Fix scheduler ids 2014-06-03 08:16:09 +02:00
Sebastian Huber
9553e7a60d score: Use Resource Handler for MrsP semaphores
This enables proper resource dependency tracking and as a side-effect
deadlock detection.
2014-06-03 08:15:16 +02:00
Sebastian Huber
3e2011394d score: Add Resource Handler
A resource is something that has at most one owner at a time and may
have multiple rivals in case an owner is present.  The owner and rivals
are impersonated via resource nodes.  A resource is represented via the
resource control structure.  The resource controls and nodes are
organized as trees.  It is possible to detect deadlocks via such a
resource tree.  The _Resource_Iterate() function can be used to iterate
through such a resource tree starting at a top node.
2014-06-03 08:15:16 +02:00
Sebastian Huber
25f5730fe5 score: _Scheduler_Set_affinity()
Do not change the scheduler with this function.  Documentation.  Coding
style.
2014-06-02 08:28:42 +02:00
Chris Johns
431bb85dde rtems-test-check: Ignore tests which require real ISR based clock tick
BSPs for simulators which do not include a clock tick interrupt source
are incapable of running some tests successfully. This is a common
characteristic of some BSPs and a fixed set of tests. There is no point
in duplicating this list of tests in those BSPs test configuration.

Read testsuites/testdata/require-tick-isr.tcfg for details.
2014-05-28 23:44:26 +10:00
Sebastian Huber
8fcafdd553 score: Multiprocessor Resource Sharing Protocol
Add basic support for the Multiprocessor Resource Sharing Protocol
(MrsP).

The Multiprocessor Resource Sharing Protocol (MrsP) is defined in A.
Burns and A.J.  Wellings, A Schedulability Compatible Multiprocessor
Resource Sharing Protocol - MrsP, Proceedings of the 25th Euromicro
Conference on Real-Time Systems (ECRTS 2013), July 2013.  It is a
generalization of the Priority Ceiling Protocol to SMP systems.  Each
MrsP semaphore uses a ceiling priority per scheduler instance.  These
ceiling priorities can be specified with rtems_semaphore_set_priority().
A task obtaining or owning a MrsP semaphore will execute with the
ceiling priority for its scheduler instance as specified by the MrsP
semaphore object.  Tasks waiting to get ownership of a MrsP semaphore
will not relinquish the processor voluntarily.  In case the owner of a
MrsP semaphore gets preempted it can ask all tasks waiting for this
semaphore to help out and temporarily borrow the right to execute on one
of their assigned processors.

The help out feature is not implemented with this patch.
2014-05-28 10:50:41 +02:00
Sebastian Huber
d134adeba3 score: Fix race condition in SMP startup
Do not use the Per_CPU_Control::started in
_SMP_Start_multitasking_on_secondary_processor() since this field may be
not up to date when a secondary processor reads it.  Use the read-only
scheduler assignment instead.

Add a new fatal error SMP_FATAL_MULTITASKING_START_ON_INVALID_PROCESSOR.
This prevents out-of-bounds access.

It is currently not possible to test these fatal errors.  One option
would be to fake values of the _CPU_SMP_Get_current_processor(), but
unfortunately this function is inline on some architectures.
2014-05-26 08:56:44 +02:00
Sebastian Huber
4edf348c33 score: PR2179: Fix initially locked PCP mutexes
Elevate the priority of the creating task to the ceiling priority in
case a semaphore is created as initially locked.
2014-05-23 08:57:32 +02:00
Chris Johns
3cbedb1ba8 testsuite: Add a user keypress to start pppd.
Allow the test to run and pass when automatic testing.
2014-05-22 19:56:50 +10:00
Chris Johns
eae0863a1c rtems: Fix sp2038 test.
Avoid using newlib's gmtime_r call which fails with a max signed int.
Add an RTEMS specific version for 1/1/1988 to 31/12/2100.

Update sp2038 to test every day from 1/1/1988 to 31/12/2100. Only days
need be tested as the code splits the seconds based on days.
2014-05-22 16:38:01 +10:00
Sebastian Huber
82f9074308 score: _Thread_Set_life_protection()
Enable usage of _Thread_Set_life_protection() in thread dispatch
critical sections.  This can be used to enable the thread
life-protection with thread dispatching disabled and then enable thread
dispatching.
2014-05-21 11:48:25 +02:00
Sebastian Huber
c0bff5e936 score: Split SMP scheduler enqueue function
Extract code from _Scheduler_SMP_Enqueue_ordered() and move it to the
new function _Scheduler_SMP_Enqueue_scheduled_ordered() to avoid
untestable execution paths.

Add and use function _Scheduler_SMP_Unblock().
2014-05-15 12:18:49 +02:00
Sebastian Huber
f39f667a69 score: Simplify _Thread_Change_priority()
The function to change a thread priority was too complex.  Simplify it
with a new scheduler operation.  This increases the average case
performance due to the simplified logic.  The interrupt disabled
critical section is a bit prolonged since now the extract, update and
enqueue steps are executed atomically.  This should however not impact
the worst-case interrupt latency since at least for the Deterministic
Priority Scheduler this sequence can be carried out with a wee bit of
instructions and no loops.

Add _Scheduler_Change_priority() to replace the sequence of
  - _Thread_Set_transient(),
  - _Scheduler_Extract(),
  - _Scheduler_Enqueue(), and
  - _Scheduler_Enqueue_first().

Delete STATES_TRANSIENT, _States_Is_transient() and
_Thread_Set_transient() since this state is now superfluous.

With this change it is possible to get rid of the
SCHEDULER_SMP_NODE_IN_THE_AIR state.  This considerably simplifies the
implementation of the new SMP locking protocols.
2014-05-15 12:18:44 +02:00
Sebastian Huber
beab7329fc score: Introduce scheduler nodes
Rename scheduler per-thread information into scheduler nodes using
Scheduler_Node as the base type.  Use inheritance for specialized
schedulers.

Move the scheduler specific states from the thread control block into
the scheduler node structure.

Validate the SMP scheduler node state transitions in case RTEMS_DEBUG is
defined.
2014-05-14 14:46:19 +02:00
Sebastian Huber
6c5c2f39d0 bsps: Use bsp_start_on_secondary_processor()
Use a standard function for startup on secondary processors.
2014-05-12 09:23:51 +02:00
Sebastian Huber
11b05f11d4 score: Fix CPU context usage on SMP
We must not alter the is executing indicator in
_CPU_Context_Initialize() since this would cause an invalid state during
a self restart.

The is executing indicator must be valid at creation time since
otherwise _Thread_Kill_zombies() uses an undefined value for not started
threads.  This could result in a system life lock.
2014-05-08 13:02:40 +02:00
Sebastian Huber
23b9d09528 smptests/smp07: Fix test output 2014-05-07 18:32:15 +02:00
Sebastian Huber
8fa342218d smptests/smp05: Fix test name and output 2014-05-07 18:30:36 +02:00
Sebastian Huber
b97bc8bc71 tests: Add locked_printf_plugin()
Add locked_vprintf().  Return an int just like printf(), etc.
2014-05-07 18:27:19 +02:00
Sebastian Huber
38b59a6d30 score: Implement forced thread migration
The current implementation of task migration in RTEMS has some
implications with respect to the interrupt latency. It is crucial to
preserve the system invariant that a task can execute on at most one
processor in the system at a time. This is accomplished with a boolean
indicator in the task context. The processor architecture specific
low-level task context switch code will mark that a task context is no
longer executing and waits that the heir context stopped execution
before it restores the heir context and resumes execution of the heir
task. So there is one point in time in which a processor is without a
task. This is essential to avoid cyclic dependencies in case multiple
tasks migrate at once. Otherwise some supervising entity is necessary to
prevent life-locks. Such a global supervisor would lead to scalability
problems so this approach is not used. Currently the thread dispatch is
performed with interrupts disabled. So in case the heir task is
currently executing on another processor then this prolongs the time of
disabled interrupts since one processor has to wait for another
processor to make progress.

It is difficult to avoid this issue with the interrupt latency since
interrupts normally store the context of the interrupted task on its
stack. In case a task is marked as not executing we must not use its
task stack to store such an interrupt context. We cannot use the heir
stack before it stopped execution on another processor. So if we enable
interrupts during this transition we have to provide an alternative task
independent stack for this time frame. This issue needs further
investigation.
2014-05-07 14:26:28 +02:00