mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Drop sched_lock around the wakeup of the parent process after setting
the process state to zombie when a process exits to avoid a lock order reversal with the sleepqueue locks. This appears to be the only place that we call wakeup() with sched_lock held.
This commit is contained in:
parent
dd75b0a90d
commit
e5bb601d87
1 changed files with 9 additions and 4 deletions
|
|
@ -494,21 +494,26 @@ exit1(struct thread *td, int rv)
|
|||
PROC_LOCK(p);
|
||||
PROC_LOCK(p->p_pptr);
|
||||
sx_xunlock(&proctree_lock);
|
||||
mtx_lock_spin(&sched_lock);
|
||||
|
||||
while (mtx_owned(&Giant))
|
||||
mtx_unlock(&Giant);
|
||||
|
||||
/*
|
||||
* We have to wait until after acquiring all locks before
|
||||
* changing p_state. If we block on a mutex then we will be
|
||||
* back at SRUN when we resume and our parent will never
|
||||
* harvest us.
|
||||
* changing p_state. We need to avoid any possibly context
|
||||
* switches while marked as a zombie including blocking on
|
||||
* a mutex.
|
||||
*/
|
||||
mtx_lock_spin(&sched_lock);
|
||||
p->p_state = PRS_ZOMBIE;
|
||||
critical_enter();
|
||||
mtx_unlock_spin(&sched_lock);
|
||||
|
||||
wakeup(p->p_pptr);
|
||||
PROC_UNLOCK(p->p_pptr);
|
||||
|
||||
mtx_lock_spin(&sched_lock);
|
||||
critical_exit();
|
||||
cnt.v_swtch++;
|
||||
binuptime(PCPU_PTR(switchtime));
|
||||
PCPU_SET(switchticks, ticks);
|
||||
|
|
|
|||
Loading…
Reference in a new issue