PERFORCE change 99646 for review

Kip Macy kip.macy at gmail.com
Wed Jun 21 05:16:36 UTC 2006


Actually rwlocks would probably be best - but they're sx locks right
now to make WITNESS happy. Any speedup that comes won't come from
being shared, as the allproc lock was shared, it will come from making
the process lists per-cpu so that fork, exit, and functions scanning
the process lists won't be serialized across all cpus.

 -Kip

On 6/19/06, Andrew R. Reiter <arr at watson.org> wrote:
> On Mon, 19 Jun 2006, Kip Macy wrote:
>
> :http://perforce.freebsd.org/chv.cgi?CH=99646
> :
> :Change 99646 by kmacy at kmacy_storage:sun4v_work_sleepq on 2006/06/19 23:29:26
> :
> :       convert pcpu allproc locks to sx to avoid having to fix cases where
> :       sx locks are being acquired afterwards
> :       add 2 missed unlocks
>
> Nice.  Good thought.  I have seen the recent "benchmark" SMP emails and am
> not aggro like DT, so I don't care about too much detail; however, do you
> believe the switch from straight mutex locks to shared/exclusive locks
> will assist in some performance areas?
>
> Thanks for your work,
> Andrew
>
> :
> :Affected files ...
> :
> :.. //depot/projects/kmacy_sun4v/src/sys/fs/pseudofs/pseudofs_vnops.c#4 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/imgact_elf.c#4 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/init_main.c#7 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_descrip.c#5 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_exit.c#6 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_fork.c#6 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_ktrace.c#5 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_proc.c#5 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_resource.c#6 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/kern_sig.c#9 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/sched_4bsd.c#9 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/subr_pcpu.c#4 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/subr_witness.c#7 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/kern/sys_process.c#6 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#15 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/sys/pcpu.h#4 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#7 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/vm/vm_glue.c#7 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/vm/vm_meter.c#5 edit
> :.. //depot/projects/kmacy_sun4v/src/sys/vm/vm_pageout.c#4 edit
> :
> :Differences ...
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/fs/pseudofs/pseudofs_vnops.c#4 (text+ko) ====
> :
> :@@ -568,18 +568,18 @@
> :               /* next process */
> :               if (*p == NULL) {
> :                       *p = LIST_FIRST(&(*pc)->pc_allproc);
> :-                      PCPU_PROC_LOCK(*pc);
> :+                      PCPU_PROC_RLOCK(*pc);
> :               } else if ((LIST_NEXT(*p, p_list) == NULL) && (SLIST_NEXT(*pc, pc_allcpu) != NULL)) {
> :-                      PCPU_PROC_UNLOCK(*pc);
> :+                      PCPU_PROC_RUNLOCK(*pc);
> :                       *pc = SLIST_NEXT(*pc, pc_allcpu);
> :-                      PCPU_PROC_LOCK(*pc);
> :+                      PCPU_PROC_RLOCK(*pc);
> :                       *p = LIST_FIRST(&(*pc)->pc_allproc);
> :               } else {
> :                       *p = LIST_NEXT(*p, p_list);
> :               }
> :               /* out of processes: next node */
> :               if (*p == NULL) {
> :-                      PCPU_PROC_UNLOCK(*pc);
> :+                      PCPU_PROC_RUNLOCK(*pc);
> :                       *pn = (*pn)->pn_next;
> :               }
> :       }
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/imgact_elf.c#4 (text+ko) ====
> :
> :@@ -147,14 +147,14 @@
> :
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :-
> :                       if (p->p_sysent == entry->sysvec) {
> :                               rval = TRUE;
> :                               break;
> :                       }
> :               }
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/init_main.c#7 (text+ko) ====
> :
> :@@ -539,12 +539,12 @@
> :
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       microuptime(&p->p_stats->p_start);
> :                       p->p_rux.rux_runtime = 0;
> :               }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :       PCPU_SET(switchtime, cpu_ticks());
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_descrip.c#5 (text+ko) ====
> :
> :@@ -2357,7 +2357,7 @@
> :
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       fdp = fdhold(p);
> :                       if (fdp == NULL)
> :@@ -2379,7 +2379,7 @@
> :                       while (nrele--)
> :                               vrele(olddp);
> :               }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :       if (rootvnode == olddp) {
> :@@ -2459,7 +2459,7 @@
> :       xf.xf_size = sizeof(xf);
> :         sx_slock(&allpcpu_lock);
> :         SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                PCPU_PROC_LOCK(pc);
> :+                PCPU_PROC_RLOCK(pc);
> :                 LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       if (p->p_state == PRS_NEW)
> :                               continue;
> :@@ -2496,7 +2496,7 @@
> :                       if (error)
> :                               break;
> :               }
> :-                PCPU_PROC_UNLOCK(pc);
> :+                PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :       return (error);
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_exit.c#6 (text+ko) ====
> :
> :@@ -403,15 +403,10 @@
> :        * Remove proc from allproc queue and pidhash chain.
> :        * Place onto zombproc.  Unlink from parent's child list.
> :        */
> :-      if (p->p_pcpu == NULL)
> :-              panic("process: %d has null pcpu pointer", p->p_pid);
> :-      if (!mtx_initialized(&(p->p_pcpu->pc_allproc_lock)))
> :-              panic("null allproc lock on %d", p->p_pcpu->pc_cpuid);
> :-
> :-      PCPU_PROC_LOCK(p->p_pcpu);
> :+      PCPU_PROC_WLOCK(p->p_pcpu);
> :       LIST_REMOVE(p, p_list);
> :       LIST_INSERT_HEAD(&p->p_pcpu->pc_zombproc, p, p_list);
> :-      PCPU_PROC_UNLOCK(p->p_pcpu);
> :+      PCPU_PROC_WUNLOCK(p->p_pcpu);
> :
> :       mtx_lock(&pidhash_lock);
> :       LIST_REMOVE(p, p_hash);
> :@@ -770,9 +765,9 @@
> :                        * we have an exclusive reference.
> :                        */
> :
> :-                      PCPU_PROC_LOCK(p->p_pcpu);
> :+                      PCPU_PROC_WLOCK(p->p_pcpu);
> :                       LIST_REMOVE(p, p_list); /* off zombproc */
> :-                      PCPU_PROC_UNLOCK(p->p_pcpu);
> :+                      PCPU_PROC_WUNLOCK(p->p_pcpu);
> :
> :                       mtx_lock(&pidhash_lock);
> :                       LIST_REMOVE(p, p_hash); /* off zombproc */
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_fork.c#6 (text+ko) ====
> :
> :@@ -371,7 +371,7 @@
> :                * than trypid, so we can avoid checking for a while.
> :                */
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                        PCPU_PROC_LOCK(pc);
> :+                        PCPU_PROC_RLOCK(pc);
> :
> :                       p2 = LIST_FIRST(&pc->pc_allproc);
> :               again:
> :@@ -385,7 +385,7 @@
> :                                       trypid++;
> :                                       if (trypid >= pidchecked) {
> :                                               PROC_UNLOCK(p2);
> :-                                              PCPU_PROC_UNLOCK(pc);
> :+                                              PCPU_PROC_RUNLOCK(pc);
> :                                               goto retry;
> :                                       }
> :                               }
> :@@ -409,7 +409,7 @@
> :                               p2 = LIST_FIRST(&pc->pc_zombproc);
> :                               goto again;
> :                       }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :       }
> :       mtx_unlock(&pidalloc_lock);
> :@@ -429,9 +429,9 @@
> :       AUDIT_ARG(pid, p2->p_pid);
> :       p2->p_pcpu = pcpup;
> :
> :-      PCPU_PROC_LOCK(p2->p_pcpu);
> :+      PCPU_PROC_WLOCK(p2->p_pcpu);
> :       LIST_INSERT_HEAD(&p2->p_pcpu->pc_allproc, p2, p_list);
> :-      PCPU_PROC_UNLOCK(p2->p_pcpu);
> :+      PCPU_PROC_WUNLOCK(p2->p_pcpu);
> :
> :       mtx_lock(&pidhash_lock);
> :       LIST_INSERT_HEAD(PIDHASH(p2->p_pid), p2, p_hash);
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_ktrace.c#5 (text+ko) ====
> :
> :@@ -640,7 +640,7 @@
> :       if (ops == KTROP_CLEARFILE) {
> :               sx_slock(&allpcpu_lock);
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                      PCPU_PROC_LOCK(pc);
> :+                      PCPU_PROC_RLOCK(pc);
> :                       LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                               PROC_LOCK(p);
> :                               if (p->p_tracevp == vp) {
> :@@ -664,7 +664,7 @@
> :                               } else
> :                                       PROC_UNLOCK(p);
> :                       }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :               goto done;
> :@@ -983,7 +983,7 @@
> :       cred = NULL;
> :       sx_slock(&allpcpu_lock);
> :         SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                PCPU_PROC_LOCK(pc);
> :+                PCPU_PROC_RLOCK(pc);
> :                 LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       PROC_LOCK(p);
> :                       if (p->p_tracevp == vp) {
> :@@ -1001,7 +1001,7 @@
> :                               cred = NULL;
> :                       }
> :               }
> :-                PCPU_PROC_UNLOCK(pc);
> :+                PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_proc.c#5 (text+ko) ====
> :
> :@@ -110,9 +110,10 @@
> : void
> : procinit()
> : {
> :-
> :+
> :       sx_init(&allpcpu_lock, "allpcpu");
> :       sx_init(&proctree_lock, "proctree");
> :+      sx_init(&pcpu_find(0)->pc_allproc_lock, "cpu allproc");
> :       mtx_init(&ppeers_lock, "p_peers", NULL, MTX_DEF);
> :       mtx_init(&pidalloc_lock, "pidalloc", NULL, MTX_DEF);
> :       mtx_init(&pidhash_lock, "pidhash", NULL, MTX_DEF);
> :@@ -1002,7 +1003,7 @@
> :       sx_slock(&allpcpu_lock);
> :       for (doingzomb = 0 ; doingzomb < 2 ; doingzomb++) {
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                      PCPU_PROC_LOCK(pc);
> :+                      PCPU_PROC_RLOCK(pc);
> :                       if (!doingzomb)
> :                               p = LIST_FIRST(&pc->pc_allproc);
> :                       else
> :@@ -1105,12 +1106,12 @@
> :
> :                               error = sysctl_out_proc(p, req, flags | doingzomb);
> :                               if (error) {
> :-                                      PCPU_PROC_UNLOCK(pc);
> :+                                      PCPU_PROC_RUNLOCK(pc);
> :                                       sx_sunlock(&allpcpu_lock);
> :                                       return (error);
> :                               }
> :                       }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_resource.c#6 (text+ko) ====
> :
> :@@ -144,7 +144,7 @@
> :                       uap->who = td->td_ucred->cr_uid;
> :               sx_slock(&allpcpu_lock);
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                      PCPU_PROC_LOCK(pc);
> :+                      PCPU_PROC_RLOCK(pc);
> :                       LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                               PROC_LOCK(p);
> :                               if (!p_cansee(td, p) &&
> :@@ -154,7 +154,7 @@
> :                               }
> :                               PROC_UNLOCK(p);
> :                       }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :               break;
> :@@ -236,9 +236,8 @@
> :                       uap->who = td->td_ucred->cr_uid;
> :                 sx_slock(&allpcpu_lock);
> :                 SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                        PCPU_PROC_LOCK(pc);
> :+                        PCPU_PROC_RLOCK(pc);
> :                         LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :-
> :                               PROC_LOCK(p);
> :                               if (p->p_ucred->cr_uid == uap->who &&
> :                                   !p_cansee(td, p)) {
> :@@ -247,6 +246,7 @@
> :                               }
> :                               PROC_UNLOCK(p);
> :                       }
> :+                        PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :               break;
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/kern_sig.c#9 (text+ko) ====
> :
> :@@ -1648,7 +1648,7 @@
> :                */
> :               sx_slock(&allpcpu_lock);
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                        PCPU_PROC_LOCK(pc);
> :+                        PCPU_PROC_RLOCK(pc);
> :                       LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                               PROC_LOCK(p);
> :                               if (p->p_pid <= 1 || p->p_flag & P_SYSTEM ||
> :@@ -1663,7 +1663,7 @@
> :                               }
> :                               PROC_UNLOCK(p);
> :                       }
> :-                        PCPU_PROC_UNLOCK(pc);
> :+                        PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :       } else {
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/sched_4bsd.c#9 (text+ko) ====
> :
> :@@ -392,7 +392,7 @@
> :       realstathz = stathz ? stathz : hz;
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       /*
> :                        * Prevent state changes and protect run queue.
> :@@ -481,7 +481,7 @@
> :                       } /* end of thread loop */
> :                       mtx_unlock_spin(&sched_lock);
> :               }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       } /* end of process loop */
> :       sx_sunlock(&allpcpu_lock);
> : }
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/subr_pcpu.c#4 (text+ko) ====
> :
> :@@ -75,7 +75,8 @@
> :       cpuid_to_pcpu[cpuid] = pcpu;
> :       LIST_INIT(&pcpu->pc_allproc);
> :       LIST_INIT(&pcpu->pc_zombproc);
> :-      mtx_init(&pcpu->pc_allproc_lock, "cpu allproc", NULL, MTX_DEF);
> :+      if (cpuid != 0)
> :+              sx_init(&pcpu->pc_allproc_lock, "cpu allproc");
> :       SLIST_INSERT_HEAD(&cpuhead, pcpu, pc_allcpu);
> :       cpu_pcpu_init(pcpu, cpuid, size);
> : }
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/subr_witness.c#7 (text+ko) ====
> :
> :@@ -275,13 +275,13 @@
> :        */
> :       { "proctree", &lock_class_sx },
> :       { "allpcpu", &lock_class_sx },
> :+      { "cpu allproc", &lock_class_sx },
> :       { NULL, NULL },
> :       /*
> :        * Various mutexes
> :        */
> :       { "Giant", &lock_class_mtx_sleep },
> :       { "pidalloc", &lock_class_mtx_sleep },
> :-      { "cpu allproc", &lock_class_mtx_sleep },
> :       { "pidhash", &lock_class_mtx_sleep },
> :       { "filedesc structure", &lock_class_mtx_sleep },
> :       { "pipe mutex", &lock_class_mtx_sleep },
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/kern/sys_process.c#6 (text+ko) ====
> :
> :@@ -532,7 +532,7 @@
> :                       /* this is slow, should be optimized */
> :                       sx_slock(&allpcpu_lock);
> :                       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                              PCPU_PROC_LOCK(pc);
> :+                              PCPU_PROC_RLOCK(pc);
> :                               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                                       PROC_LOCK(p);
> :                                       mtx_lock_spin(&sched_lock);
> :@@ -545,6 +545,7 @@
> :                                               break; /* proc lock held */
> :                                       PROC_UNLOCK(p);
> :                               }
> :+                              PCPU_PROC_RUNLOCK(pc);
> :                       }
> :                       sx_sunlock(&allpcpu_lock);
> :                       if (p == NULL) {
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/sun4v/include/pcpu.h#15 (text+ko) ====
> :
> :@@ -79,7 +79,7 @@
> :       struct rwindow pc_tsbwbuf[2];                                   \
> :       u_int   pc_node;                                                \
> :         uint16_t pc_cpulist[MAXCPU];                                    \
> :-        uint64_t pad[6];
> :+        uint64_t pad[7];
> :
> :       /* XXX SUN4V_FIXME - as we access the *_ra and *_size fields in quick
> :        * succession we _really_ want them to be L1 cache line size aligned
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/sys/pcpu.h#4 (text+ko) ====
> :
> :@@ -43,12 +43,13 @@
> :
> : #include <sys/queue.h>
> : #include <sys/vmmeter.h>
> :+#include <sys/sx.h>
> : #include <machine/pcpu.h>
> :
> : LIST_HEAD(proclist, proc);
> : struct pcb;
> : struct thread;
> :-
> :+struct sx;
> : /*
> :  * This structure maps out the global data that needs to be kept on a
> :  * per-cpu basis.  The members are accessed via the PCPU_GET/SET/PTR
> :@@ -68,7 +69,7 @@
> :       cpumask_t       pc_other_cpus;          /* Mask of all other cpus */
> :       SLIST_ENTRY(pcpu) pc_allcpu;
> :       struct lock_list_entry *pc_spinlocks;
> :-      struct mtx      pc_allproc_lock;        /* lock for pcpu process list */
> :+      struct sx       pc_allproc_lock;        /* lock for pcpu process list */
> :       struct proclist pc_zombproc;
> :       struct proclist pc_allproc;
> : #ifdef KTR_PERCPU
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/sys/proc.h#7 (text+ko) ====
> :
> :@@ -623,8 +623,10 @@
> : #define       PROC_LOCK_ASSERT(p, type)       mtx_assert(&(p)->p_mtx, (type))
> :
> : /* lock pcpu process list */
> :-#define PCPU_PROC_LOCK(pc)  mtx_lock(&(pc)->pc_allproc_lock)
> :-#define PCPU_PROC_UNLOCK(pc)  mtx_unlock(&(pc)->pc_allproc_lock)
> :+#define PCPU_PROC_RLOCK(pc)    sx_slock(&(pc)->pc_allproc_lock)
> :+#define PCPU_PROC_RUNLOCK(pc)  sx_sunlock(&(pc)->pc_allproc_lock)
> :+#define PCPU_PROC_WLOCK(pc)    sx_xlock(&(pc)->pc_allproc_lock)
> :+#define PCPU_PROC_WUNLOCK(pc)  sx_xunlock(&(pc)->pc_allproc_lock)
> :
> :
> : /* Lock and unlock a process group. */
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/vm/vm_glue.c#7 (text+ko) ====
> :
> :@@ -678,7 +678,7 @@
> :       ppri = INT_MIN;
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       if (p->p_sflag & (PS_INMEM | PS_SWAPPINGOUT | PS_SWAPPINGIN))
> :                               continue;
> :@@ -709,7 +709,7 @@
> :                       }
> :                       mtx_unlock_spin(&sched_lock);
> :               }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :
> :@@ -808,7 +808,7 @@
> : retry:
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :
> :               struct vmspace *vm;
> :@@ -930,7 +930,7 @@
> :                               PROC_UNLOCK(p);
> :                               vm_map_unlock(&vm->vm_map);
> :                               vmspace_free(vm);
> :-                              PCPU_PROC_UNLOCK(pc);
> :+                              PCPU_PROC_RUNLOCK(pc);
> :                               sx_sunlock(&allpcpu_lock);
> :                               goto retry;
> :                       }
> :@@ -944,7 +944,7 @@
> :               vmspace_free(vm);
> :               continue;
> :       }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :       /*
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/vm/vm_meter.c#5 (text+ko) ====
> :
> :@@ -143,7 +143,7 @@
> :        */
> :       sx_slock(&allpcpu_lock);
> :       SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-              PCPU_PROC_LOCK(pc);
> :+              PCPU_PROC_RLOCK(pc);
> :               LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       if (p->p_flag & P_SYSTEM)
> :                               continue;
> :@@ -209,7 +209,7 @@
> :                       if (paging)
> :                               totalp->t_pw++;
> :               }
> :-              PCPU_PROC_UNLOCK(pc);
> :+              PCPU_PROC_RUNLOCK(pc);
> :       }
> :       sx_sunlock(&allpcpu_lock);
> :       /*
> :
> :==== //depot/projects/kmacy_sun4v/src/sys/vm/vm_pageout.c#4 (text+ko) ====
> :
> :@@ -1224,7 +1224,7 @@
> :               bigsize = 0;
> :               sx_slock(&allpcpu_lock);
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                      PCPU_PROC_LOCK(pc);
> :+                      PCPU_PROC_RLOCK(pc);
> :                       LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                       int breakout;
> :
> :@@ -1281,7 +1281,7 @@
> :                       } else
> :                               PROC_UNLOCK(p);
> :               }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :               if (bigproc != NULL) {
> :@@ -1576,7 +1576,7 @@
> :
> :               sx_slock(&allpcpu_lock);
> :               SLIST_FOREACH(pc, &cpuhead, pc_allcpu) {
> :-                      PCPU_PROC_LOCK(pc);
> :+                      PCPU_PROC_RLOCK(pc);
> :                       LIST_FOREACH(p, &pc->pc_allproc, p_list) {
> :                               vm_pindex_t limit, size;
> :
> :@@ -1630,7 +1630,7 @@
> :                                               &p->p_vmspace->vm_map, limit);
> :                               }
> :                       }
> :-                      PCPU_PROC_UNLOCK(pc);
> :+                      PCPU_PROC_RUNLOCK(pc);
> :               }
> :               sx_sunlock(&allpcpu_lock);
> :       }
> :
> :
>
> --
> arr at watson.org
>


More information about the p4-projects mailing list