Protect p_stat with sched_lock.

This commit is contained in:
jhb 2000-12-02 01:32:51 +00:00
parent 53f8c633d9
commit 6dfe475f40
2 changed files with 25 additions and 3 deletions

View File

@ -280,8 +280,12 @@ ptrace(curp, uap)
return EBUSY;
/* not currently stopped */
if (p->p_stat != SSTOP || (p->p_flag & P_WAITED) == 0)
mtx_enter(&sched_lock, MTX_SPIN);
if (p->p_stat != SSTOP || (p->p_flag & P_WAITED) == 0) {
mtx_exit(&sched_lock, MTX_SPIN);
return EBUSY;
}
mtx_exit(&sched_lock, MTX_SPIN);
/* OK */
break;
@ -363,11 +367,17 @@ ptrace(curp, uap)
sendsig:
/* deliver or queue signal */
s = splhigh();
mtx_enter(&sched_lock, MTX_SPIN);
if (p->p_stat == SSTOP) {
p->p_xstat = uap->data;
setrunnable(p);
} else if (uap->data) {
psignal(p, uap->data);
mtx_exit(&sched_lock, MTX_SPIN);
} else {
mtx_exit(&sched_lock, MTX_SPIN);
if (uap->data) {
mtx_assert(&Giant, MA_OWNED);
psignal(p, uap->data);
}
}
splx(s);
return 0;

View File

@ -2254,6 +2254,7 @@ ttyinfo(tp)
if (proc_compare(pick, p))
pick = p;
mtx_enter(&sched_lock, MTX_SPIN);
ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
pick->p_stat == SRUN ? "running" :
pick->p_wmesg ? pick->p_wmesg : "iowait");
@ -2278,6 +2279,7 @@ ttyinfo(tp)
pick->p_stat == SIDL || pick->p_stat == SWAIT ||
pick->p_stat == SZOMB ? 0 :
(long)pgtok(vmspace_resident_count(pick->p_vmspace)));
mtx_exit(&sched_lock, MTX_SPIN);
}
tp->t_rocount = 0; /* so pending input will be retyped if BS */
}
@ -2308,15 +2310,20 @@ proc_compare(p1, p2)
if (p1 == NULL)
return (1);
mtx_enter(&sched_lock, MTX_SPIN);
/*
* see if at least one of them is runnable
*/
switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
case ONLYA:
mtx_exit(&sched_lock, MTX_SPIN);
return (0);
case ONLYB:
mtx_exit(&sched_lock, MTX_SPIN);
return (1);
case BOTH:
mtx_exit(&sched_lock, MTX_SPIN);
/*
* tie - favor one with highest recent cpu utilization
*/
@ -2331,12 +2338,17 @@ proc_compare(p1, p2)
*/
switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
case ONLYA:
mtx_exit(&sched_lock, MTX_SPIN);
return (1);
case ONLYB:
mtx_exit(&sched_lock, MTX_SPIN);
return (0);
case BOTH:
mtx_exit(&sched_lock, MTX_SPIN);
return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
}
mtx_exit(&sched_lock, MTX_SPIN);
/*
* pick the one with the smallest sleep time
*/