Lock and unlock sched_lock when walking through thread list, current we

insert kse upcall thread into thread list at mi_switch time, process lock
is not enough.
This commit is contained in:
David Xu 2003-12-07 23:47:15 +00:00
parent b01a62069f
commit a9a48d6862
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=123273

View File

@ -395,8 +395,10 @@ kern_sigaction(td, sig, act, oact, flags)
} }
/* never to be seen again */ /* never to be seen again */
SIGDELSET(p->p_siglist, sig); SIGDELSET(p->p_siglist, sig);
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td0) FOREACH_THREAD_IN_PROC(p, td0)
SIGDELSET(td0->td_siglist, sig); SIGDELSET(td0->td_siglist, sig);
mtx_unlock_spin(&sched_lock);
if (sig != SIGCONT) if (sig != SIGCONT)
/* easier in psignal */ /* easier in psignal */
SIGADDSET(ps->ps_sigignore, sig); SIGADDSET(ps->ps_sigignore, sig);
@ -1589,10 +1591,13 @@ sigtd(struct proc *p, int sig, int prop)
* way to deliver signal. * way to deliver signal.
*/ */
signal_td = NULL; signal_td = NULL;
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td) { FOREACH_THREAD_IN_PROC(p, td) {
if (td->td_waitset != NULL && if (td->td_waitset != NULL &&
SIGISMEMBER(*(td->td_waitset), sig)) SIGISMEMBER(*(td->td_waitset), sig)) {
mtx_unlock_spin(&sched_lock);
return (td); return (td);
}
if (!SIGISMEMBER(td->td_sigmask, sig)) { if (!SIGISMEMBER(td->td_sigmask, sig)) {
if (td == curthread) if (td == curthread)
signal_td = curthread; signal_td = curthread;
@ -1602,6 +1607,7 @@ sigtd(struct proc *p, int sig, int prop)
} }
if (signal_td == NULL) if (signal_td == NULL)
signal_td = FIRST_THREAD_IN_PROC(p); signal_td = FIRST_THREAD_IN_PROC(p);
mtx_unlock_spin(&sched_lock);
return (signal_td); return (signal_td);
} }
@ -1741,8 +1747,10 @@ do_tdsignal(struct thread *td, int sig, sigtarget_t target)
* XXX Should investigate leaving STOP and CONT sigs only in * XXX Should investigate leaving STOP and CONT sigs only in
* the proc's siglist. * the proc's siglist.
*/ */
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td0) FOREACH_THREAD_IN_PROC(p, td0)
SIG_STOPSIGMASK(td0->td_siglist); SIG_STOPSIGMASK(td0->td_siglist);
mtx_unlock_spin(&sched_lock);
} }
if (prop & SA_STOP) { if (prop & SA_STOP) {
@ -1757,8 +1765,10 @@ do_tdsignal(struct thread *td, int sig, sigtarget_t target)
(action == SIG_DFL)) (action == SIG_DFL))
return; return;
SIG_CONTSIGMASK(p->p_siglist); SIG_CONTSIGMASK(p->p_siglist);
mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td0) FOREACH_THREAD_IN_PROC(p, td0)
SIG_CONTSIGMASK(td0->td_siglist); SIG_CONTSIGMASK(td0->td_siglist);
mtx_unlock_spin(&sched_lock);
p->p_flag &= ~P_CONTINUED; p->p_flag &= ~P_CONTINUED;
} }