diff options
author | Julian Elischer <julian@FreeBSD.org> | 2002-09-11 08:13:56 +0000 |
---|---|---|
committer | Julian Elischer <julian@FreeBSD.org> | 2002-09-11 08:13:56 +0000 |
commit | 71fad9fdeefd5d874768802125f98ea6450cfa5c (patch) | |
tree | 10514ece7d621a24c034e4c778c793b9ea2d9675 /sys/vm/vm_glue.c | |
parent | 527eee2d404ad5415be0b17e0403d29f3ea924c3 (diff) | |
download | src-71fad9fdeefd5d874768802125f98ea6450cfa5c.tar.gz src-71fad9fdeefd5d874768802125f98ea6450cfa5c.zip |
Completely redo thread states.
Reviewed by: davidxu@freebsd.org
Notes
Notes:
svn path=/head/; revision=103216
Diffstat (limited to 'sys/vm/vm_glue.c')
-rw-r--r-- | sys/vm/vm_glue.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 41e1719cc118..fd18159930aa 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -499,16 +499,18 @@ faultin(p) PROC_UNLOCK(p); vm_proc_swapin(p); - FOREACH_THREAD_IN_PROC (p, td) + FOREACH_THREAD_IN_PROC (p, td) { pmap_swapin_thread(td); + TD_CLR_SWAPPED(td); + } PROC_LOCK(p); mtx_lock_spin(&sched_lock); p->p_sflag &= ~PS_SWAPPINGIN; p->p_sflag |= PS_INMEM; FOREACH_THREAD_IN_PROC (p, td) - if (td->td_state == TDS_SWAPPED) - setrunqueue(td); + if (TD_CAN_RUN(td)) + setrunnable(td); wakeup(&p->p_sflag); @@ -558,10 +560,11 @@ loop: mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td) { /* - * A runnable thread of a process swapped out is in - * TDS_SWAPPED. + * An otherwise runnable thread of a process + * swapped out has only the TDI_SWAPPED bit set. + * */ - if (td->td_state == TDS_SWAPPED) { + if (td->td_inhibitors == TDI_SWAPPED) { kg = td->td_ksegrp; pri = p->p_swtime + kg->kg_slptime; if ((p->p_sflag & PS_SWAPINREQ) == 0) { @@ -849,18 +852,20 @@ swapout(p) p->p_vmspace->vm_swrss = vmspace_resident_count(p->p_vmspace); PROC_UNLOCK(p); - FOREACH_THREAD_IN_PROC (p, td) - if (td->td_state == TDS_RUNQ) { /* XXXKSE */ + FOREACH_THREAD_IN_PROC (p, td) /* shouldn't be possible, but..... */ + if (TD_ON_RUNQ(td)) { /* XXXKSE */ + panic("swapping out runnable process"); remrunqueue(td); /* XXXKSE */ - td->td_state = TDS_SWAPPED; } p->p_sflag &= ~PS_INMEM; p->p_sflag |= PS_SWAPPING; mtx_unlock_spin(&sched_lock); vm_proc_swapout(p); - FOREACH_THREAD_IN_PROC(p, td) + FOREACH_THREAD_IN_PROC(p, td) { pmap_swapout_thread(td); + TD_SET_SWAPPED(td); + } mtx_lock_spin(&sched_lock); p->p_sflag &= ~PS_SWAPPING; p->p_swtime = 0; |