kernel/mutex: Fix locking to be SMP-safe
The mutex locking was written to use k_sched_lock(), which doesn't work as a synchronization primitive if there is another CPU running (it prevents the current CPU from preempting the thread, it says nothing about what the others are doing). Use the pre-existing spinlock for all synchronization. One wrinkle is that the priority code was needing to call z_thread_priority_set(), which is a rescheduling call that cannot be called with a lock held. So that got split out with a low level utility that can update the schedule state but allow the caller to defer yielding until later. Fixes #17584 Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
This commit is contained in:
parent
77719b81e9
commit
6f13980fc7
3 changed files with 28 additions and 14 deletions
|
@ -51,6 +51,7 @@ struct k_thread *z_unpend_first_thread(_wait_q_t *wait_q);
|
|||
void z_unpend_thread(struct k_thread *thread);
|
||||
int z_unpend_all(_wait_q_t *wait_q);
|
||||
void z_thread_priority_set(struct k_thread *thread, int prio);
|
||||
bool z_set_prio(struct k_thread *thread, int prio);
|
||||
void *z_get_next_switch_handle(void *interrupted);
|
||||
struct k_thread *z_find_first_thread_to_unpend(_wait_q_t *wait_q,
|
||||
struct k_thread *from);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue