| 13 | |
| 14 | {| border="1" style="margin: 1em auto 1em auto;text-align: center;" |
| 15 | |+ |
| 16 | |- |
| 17 | |'''Task Name''' || '''Status Summary''' |
| 18 | |- |
| 19 | | [http://www.rtems.org/wiki/index.php/SMP#Low-Level_Start Low Level Start] || Incomplete |
| 20 | |- |
| 21 | | [http://www.rtems.org/wiki/index.php/SMP#Processor_Affinity Processor Affinity] || Ongoing |
| 22 | |- |
| 23 | | [http://www.rtems.org/wiki/index.php/SMP#Atomic_Operations Atomic Operations] || Complete |
| 24 | |- |
| 25 | | [http://www.rtems.org/wiki/index.php/SMP#SMP_Locks SMP Locks] || Complete |
| 26 | |- |
| 27 | | [http://www.rtems.org/wiki/index.php/SMP#ISR_Locks ISR Locks] || Complete |
| 28 | |- |
| 29 | | [http://www.rtems.org/wiki/index.php/SMP#Giant_Lock_vs._Fine_Grained_Locking Giant Lock vs Fine Grained Locking] || Complete |
| 30 | |- |
| 31 | | [http://www.rtems.org/wiki/index.php/SMP#Watchdog_Handler Watchdog Handler] || Complete |
| 32 | |- |
| 33 | | [http://www.rtems.org/wiki/index.php/SMP#Per-CPU_Control Per-CPU Control] || Complete |
| 34 | |- |
| 35 | | [http://www.rtems.org/wiki/index.php/SMP#Interrupt_Support Interrupt Support] || Complete |
| 36 | |- |
| 37 | | [http://www.rtems.org/wiki/index.php/SMP#Global_Scheduler Global Scheduler] || Complete |
| 38 | |- |
| 39 | | [http://www.rtems.org/wiki/index.php/SMP#Clustered_Scheduling Clustered Scheduling] || Complete |
| 40 | |- |
| 41 | | [http://www.rtems.org/wiki/index.php/SMP#Task_Variables Task Variables] || Complete |
| 42 | |- |
| 43 | | [http://www.rtems.org/wiki/index.php/SMP#Non-Preempt_Mode_for_Mutual_Exclusion Non-Preempt Mode for Mutual Exclusion] || Complete |
| 44 | |- |
| 45 | | [http://www.rtems.org/wiki/index.php/SMP#Thread_Restart Thread Restart] || Complete |
| 46 | |- |
| 47 | | [http://www.rtems.org/wiki/index.php/SMP#Thread_Delete Thread Delete] || Complete |
| 48 | |- |
| 49 | | [http://www.rtems.org/wiki/index.php/SMP#Semaphores_and_Mutexes Semaphores and Mutexes] || Complete |
| 50 | |- |
| 51 | |} |
1468 | | queue operations execute in a worst-case time which depends only on the maximum |
1469 | | number of priorities. |
1470 | | = Post-Switch Actions = |
1471 | | |
1472 | | == Reason == |
1473 | | |
1474 | | |
1475 | | Currently threads are assigned to processors for execution by the scheduler |
1476 | | responsible for this thread. It is unknown to the system when a thread |
1477 | | actually starts or terminates execution on its assigned processor. The |
1478 | | termination event is important for the following features |
1479 | | * explicit thread migration, e.g. if a thread should move from one scheduler domain to another, |
1480 | | * thread deletion, since the thread stack is in use until the thread stopped execution, or |
1481 | | * restart of threads executing on a remote processor. |
1482 | | == RTEMS API Changes == |
1483 | | |
1484 | | |
1485 | | None. |
1486 | | == Implementation == |
1487 | | |
1488 | | |
1489 | | One approach to do post-switch actions could be to spin on the per-processor |
1490 | | variable reflecting the executing thread. This has at least two problems |
1491 | | # it doesn't work if the executing thread wants to alter its own state, and |
1492 | | # this spinning must be done with the scheduler lock held and interrupts disabled, this is a disaster for the interrupt latency, |
1493 | | |
1494 | | The proposed solution is to use an optional action handler which is active in |
1495 | | case the thread execution termination matters. In _Thread_Dispatch() we have |
1496 | | already the post-switch extensions invoked after a thread switch. |
1497 | | Unfortunately they execute after thread dispatching is enabled again and at |
1498 | | this point the current processor may have already changed due to thread |
1499 | | migration requested by an interrupt. |
1500 | | |
1501 | | We need a context which executes right after the thread context switch on the |
1502 | | current processor, but without the per-processor lock acquired (to prevent lock |
1503 | | order reversal problems and keep the interrupt latency small). |
| 1507 | queue operations execute in a worst-case t |