Commit Graph

1024 Commits

Author SHA1 Message Date
Gregory Nutt
bac7153609 SMP: Add logic to avoid a deadlock condition when CPU1 is hung waiting for g_cpu_irqlock and CPU0 is waitin for g_cpu_paused 2016-11-22 11:34:16 -06:00
Gregory Nutt
130bfa3f6b Remove a assertion condition that appears to rarely cause false-alarm assertions. Teported by Petteri Aimonen 2016-11-21 14:43:56 -06:00
Gregory Nutt
558784d06f Spinlocks: Added capability to provide architecture-specific memory barriers. This was for i.MX6 but does not help with the SMP problems. It is still a good feature. 2016-11-21 11:55:59 -06:00
Gregory Nutt
2d1765a014 Remove more of those annoying empty comment blocks. 2016-11-21 07:34:27 -06:00
Gregory Nutt
0029c04dad task_restart: Make sure new task starts with pre-emption disabled and not in a critical section. 2016-11-21 07:33:23 -06:00
Gregory Nutt
cee8d59b58 Update TODO list 2016-11-20 12:26:08 -06:00
Gregory Nutt
e24f281401 This commit adds a new internal interfaces and fixes a problem with three APIs in the SMP configuration. The new internal interface is sched_cpu_pause(tcb). This function will pause a CPU if the task associated with 'tcb' is running on that CPU. This allows a different CPU to modify that OS data stuctures associated with the CPU. When the other CPU is resumed, those modifications can safely take place.
The three fixes are to handle cases in the SMP configuration where one CPU does need to make modifications to TCB and data structures on a task that could be running running on another CPU.  Those three cases are task_delete(), task_restart(), and execution of signal handles.  In all three cases the solutions is basically the same:  (1) Call sched_cpu_pause(tcb) to pause the CPU on which the task is running, (2) perform the necessary operations, then (3) call up_cpu_resume() to restart the paused CPU.
2016-11-20 07:57:18 -06:00
Gregory Nutt
f40fbaa4b9 sched/task: task_restart() test not supported on SMP systems. This is not fully implemented. 2016-11-19 11:41:05 -06:00
Rajan Gill
0d8e191d69 sched/clock: Correct calculation for the case of Tickless mode with a 32-bit timer. In that case, the calculation was returning millisecond accuracy. That is not good when the timer accuracy is < 1 msec. 2016-11-19 09:55:21 -06:00
Gregory Nutt
5ca9128c38 Update comments 2016-11-19 08:33:55 -06:00
Gregory Nutt
ceacacbc63 vfork(): Fix a race condition in the SMP case. Existing logic depended on the fact that the child would not run until waitpid was called because the child had the same priority as the parent. BUT in the SMP case that is not true... the child may run immediately on a different CPU. 2016-11-19 07:30:01 -06:00
Gregory Nutt
69e9f8638d Most interrupt handling logic interacts with tasks via standard mechanism such as sem_post, sigqueue, mq_send, etc. This all call enter_critical_section and are assumed to be safe in the SMP case.
But certain logic interacts with tasks in different ways.  The only one that comes to mind are wdogs.  There is a tasking interface that to manipulate wdogs, and a different interface in the timer interrupt handling logic to manage wdog expirations.

In the normal case, this is fine.  Since the tasking level code calls enter_critical_section, interrupts are disabled an no conflicts can occur.  But that may not be the case in the SMP case.  Most architectures do not permit disabling interrupts on other CPUs so enter_critical_section must work differently:  Locks are required to protect code.

