PERFORCE change 29426 for review
John Baldwin
jhb at FreeBSD.org
Tue Apr 22 13:14:46 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29426
Change 29426 by jhb at jhb_laptop on 2003/04/22 13:14:36
IFC @29424 (loop back proc locking).
Affected files ...
.. //depot/projects/smpng/sys/dev/vinum/vinumdaemon.c#6 integrate
.. //depot/projects/smpng/sys/fs/procfs/procfs_ctl.c#18 integrate
.. //depot/projects/smpng/sys/geom/geom_ctl.c#8 integrate
.. //depot/projects/smpng/sys/geom/geom_ctl.h#3 integrate
.. //depot/projects/smpng/sys/i386/linux/linux_ptrace.c#7 integrate
.. //depot/projects/smpng/sys/kern/kern_thread.c#28 integrate
.. //depot/projects/smpng/sys/kern/sched_ule.c#7 integrate
.. //depot/projects/smpng/sys/kern/sys_process.c#27 integrate
.. //depot/projects/smpng/sys/sys/proc.h#81 integrate
.. //depot/projects/smpng/sys/vm/vm_fault.c#25 integrate
.. //depot/projects/smpng/sys/vm/vm_glue.c#23 integrate
.. //depot/projects/smpng/sys/vm/vm_pageout.c#27 integrate
Differences ...
==== //depot/projects/smpng/sys/dev/vinum/vinumdaemon.c#6 (text+ko) ====
@@ -35,7 +35,7 @@
* advised of the possibility of such damage.
*
* $Id: vinumdaemon.c,v 1.8 2000/01/03 05:22:03 grog Exp grog $
- * $FreeBSD: src/sys/dev/vinum/vinumdaemon.c,v 1.24 2003/01/03 05:57:34 phk Exp $
+ * $FreeBSD: src/sys/dev/vinum/vinumdaemon.c,v 1.25 2003/04/22 19:45:26 jhb Exp $
*/
#include <dev/vinum/vinumhdr.h>
@@ -71,10 +71,10 @@
PROC_LOCK(curproc);
curproc->p_flag |= P_SYSTEM; /* we're a system process */
- PROC_UNLOCK(curproc);
mtx_lock_spin(&sched_lock);
curproc->p_sflag |= PS_INMEM;
mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(curproc);
daemon_save_config(); /* start by saving the configuration */
daemonpid = curproc->p_pid; /* mark our territory */
while (1) {
==== //depot/projects/smpng/sys/fs/procfs/procfs_ctl.c#18 (text+ko) ====
@@ -38,7 +38,7 @@
*
* From:
* $Id: procfs_ctl.c,v 3.2 1993/12/15 09:40:17 jsp Exp $
- * $FreeBSD: src/sys/fs/procfs/procfs_ctl.c,v 1.49 2003/04/17 22:14:30 jhb Exp $
+ * $FreeBSD: src/sys/fs/procfs/procfs_ctl.c,v 1.50 2003/04/22 20:00:25 jhb Exp $
*/
#include <sys/param.h>
@@ -144,9 +144,7 @@
* Stop the target.
*/
p->p_flag |= P_TRACED;
- mtx_lock_spin(&sched_lock);
faultin(p);
- mtx_unlock_spin(&sched_lock);
p->p_xstat = 0; /* XXX ? */
if (p->p_pptr != td->td_proc) {
p->p_oppid = p->p_pptr->p_pid;
==== //depot/projects/smpng/sys/geom/geom_ctl.c#8 (text+ko) ====
@@ -32,7 +32,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/geom/geom_ctl.c,v 1.14 2003/04/03 11:19:24 phk Exp $
+ * $FreeBSD: src/sys/geom/geom_ctl.c,v 1.15 2003/04/22 19:42:05 phk Exp $
*/
#include "opt_geom.h"
@@ -151,13 +151,8 @@
!useracc(ap[i].value, ap[i].len,
ap[i].flag & GCTL_PARAM_RW))
error = gctl_error(req, "no access to param data");
- if (ap[i].name == NULL) {
- if (req->reqt->meta)
- continue;
- error = gctl_error(req,
- "request does not take metadata arguments");
+ if (error)
break;
- }
p = NULL;
if (ap[i].nlen < 1 || ap[i].nlen > SPECNAMELEN) {
error = gctl_error(req, "wrong param name length");
@@ -205,10 +200,7 @@
}
for (i = 0; i < req->narg; i++) {
ap = &req->arg[i];
- if (ap->name != NULL)
- printf(" param:\t\"%s\"", ap->name);
- else
- printf(" meta:\t@%jd", (intmax_t)ap->offset);
+ printf(" param:\t\"%s\"", ap->name);
printf(" [%s%s%d] = ",
ap->flag & GCTL_PARAM_RD ? "R" : "",
ap->flag & GCTL_PARAM_WR ? "W" : "",
==== //depot/projects/smpng/sys/geom/geom_ctl.h#3 (text+ko) ====
@@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/geom/geom_ctl.h,v 1.2 2003/03/27 14:34:59 phk Exp $
+ * $FreeBSD: src/sys/geom/geom_ctl.h,v 1.3 2003/04/22 19:42:05 phk Exp $
*/
#ifndef _GEOM_GEOM_CTL_H_
@@ -50,8 +50,6 @@
GCTL_DESTROY_PROVIDER,
GCTL_INSERT_GEOM,
GCTL_ELIMINATE_GEOM,
- GCTL_WRITE_META,
- GCTL_READ_META
};
#ifdef GCTL_TABLE
@@ -61,24 +59,21 @@
int provider;
int consumer;
int params;
- int meta;
char *name;
enum gctl_request request;
} gcrt[] = {
-/* Cl Ge Pr Co Pa Me Name Request */
- { 1, 0, 1, 0, 1, 0, "create geom", GCTL_CREATE_GEOM },
- { 0, 1, 0, 0, 1, 0, "destroy geom", GCTL_DESTROY_GEOM },
- { 0, 1, 1, 0, 1, 0, "attach", GCTL_ATTACH },
- { 0, 1, 1, 0, 1, 0, "detach", GCTL_DETACH },
- { 0, 1, 0, 0, 1, 0, "create provider", GCTL_CREATE_PROVIDER },
- { 0, 1, 1, 0, 1, 0, "destroy provider", GCTL_DESTROY_PROVIDER },
- { 1, 1, 1, 0, 1, 0, "insert geom", GCTL_INSERT_GEOM },
- { 0, 1, 0, 0, 1, 0, "eliminate geom", GCTL_ELIMINATE_GEOM },
- { 0, 1, 0, 0, 1, 1, "write meta", GCTL_WRITE_META },
- { 0, 1, 0, 0, 1, 1, "read meta", GCTL_READ_META },
+/* Cl Ge Pr Co Pa Name Request */
+ { 1, 0, 1, 0, 1, "create geom", GCTL_CREATE_GEOM },
+ { 0, 1, 0, 0, 1, "destroy geom", GCTL_DESTROY_GEOM },
+ { 0, 1, 1, 0, 1, "attach", GCTL_ATTACH },
+ { 0, 1, 1, 0, 1, "detach", GCTL_DETACH },
+ { 0, 1, 0, 0, 1, "create provider", GCTL_CREATE_PROVIDER },
+ { 0, 1, 1, 0, 1, "destroy provider", GCTL_DESTROY_PROVIDER },
+ { 1, 1, 1, 0, 1, "insert geom", GCTL_INSERT_GEOM },
+ { 0, 1, 0, 0, 1, "eliminate geom", GCTL_ELIMINATE_GEOM },
/* Terminator entry */
- { 1, 1, 1, 1, 1, 1, "*INVALID*", GCTL_INVALID_REQUEST }
+ { 1, 1, 1, 1, 1, "*INVALID*", GCTL_INVALID_REQUEST }
};
#endif /* GCTL_TABLE */
==== //depot/projects/smpng/sys/i386/linux/linux_ptrace.c#7 (text+ko) ====
@@ -25,7 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/i386/linux/linux_ptrace.c,v 1.10 2003/04/15 16:29:39 jhb Exp $
+ * $FreeBSD: src/sys/i386/linux/linux_ptrace.c,v 1.11 2003/04/22 20:01:56 jhb Exp $
*/
#include "opt_cpu.h"
@@ -222,31 +222,23 @@
static int
linux_proc_read_fpxregs(struct thread *td, struct linux_pt_fpxreg *fpxregs)
{
- int error;
- error = 0;
- mtx_lock_spin(&sched_lock);
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
if (cpu_fxsr == 0 || (td->td_proc->p_sflag & PS_INMEM) == 0)
- error = EIO;
- else
- bcopy(&td->td_pcb->pcb_save.sv_xmm, fpxregs, sizeof(*fpxregs));
- mtx_unlock_spin(&sched_lock);
- return (error);
+ return (EIO);
+ bcopy(&td->td_pcb->pcb_save.sv_xmm, fpxregs, sizeof(*fpxregs));
+ return (0);
}
static int
linux_proc_write_fpxregs(struct thread *td, struct linux_pt_fpxreg *fpxregs)
{
- int error;
- error = 0;
- mtx_lock_spin(&sched_lock);
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
if (cpu_fxsr == 0 || (td->td_proc->p_sflag & PS_INMEM) == 0)
- error = EIO;
- else
- bcopy(fpxregs, &td->td_pcb->pcb_save.sv_xmm, sizeof(*fpxregs));
- mtx_unlock_spin(&sched_lock);
- return (error);
+ return (EIO);
+ bcopy(fpxregs, &td->td_pcb->pcb_save.sv_xmm, sizeof(*fpxregs));
+ return (0);
}
#endif
==== //depot/projects/smpng/sys/kern/kern_thread.c#28 (text+ko) ====
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
- * $FreeBSD: src/sys/kern/kern_thread.c,v 1.121 2003/04/21 14:42:04 davidxu Exp $
+ * $FreeBSD: src/sys/kern/kern_thread.c,v 1.122 2003/04/22 19:47:55 jhb Exp $
*/
#include <sys/param.h>
@@ -1311,7 +1311,7 @@
* Purge a ksegrp resource. When a ksegrp is preparing to
* exit, it calls this function.
*/
-void
+static void
kse_purge_group(struct thread *td)
{
struct ksegrp *kg;
@@ -1336,14 +1336,13 @@
* exit, it calls kse_purge to release any extra KSE resources in
* the process.
*/
-void
+static void
kse_purge(struct proc *p, struct thread *td)
{
struct ksegrp *kg;
struct kse *ke;
KASSERT(p->p_numthreads == 1, ("bad thread number"));
- mtx_lock_spin(&sched_lock);
while ((kg = TAILQ_FIRST(&p->p_ksegrps)) != NULL) {
TAILQ_REMOVE(&p->p_ksegrps, kg, kg_ksegrp);
p->p_numksegrps--;
@@ -1373,7 +1372,6 @@
}
TAILQ_INSERT_HEAD(&p->p_ksegrps, td->td_ksegrp, kg_ksegrp);
p->p_numksegrps++;
- mtx_unlock_spin(&sched_lock);
}
/*
@@ -1969,12 +1967,12 @@
* and stays there.
*/
thread_suspend_one(td);
- PROC_UNLOCK(p);
if (P_SHOULDSTOP(p) == P_STOPPED_SINGLE) {
if (p->p_numthreads == p->p_suspcount) {
thread_unsuspend_one(p->p_singlethread);
}
}
+ PROC_UNLOCK(p);
p->p_stats->p_ru.ru_nivcsw++;
mi_switch();
mtx_unlock_spin(&sched_lock);
==== //depot/projects/smpng/sys/kern/sched_ule.c#7 (text+ko) ====
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/kern/sched_ule.c,v 1.29 2003/04/18 05:24:10 jeff Exp $
+ * $FreeBSD: src/sys/kern/sched_ule.c,v 1.30 2003/04/22 19:48:25 jhb Exp $
*/
#include <sys/param.h>
@@ -1138,7 +1138,9 @@
pctcpu = (FSCALE * ((FSCALE * rtick)/realstathz)) >> FSHIFT;
}
+ mtx_lock_spin(&sched_lock);
ke->ke_proc->p_swtime = ke->ke_ltick - ke->ke_ftick;
+ mtx_unlock_spin(&sched_lock);
return (pctcpu);
}
==== //depot/projects/smpng/sys/kern/sys_process.c#27 (text+ko) ====
@@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/kern/sys_process.c,v 1.106 2003/04/17 22:31:54 jhb Exp $
+ * $FreeBSD: src/sys/kern/sys_process.c,v 1.107 2003/04/22 20:01:56 jhb Exp $
*/
#include <sys/param.h>
@@ -82,12 +82,11 @@
#define PROC_ACTION(action) do { \
int error; \
\
- mtx_lock_spin(&sched_lock); \
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED); \
if ((td->td_proc->p_sflag & PS_INMEM) == 0) \
error = EIO; \
else \
error = (action); \
- mtx_unlock_spin(&sched_lock); \
return (error); \
} while(0)
==== //depot/projects/smpng/sys/sys/proc.h#81 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)proc.h 8.15 (Berkeley) 5/19/95
- * $FreeBSD: src/sys/sys/proc.h,v 1.319 2003/04/21 07:02:37 davidxu Exp $
+ * $FreeBSD: src/sys/sys/proc.h,v 1.320 2003/04/22 20:00:25 jhb Exp $
*/
#ifndef _SYS_PROC_H_
@@ -666,8 +666,8 @@
#define PS_ALRMPEND 0x00020 /* Pending SIGVTALRM needs to be posted. */
#define PS_PROFPEND 0x00040 /* Pending SIGPROF needs to be posted. */
#define PS_SWAPINREQ 0x00100 /* Swapin request due to wakeup. */
-#define PS_SWAPPING 0x00200 /* Process is being swapped. */
-#define PS_SWAPPINGIN 0x04000 /* Swapin in progress. */
+#define PS_SWAPPINGOUT 0x00200 /* Process is being swapped out. */
+#define PS_SWAPPINGIN 0x04000 /* Process is being swapped in. */
#define PS_MACPEND 0x08000 /* Ast()-based MAC event pending. */
/* used only in legacy conversion code */
@@ -775,11 +775,9 @@
} while (0)
#define _PHOLD(p) do { \
PROC_LOCK_ASSERT((p), MA_OWNED); \
- if ((p)->p_lock++ == 0) { \
- mtx_lock_spin(&sched_lock); \
+ (p)->p_lock++; \
+ if (((p)->p_sflag & PS_INMEM) == 0) \
faultin((p)); \
- mtx_unlock_spin(&sched_lock); \
- } \
} while (0)
#define PRELE(p) do { \
==== //depot/projects/smpng/sys/vm/vm_fault.c#25 (text+ko) ====
@@ -66,7 +66,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $FreeBSD: src/sys/vm/vm_fault.c,v 1.166 2003/04/20 19:25:28 alc Exp $
+ * $FreeBSD: src/sys/vm/vm_fault.c,v 1.167 2003/04/22 20:01:56 jhb Exp $
*/
/*
@@ -917,15 +917,16 @@
}
vm_page_wakeup(fs.m);
vm_page_unlock_queues();
- mtx_lock_spin(&sched_lock);
- if (curproc && (curproc->p_sflag & PS_INMEM) && curproc->p_stats) {
+
+ PROC_LOCK(curproc);
+ if ((curproc->p_sflag & PS_INMEM) && curproc->p_stats) {
if (hardfault) {
curproc->p_stats->p_ru.ru_majflt++;
} else {
curproc->p_stats->p_ru.ru_minflt++;
}
}
- mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(curproc);
/*
* Unlock everything, and return
==== //depot/projects/smpng/sys/vm/vm_glue.c#23 (text+ko) ====
@@ -59,7 +59,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $FreeBSD: src/sys/vm/vm_glue.c,v 1.165 2003/04/17 15:44:22 trhodes Exp $
+ * $FreeBSD: src/sys/vm/vm_glue.c,v 1.166 2003/04/22 20:00:26 jhb Exp $
*/
#include "opt_vm.h"
@@ -355,14 +355,12 @@
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
PROC_LOCK(p);
- mtx_lock_spin(&sched_lock);
object = p->p_upages_obj;
if (object != NULL &&
swap_pager_isswapped(p->p_upages_obj, devidx)) {
sx_sunlock(&allproc_lock);
faultin(p);
- mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
vm_page_lock_queues();
TAILQ_FOREACH(m, &object->memq, listq)
@@ -373,7 +371,6 @@
goto retry;
}
- mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
}
sx_sunlock(&allproc_lock);
@@ -516,51 +513,49 @@
faultin(p)
struct proc *p;
{
+ struct thread *td;
GIANT_REQUIRED;
PROC_LOCK_ASSERT(p, MA_OWNED);
- mtx_assert(&sched_lock, MA_OWNED);
#ifdef NO_SWAPPING
if ((p->p_sflag & PS_INMEM) == 0)
panic("faultin: proc swapped out with NO_SWAPPING!");
#else
- if ((p->p_sflag & PS_INMEM) == 0) {
- struct thread *td;
-
- ++p->p_lock;
+ /*
+ * If another process is swapping in this process,
+ * just wait until it finishes.
+ */
+ if (p->p_sflag & PS_SWAPPINGIN)
+ msleep(&p->p_sflag, &p->p_mtx, PVM, "faultin", 0);
+ else if ((p->p_sflag & PS_INMEM) == 0) {
/*
- * If another process is swapping in this process,
- * just wait until it finishes.
+ * Don't let another thread swap process p out while we are
+ * busy swapping it in.
*/
- if (p->p_sflag & PS_SWAPPINGIN) {
- mtx_unlock_spin(&sched_lock);
- msleep(&p->p_sflag, &p->p_mtx, PVM, "faultin", 0);
- mtx_lock_spin(&sched_lock);
- --p->p_lock;
- return;
- }
-
+ ++p->p_lock;
+ mtx_lock_spin(&sched_lock);
p->p_sflag |= PS_SWAPPINGIN;
mtx_unlock_spin(&sched_lock);
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)
+ FOREACH_THREAD_IN_PROC(p, td) {
+ TD_CLR_SWAPPED(td);
if (TD_CAN_RUN(td))
setrunnable(td);
+ }
+ mtx_unlock_spin(&sched_lock);
wakeup(&p->p_sflag);
- /* undo the effect of setting SLOCK above */
+ /* Allow other threads to swap p out now. */
--p->p_lock;
}
#endif
@@ -600,7 +595,7 @@
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
struct ksegrp *kg;
- if (p->p_sflag & (PS_INMEM | PS_SWAPPING | PS_SWAPPINGIN)) {
+ if (p->p_sflag & (PS_INMEM | PS_SWAPPINGOUT | PS_SWAPPINGIN)) {
continue;
}
mtx_lock_spin(&sched_lock);
@@ -641,20 +636,20 @@
goto loop;
}
PROC_LOCK(p);
- mtx_lock_spin(&sched_lock);
/*
* Another process may be bringing or may have already
* brought this process in while we traverse all threads.
* Or, this process may even be being swapped out again.
*/
- if (p->p_sflag & (PS_INMEM|PS_SWAPPING|PS_SWAPPINGIN)) {
- mtx_unlock_spin(&sched_lock);
+ if (p->p_sflag & (PS_INMEM | PS_SWAPPINGOUT | PS_SWAPPINGIN)) {
PROC_UNLOCK(p);
goto loop;
}
+ mtx_lock_spin(&sched_lock);
p->p_sflag &= ~PS_SWAPINREQ;
+ mtx_unlock_spin(&sched_lock);
/*
* We would like to bring someone in. (only if there is space).
@@ -662,6 +657,7 @@
*/
faultin(p);
PROC_UNLOCK(p);
+ mtx_lock_spin(&sched_lock);
p->p_swtime = 0;
mtx_unlock_spin(&sched_lock);
goto loop;
@@ -768,10 +764,10 @@
* skipped because of the if statement above checking
* for P_SYSTEM
*/
+ if ((p->p_sflag & (PS_INMEM|PS_SWAPPINGOUT|PS_SWAPPINGIN)) != PS_INMEM)
+ goto nextproc2;
+
mtx_lock_spin(&sched_lock);
- if ((p->p_sflag & (PS_INMEM|PS_SWAPPING|PS_SWAPPINGIN)) != PS_INMEM)
- goto nextproc;
-
switch (p->p_state) {
default:
/* Don't swap out processes in any sort
@@ -832,12 +828,8 @@
(minslptime > swap_idle_threshold2))) {
swapout(p);
didswap++;
-
- /*
- * swapout() unlocks a proc lock. This is
- * ugly, but avoids superfluous lock.
- */
mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(p);
vm_map_unlock(&vm->vm_map);
vmspace_free(vm);
sx_sunlock(&allproc_lock);
@@ -879,7 +871,7 @@
* by now. Assuming that there is only one pageout daemon thread,
* this process should still be in memory.
*/
- KASSERT((p->p_sflag & (PS_INMEM|PS_SWAPPING|PS_SWAPPINGIN)) == PS_INMEM,
+ KASSERT((p->p_sflag & (PS_INMEM|PS_SWAPPINGOUT|PS_SWAPPINGIN)) == PS_INMEM,
("swapout: lost a swapout race?"));
#if defined(INVARIANTS)
@@ -900,18 +892,20 @@
*/
p->p_vmspace->vm_swrss = vmspace_resident_count(p->p_vmspace);
+ p->p_sflag &= ~PS_INMEM;
+ p->p_sflag |= PS_SWAPPINGOUT;
PROC_UNLOCK(p);
- p->p_sflag &= ~PS_INMEM;
- p->p_sflag |= PS_SWAPPING;
+ FOREACH_THREAD_IN_PROC(p, td)
+ TD_SET_SWAPPED(td);
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);
- }
+
+ PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
- p->p_sflag &= ~PS_SWAPPING;
+ p->p_sflag &= ~PS_SWAPPINGOUT;
p->p_swtime = 0;
}
#endif /* !NO_SWAPPING */
==== //depot/projects/smpng/sys/vm/vm_pageout.c#27 (text+ko) ====
@@ -65,7 +65,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $FreeBSD: src/sys/vm/vm_pageout.c,v 1.230 2003/04/20 20:37:14 alc Exp $
+ * $FreeBSD: src/sys/vm/vm_pageout.c,v 1.231 2003/04/22 20:03:08 jhb Exp $
*/
/*
@@ -1543,7 +1543,9 @@
* if this is a system process or if we have already
* looked at this process, skip it.
*/
+ PROC_LOCK(p);
if (p->p_flag & (P_SYSTEM | P_WEXIT)) {
+ PROC_UNLOCK(p);
continue;
}
/*
@@ -1560,8 +1562,9 @@
break;
}
}
+ mtx_unlock_spin(&sched_lock);
if (breakout) {
- mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(p);
continue;
}
/*
@@ -1578,7 +1581,7 @@
*/
if ((p->p_sflag & PS_INMEM) == 0)
limit = 0; /* XXX */
- mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(p);
size = vmspace_resident_count(p->p_vmspace);
if (limit >= 0 && size >= limit) {
More information about the p4-projects
mailing list