Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Jun 2006 01:19:19 -0400 (EDT)
From:      "Andrew R. Reiter" <arr@watson.org>
To:        kmacy@fsmware.com
Cc:        Perforce Change Reviews <perforce@freebsd.org>, Kip Macy <kmacy@freebsd.org>
Subject:   Re: PERFORCE change 99646 for review
Message-ID:  <20060621011854.L51425@fledge.watson.org>
In-Reply-To: <b1fa29170606202216t7d959627r54c17a87cf473b33@mail.gmail.com>
References:  <200606192330.k5JNUMVL029897@repoman.freebsd.org>  <20060619193506.F40529@fledge.watson.org> <b1fa29170606202216t7d959627r54c17a87cf473b33@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 20 Jun 2006, Kip Macy wrote:

: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.

ah; yes.  PCPU would be much nicer.  Thanks for responding.

:
:On 6/19/06, Andrew R. Reiter <arr@watson.org> wrote:
:> On Mon, 19 Jun 2006, Kip Macy wrote:
:> 
:> :http://perforce.freebsd.org/chv.cgi?CH=99646
:> :
:> :Change 99646 by kmacy@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@watson.org
:> 
:
:

--
arr@watson.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060621011854.L51425>