So this change adds locking (via enter_critical section) to wdog expiration logic for the the case if the SMP configuration.
2016-11-18 13:57:30 -06:00
Gregory Nutt
78fd358023 Update some comments. 2016-11-18 08:20:52 -06:00
Gregory Nutt
8602e8a8a9 SMP: irq_csection() has a bad assumption. It assumed that the state of certain variables. That was true on entry into the interrupt handler, but might change to the execution of logic within the interrupt handler. 2016-11-18 07:38:16 -06:00
Gregory Nutt
8e029f019b Update comments 2016-11-17 17:30:12 -06:00
Gregory Nutt
47b52a2633 Fix an error in manually bringing in Sebastien's changes; Update some comments. 2016-11-17 16:15:06 -06:00
Gregory Nutt
9acd57c819 Fix up some naming and update some comments. 2016-11-17 15:50:39 -06:00
Gregory Nutt
558f4049d4 sched/irq/irq_csection: Fix a bad DEBUG assertion when SMP is enabled. 2016-11-17 15:36:27 -06:00
Gregory Nutt
2c314464a8 Fix a typo in a comment 2016-11-17 08:03:45 -06:00
Gregory Nutt
ccdc11d8ff Fix typo in variable naming. g_cpu_irqset should be g_cpu_irqlock. 2016-11-17 06:37:24 -06:00
Gregory Nutt
1c1564f0c1 Add logic to handled nested calls to enter_critical_section() from interrupts handlers (with SMP). 2016-11-16 22:45:08 -06:00
Gregory Nutt
0c3207e86e Fix backward logic in an assertion. 2016-11-16 21:48:27 -06:00
Gregory Nutt
16f0b8fa96 Fix typos in DEBUASSERT statements 2016-11-16 19:58:51 -06:00
Gregory Nutt
f1e4951a8d Fix some comments 2016-11-16 19:11:31 -06:00
Gregory Nutt
4ca653a1cc Add some experimental changes to enter/leave_critical_section to deal with the case where interrupts are disabled only on the local CPU 2016-11-16 18:28:35 -06:00
Gregory Nutt
5ce3b399d5 Correct some typos in comments 2016-11-15 16:48:40 -06:00
Gregory Nutt
40d7216a22 Back out 65ab12 and parts of 21f92b 2016-11-15 15:44:43 -06:00
Gregory Nutt
6683f01444 Trivial change to comment 2016-11-15 13:38:43 -06:00
Gregory Nutt
21f92ba601 Review some SMP logic; update comments; refresh configuration. 2016-11-15 09:24:00 -06:00
Gregory Nutt
65ab12fbb9 If SMP is enabled, if any interrupt handler calls enter_critical_section(), it should take the spinlock. 2016-11-15 08:37:58 -06:00
Gregory Nutt
b53866c872 sched/irq: Change order for SMP case in enter_critical_section: Disble local interrupts BEFORE taking spinlock. 2016-11-15 07:54:18 -06:00
Freddie Chopin
484a1b6104 sem_wait() and sem_trywait() no longer modify the errno value UNLESS an error occurs. This allows these functions to be used internallly without clobbering the errno value. 2016-11-09 07:01:49 -06:00
Gregory Nutt
120d29b480 Update some Kconfig comments 2016-11-06 09:06:37 -06:00
Heesub Shin
8e94d8e7cc Signal sent from work_signal() may interrupt the low priority worker thread that is already running. For example, the worker thread that is waiting for a semaphore could be woken up by the signal and break any synchronization assumption as a result. It also does not make any sense to send signal if it is already running and busy. This commit fixes it. 2016-11-06 08:00:12 -06:00
Gregory Nutt
796969f6b6 Update TODO. Provide do-nothing stubs for mutex attribute interfaces if features not enabled. pthread_cond includes a signaling semaphore and should call sem_setprotocol. 2016-11-05 11:06:52 -06:00
Gregory Nutt
6f1c5e7b43 Add some comments. 2016-11-05 09:44:29 -06:00
Gregory Nutt
4b0372e542 Missing # on endif 2016-11-03 21:27:52 -06:00
Gregory Nutt
73fc186beb sem_setprotocol: Handle a case of missing proxy for sem_setprotocol. Reorder so that (1) this error is avoided, and (2) >No proxy is needed if priority inheritance is not enabled. 2016-11-03 18:51:38 -06:00
Gregory Nutt
0d5bd30943 Fix a type in include file name 2016-11-03 12:58:02 -06:00
Gregory Nutt
4c8ec0d2ca include/nuttx/semaphore.h: Fix broken macros 2016-11-03 12:49:44 -06:00
Gregory Nutt
1da3a5fa61 sched: Disable priority inheritance on all semaphores used for signaling 2016-11-03 12:42:02 -06:00
Gregory Nutt
97bf82ee05 Semaphores: Provide macros for sem_setprotobol() and sem_getprotocol() if priority inheritance is not enabled. More SEM_PRIO_* definitions to include/nuttx/semaphore.h 2016-11-02 18:21:46 -06:00
Gregory Nutt
d5b4d848d3 Move protoypes for the non-standard include/semaphore.h file to the non-standard include/nuttx/semaphore.h with the other non-standard semaphore interfaces. 2016-11-02 14:43:03 -06:00
Gregory Nutt
b738a646ad sem_getprotocol() can be in C library 2016-11-02 09:29:16 -06:00
Gregory Nutt
92d3022411 Add pthread_mutexattr_get/set_protocol and non-standard sem_get/set_protocol. These may use to enable or disable priority inheritance on a single semaphore. 2016-11-02 09:05:18 -06:00
Gregory Nutt
4997ec7a1e ESP32 Core V2: Add an SMP configuration to support development (not yet usable). 2016-10-29 14:56:07 -06:00
Gregory Nutt
e6377641a8 sched/Kconfig: Add ranges to START_YEAR, MONTH, and DAY 2016-10-27 18:04:14 -06:00
Gregory Nutt
123c520db4 Correct time initialization for the case where time is initialized from settings in the .config file. The correct range for month (tm_mon) internally is 0-11, not 1-12 as it is in the .config file. 2016-10-27 08:36:24 -06:00
Gregory Nutt
6a20560ba2 Trivia fix to typo in comment 2016-10-26 12:29:36 -06:00
Gregory Nutt
3e13ed2400 Within the OS, when a thread obtains a semaphore count it must call sem_addholder() if CONFIG_PRIORITY_INHERITANCE is enabled. If a count is available, then sem_wait() calls sem_addholder(), otherwise it waited for the semaphore and called sem_addholder() when it eventually received the count.
This caused a problem when the thread calling sem_wait() was very low priority.  When it received the count, there may be higher priority threads "hogging" the CPU that prevent the lower priority task from running and, as a result, the sem_addholder() may be delayed indefinitely.

