mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-16 10:20:30 +00:00
Protect p_stat with sched_lock.
This commit is contained in:
parent
3cd59d7b9c
commit
0ebabc93a4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=69506
@ -280,8 +280,12 @@ ptrace(curp, uap)
|
|||||||
return EBUSY;
|
return EBUSY;
|
||||||
|
|
||||||
/* not currently stopped */
|
/* 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;
|
return EBUSY;
|
||||||
|
}
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
|
|
||||||
/* OK */
|
/* OK */
|
||||||
break;
|
break;
|
||||||
@ -363,11 +367,17 @@ ptrace(curp, uap)
|
|||||||
sendsig:
|
sendsig:
|
||||||
/* deliver or queue signal */
|
/* deliver or queue signal */
|
||||||
s = splhigh();
|
s = splhigh();
|
||||||
|
mtx_enter(&sched_lock, MTX_SPIN);
|
||||||
if (p->p_stat == SSTOP) {
|
if (p->p_stat == SSTOP) {
|
||||||
p->p_xstat = uap->data;
|
p->p_xstat = uap->data;
|
||||||
setrunnable(p);
|
setrunnable(p);
|
||||||
} else if (uap->data) {
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
psignal(p, uap->data);
|
} else {
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
|
if (uap->data) {
|
||||||
|
mtx_assert(&Giant, MA_OWNED);
|
||||||
|
psignal(p, uap->data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
splx(s);
|
splx(s);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2254,6 +2254,7 @@ ttyinfo(tp)
|
|||||||
if (proc_compare(pick, p))
|
if (proc_compare(pick, p))
|
||||||
pick = p;
|
pick = p;
|
||||||
|
|
||||||
|
mtx_enter(&sched_lock, MTX_SPIN);
|
||||||
ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
|
ttyprintf(tp, " cmd: %s %d [%s] ", pick->p_comm, pick->p_pid,
|
||||||
pick->p_stat == SRUN ? "running" :
|
pick->p_stat == SRUN ? "running" :
|
||||||
pick->p_wmesg ? pick->p_wmesg : "iowait");
|
pick->p_wmesg ? pick->p_wmesg : "iowait");
|
||||||
@ -2278,6 +2279,7 @@ ttyinfo(tp)
|
|||||||
pick->p_stat == SIDL || pick->p_stat == SWAIT ||
|
pick->p_stat == SIDL || pick->p_stat == SWAIT ||
|
||||||
pick->p_stat == SZOMB ? 0 :
|
pick->p_stat == SZOMB ? 0 :
|
||||||
(long)pgtok(vmspace_resident_count(pick->p_vmspace)));
|
(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 */
|
tp->t_rocount = 0; /* so pending input will be retyped if BS */
|
||||||
}
|
}
|
||||||
@ -2308,15 +2310,20 @@ proc_compare(p1, p2)
|
|||||||
|
|
||||||
if (p1 == NULL)
|
if (p1 == NULL)
|
||||||
return (1);
|
return (1);
|
||||||
|
|
||||||
|
mtx_enter(&sched_lock, MTX_SPIN);
|
||||||
/*
|
/*
|
||||||
* see if at least one of them is runnable
|
* see if at least one of them is runnable
|
||||||
*/
|
*/
|
||||||
switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
|
switch (TESTAB(ISRUN(p1), ISRUN(p2))) {
|
||||||
case ONLYA:
|
case ONLYA:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
return (0);
|
return (0);
|
||||||
case ONLYB:
|
case ONLYB:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
return (1);
|
return (1);
|
||||||
case BOTH:
|
case BOTH:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
/*
|
/*
|
||||||
* tie - favor one with highest recent cpu utilization
|
* 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)) {
|
switch (TESTAB(p1->p_stat == SZOMB, p2->p_stat == SZOMB)) {
|
||||||
case ONLYA:
|
case ONLYA:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
return (1);
|
return (1);
|
||||||
case ONLYB:
|
case ONLYB:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
return (0);
|
return (0);
|
||||||
case BOTH:
|
case BOTH:
|
||||||
|
mtx_exit(&sched_lock, MTX_SPIN);
|
||||||
return (p2->p_pid > p1->p_pid); /* tie - return highest pid */
|
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
|
* pick the one with the smallest sleep time
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user