The fix was to have sem_post() call sem_addholder() just before restarting the thread waiting for the semaphore count.

This problem was noted by Benix Vincent who also suggested the solution.
2016-10-26 07:23:15 -06:00
Gregory Nutt
8669183852 sched/pthread and task: When a pthread is started, there is a small bit of logic that will run on the thread of execution of the new pthread. In the case where the new pthread has a lower priority than the parent thread, then this could cause both the parent thread and the new pthread to be blocked at the priority of the lower priority pthread (assuming that CONFIG_PRIORITY_INHERITANCE is not selected).
This change temporarily boosts the priority of the new pthread to at least the priority of the new pthread to at least the priority of the parent thread.  When that bit of logic has executed on the thread of execution of the new pthread, it will then drop to the correct priority (if necessary) before calling into the new pthread's entry point.
2016-10-01 11:38:22 -06:00
Gregory Nutt
75104b0808 Remove duplicate function prototype from wrong header file 2016-10-01 10:56:42 -06:00
Sagitta Li
9fa1024eef vector table should have dimension NR_IRQS, not NR_IRQS+1 2016-09-22 07:56:12 -06:00
Gregory Nutt
f0b4705d57 Correct a comment 2016-09-15 13:10:42 -06:00
Gregory Nutt
e3bbfa2d85 mq_send() was not setting the errno value on certain failures to allocate a message 2016-09-15 12:42:24 -06:00
Gregory Nutt
368f241637 Correct some comments 2016-09-15 08:46:41 -06:00
Gregory Nutt
952268274a sched/: Fix misplaced right bracket; remove redundant assertion. 2016-09-06 12:27:12 -06:00
Gregory Nutt
7582c2344c sched/: Eliminate calculation of a possibly unused value. 2016-09-06 10:28:19 -06:00
Gregory Nutt
e034c78516 improve some assertions; add some comments. 2016-09-06 10:21:41 -06:00
Gregory Nutt
27919549f1 sched/: Simplify some child/parent logic 2016-09-06 08:40:55 -06:00
Gregory Nutt
05aa586aa6 sched/: Move fields related to parent/child task relationship out of TCB into group structure. 2016-09-06 08:28:31 -06:00
Gregory Nutt
858af4295c The TCB nchildren field should not be incremented when pthreads are created. 2016-09-06 07:34:36 -06:00
Gregory Nutt
60b70f7dbb Make xorshift128 re-entrant so that we do do have to suffer the overhad of serialization controls. 2016-08-21 07:47:53 -06:00
Gregory Nutt
53b2de18eb Trivial typo fix 2016-08-20 13:23:41 -06:00
Gregory Nutt
300361539a sched/sched_cpuload_oneshot: Use the oneshot timer with optional entropy to measuer cPU load if so configured. 2016-08-20 12:47:07 -06:00
Gregory Nutt
6f833be9d5 Separate XorShift128 PRNG from /dev/urandom and make it generally available. 2016-08-20 11:36:02 -06:00
Gregory Nutt
5ea77118aa Explicitly initialize the group tg_exitsem with sem_init(). The existing logic worked because the correct initialization value is all zero, but it is better to initialize the semaphore explicitly. Noted by Jouko Holopainen. 2016-08-10 07:38:07 -06:00
Gregory Nutt
3404b3cb4a sched/: Review and correct some stylistic inconsistencies 2016-08-07 08:32:11 -06:00
Gregory Nutt
18ce4ff57b sched/: Review and correct some stylistic inconsistencies 2016-08-07 08:25:30 -06:00
Gregory Nutt
94d34bba47 Fix a typo in a Make.defs file 2016-07-28 09:46:28 -06:00
Gregory Nutt
309480d0f9 Merge branch 'timekeeping' of bitbucket.org:nuttx/nuttx 2016-07-28 09:34:00 -06:00
Gregory Nutt
7370d3171a Move include/nuttx/lib.h to include/nuttx/lib/lib.h 2016-07-21 14:05:44 -06:00
Gregory Nutt
246773faa7 Rename CONFIG_SCHED_TIMEKEEPING to CONFIG_CLOCK_TIMEKEEPING. That is a better compartmentalized name. 2016-07-11 06:54:02 -06:00
Gregory Nutt
f47b69e1f0 Add support for adjtime system call 2016-07-10 16:55:32 -06:00
Gregory Nutt
c326b6320a Add description of adjtime() from Linux man page 2016-07-10 16:47:06 -06:00
Max Neklyudov
8db29071da timekeeping: initial implementation 2016-07-10 16:14:25 -06:00
Gregory Nutt
830af912a1 Add sig_raise() 2016-07-04 09:32:36 -06:00
Paul A. Patience
891113dac9 sched/semaphore: Fix setting EINVAL in sem_post() and sem_wait() 2016-06-28 10:15:52 -04:00
Gregory Nutt
62d8f839c7 SYSLOG: Now a two phase initialization. Some SYSLOG channels cannot be initialized until later in the bringup 2016-06-21 07:52:24 -06:00
Gregory Nutt
2a751068e6 Without lowsyslog() *llerr() is not useful. Eliminate and replace with *err(). 2016-06-20 12:44:38 -06:00
Gregory Nutt
43eb04bb8f Without lowsyslog() *llinfo() is not useful. Eliminate and replace with *info(). 2016-06-20 11:59:15 -06:00
Gregory Nutt
f4c47636e7 SYSLOG: Debug output from the IDLE task should be forced like interrupt level output 2016-06-20 07:35:38 -06:00
Gregory Nutt
3fa41c0f18 Kconfig files: Fix some dependencies that have CONFIG_ in the variable name 2016-06-17 19:30:19 -06:00
Gregory Nutt
0c8c7fecf0 Add _ to the beginning of all debug macros to avoid name collisions 2016-06-16 12:33:32 -06:00
Gregory Nutt
f3ec664f63 Debug output level (error, warning, info) is now selectable on a per-subsystem, per-driver basis 2016-06-12 13:08:23 -06:00
Gregory Nutt
13cac3b592 sched/: Change some *err() message to *info() messages if what was a *dbg() message does not indicate and error condition. 2016-06-11 16:42:42 -06:00
Gregory Nutt
a1469a3e95 Add CONFIG_DEBUG_ERROR. Change names of *dbg() * *err() 2016-06-11 15:50:49 -06:00
Gregory Nutt
e99301d7c2 Rename *lldbg to *llerr 2016-06-11 14:55:27 -06:00
Gregory Nutt
86b79b33cf Reserver the name 'err' for other purposes 2016-06-11 14:40:07 -06:00
Gregory Nutt
1cdc746726 Rename CONFIG_DEBUG to CONFIG_DEBUG_FEATURES 2016-06-11 14:14:08 -06:00
Gregory Nutt
fc3540cffe Replace all occurrences of vdbg with vinfo 2016-06-11 11:59:51 -06:00
Gregory Nutt
3a74a438d9 Rename CONFIG_DEBUG_VERBOSE to CONFIG_DEBUG_INFO 2016-06-11 11:50:18 -06:00
Gregory Nutt
80d0b2736e Reorder some logic: (1) set initial CPU IDLE task regsters AFTER allocating stack, (2) invalidate cache in CPU start-up BEFORE handling first interrupt. 2016-05-22 15:01:49 -06:00
Gregory Nutt
07acd5327a SMP: Clean CPU0 D-Cache before starting new CPU; Invalidate D-Cache when new CPU started. 2016-05-20 12:39:02 -06:00
Gregory Nutt
32838fcc2c enter/leave_critical_section: In SMP configuration, may attempt to access the task lists before they have been initialized 2016-05-18 09:17:01 -06:00
Gregory Nutt
3d87005e5a Fix some compilation issues when certain combinations of debug options are selected. 2016-05-17 12:06:32 -06:00
Gregory Nutt
faca2fb1e7 ARMv7-A/i.MX6: Add logic to handle allocation of CPU IDLE thread stacks more efficiently 2016-05-13 11:39:42 -06:00
Gregory Nutt
70782b0f14 ARMv7-A i.MX6: More SMP logic. Still untested. 2016-05-12 15:04:46 -06:00
Gregory Nutt
c00e3e55dc Fix several places in DMA logic where a spurious semicolon causes bad conditional logic 2016-05-11 17:42:59 -06:00
Gregory Nutt
6cfe56202d Backout 3f731241cb. It is a good idea, but has some unpleasant side effect... like SYSLOG and dbg() no longer work 2016-04-18 18:55:36 -06:00