PERFORCE change 29521 for review
John Baldwin
jhb at FreeBSD.org
Wed Apr 23 12:16:41 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=29521
Change 29521 by jhb at jhb_laptop on 2003/04/23 12:16:24
IFC @29520 (proc locking).
Affected files ...
.. //depot/projects/smpng/sys/compat/linux/linux_file.c#18 integrate
.. //depot/projects/smpng/sys/kern/kern_exit.c#63 integrate
.. //depot/projects/smpng/sys/kern/kern_resource.c#36 integrate
.. //depot/projects/smpng/sys/kern/kern_sig.c#61 integrate
.. //depot/projects/smpng/sys/kern/kern_synch.c#46 integrate
.. //depot/projects/smpng/sys/kern/kern_thread.c#29 integrate
.. //depot/projects/smpng/sys/kern/sched_4bsd.c#9 integrate
.. //depot/projects/smpng/sys/kern/sched_ule.c#9 integrate
.. //depot/projects/smpng/sys/kern/subr_trap.c#52 integrate
.. //depot/projects/smpng/sys/net/if_ethersubr.c#30 integrate
.. //depot/projects/smpng/sys/sys/proc.h#83 integrate
.. //depot/projects/smpng/sys/vm/vm_glue.c#24 integrate
Differences ...
==== //depot/projects/smpng/sys/compat/linux/linux_file.c#18 (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/compat/linux/linux_file.c,v 1.79 2003/03/20 21:17:38 jhb Exp $
+ * $FreeBSD: src/sys/compat/linux/linux_file.c,v 1.80 2003/04/23 18:13:26 jhb Exp $
*/
#include "opt_compat.h"
@@ -126,8 +126,8 @@
SESS_LEADER(p) && !(p->p_flag & P_CONTROLT)) {
struct file *fp;
+ PROC_UNLOCK(p);
error = fget(td, td->td_retval[0], &fp);
- PROC_UNLOCK(p);
if (!error) {
if (fp->f_type == DTYPE_VNODE)
fo_ioctl(fp, TIOCSCTTY, (caddr_t) 0, td->td_ucred,
==== //depot/projects/smpng/sys/kern/kern_exit.c#63 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
- * $FreeBSD: src/sys/kern/kern_exit.c,v 1.211 2003/04/21 14:42:04 davidxu Exp $
+ * $FreeBSD: src/sys/kern/kern_exit.c,v 1.212 2003/04/23 18:46:51 jhb Exp $
*/
#include "opt_compat.h"
@@ -698,9 +698,11 @@
mtx_unlock(&Giant);
return (0);
}
+ mtx_lock_spin(&sched_lock);
if (P_SHOULDSTOP(p) && (p->p_suspcount == p->p_numthreads) &&
((p->p_flag & P_WAITED) == 0) &&
(p->p_flag & P_TRACED || uap->options & WUNTRACED)) {
+ mtx_unlock_spin(&sched_lock);
p->p_flag |= P_WAITED;
sx_xunlock(&proctree_lock);
td->td_retval[0] = p->p_pid;
@@ -723,6 +725,7 @@
mtx_unlock(&Giant);
return (error);
}
+ mtx_unlock_spin(&sched_lock);
if (uap->options & WCONTINUED && (p->p_flag & P_CONTINUED)) {
sx_xunlock(&proctree_lock);
td->td_retval[0] = p->p_pid;
==== //depot/projects/smpng/sys/kern/kern_resource.c#36 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_resource.c 8.5 (Berkeley) 1/21/94
- * $FreeBSD: src/sys/kern/kern_resource.c,v 1.124 2003/04/22 20:45:38 jhb Exp $
+ * $FreeBSD: src/sys/kern/kern_resource.c,v 1.125 2003/04/23 18:48:55 jhb Exp $
*/
#include "opt_compat.h"
@@ -94,8 +94,6 @@
int error = 0;
struct ksegrp *kg;
- mtx_lock(&Giant);
-
switch (uap->which) {
case PRIO_PROCESS:
if (uap->who == 0)
@@ -168,7 +166,6 @@
if (low == PRIO_MAX + 1 && error == 0)
error = ESRCH;
td->td_retval[0] = low;
- mtx_unlock(&Giant);
return (error);
}
@@ -192,8 +189,6 @@
register struct proc *p;
int found = 0, error = 0;
- mtx_lock(&Giant);
-
switch (uap->which) {
case PRIO_PROCESS:
if (uap->who == 0) {
@@ -260,7 +255,6 @@
}
if (found == 0 && error == 0)
error = ESRCH;
- mtx_unlock(&Giant);
return (error);
}
==== //depot/projects/smpng/sys/kern/kern_sig.c#61 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_sig.c 8.7 (Berkeley) 4/18/94
- * $FreeBSD: src/sys/kern/kern_sig.c,v 1.229 2003/04/19 05:04:06 davidxu Exp $
+ * $FreeBSD: src/sys/kern/kern_sig.c,v 1.230 2003/04/23 18:50:25 jhb Exp $
*/
#include "opt_compat.h"
@@ -1157,33 +1157,27 @@
register struct osigstack_args *uap;
{
struct proc *p = td->td_proc;
- struct sigstack ss;
+ struct sigstack nss, oss;
int error = 0;
- mtx_lock(&Giant);
-
- if (uap->oss != NULL) {
- PROC_LOCK(p);
- ss.ss_sp = p->p_sigstk.ss_sp;
- ss.ss_onstack = sigonstack(cpu_getstack(td));
- PROC_UNLOCK(p);
- error = copyout(&ss, uap->oss, sizeof(struct sigstack));
+ if (uap->nss != NULL) {
+ error = copyin(uap->nss, &nss, sizeof(nss));
if (error)
- goto done2;
+ return (error);
}
-
+ PROC_LOCK(p);
+ oss.ss_sp = p->p_sigstk.ss_sp;
+ oss.ss_onstack = sigonstack(cpu_getstack(td));
if (uap->nss != NULL) {
- if ((error = copyin(uap->nss, &ss, sizeof(ss))) != 0)
- goto done2;
- PROC_LOCK(p);
- p->p_sigstk.ss_sp = ss.ss_sp;
+ p->p_sigstk.ss_sp = nss.ss_sp;
p->p_sigstk.ss_size = 0;
- p->p_sigstk.ss_flags |= ss.ss_onstack & SS_ONSTACK;
+ p->p_sigstk.ss_flags |= nss.ss_onstack & SS_ONSTACK;
p->p_flag |= P_ALTSTACK;
- PROC_UNLOCK(p);
}
-done2:
- mtx_unlock(&Giant);
+ PROC_UNLOCK(p);
+ if (uap->oss != NULL)
+ error = copyout(&oss, uap->oss, sizeof(oss));
+
return (error);
}
#endif /* COMPAT_43 || COMPAT_SUNOS */
==== //depot/projects/smpng/sys/kern/kern_synch.c#46 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)kern_synch.c 8.9 (Berkeley) 5/19/95
- * $FreeBSD: src/sys/kern/kern_synch.c,v 1.217 2003/04/02 23:53:29 peter Exp $
+ * $FreeBSD: src/sys/kern/kern_synch.c,v 1.218 2003/04/23 18:46:51 jhb Exp $
*/
#include "opt_ddb.h"
@@ -167,6 +167,7 @@
* the thread (recursion here might be bad).
* Hence the TDF_INMSLEEP flag.
*/
+ mtx_lock_spin(&sched_lock);
if (p->p_flag & P_THREADED || p->p_numthreads > 1) {
/*
* Just don't bother if we are exiting
@@ -177,10 +178,10 @@
(((p->p_flag & P_WEXIT) && (p->p_singlethread != td)) ||
(td->td_flags & TDF_INTERRUPT))) {
td->td_flags &= ~TDF_INTERRUPT;
+ mtx_unlock_spin(&sched_lock);
return (EINTR);
}
}
- mtx_lock_spin(&sched_lock);
if (cold ) {
/*
* During autoconfiguration, just give interrupts
==== //depot/projects/smpng/sys/kern/kern_thread.c#29 (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.122 2003/04/22 19:47:55 jhb Exp $
+ * $FreeBSD: src/sys/kern/kern_thread.c,v 1.123 2003/04/23 18:46:51 jhb Exp $
*/
#include <sys/param.h>
@@ -1299,7 +1299,8 @@
{
struct proc *p = td->td_proc;
struct ksegrp *kg = td->td_ksegrp;
-
+
+ mtx_assert(&sched_lock, MA_OWNED);
TAILQ_REMOVE(&p->p_threads, td, td_plist);
p->p_numthreads--;
TAILQ_REMOVE(&kg->kg_threads, td, td_kglist);
@@ -1683,11 +1684,11 @@
if (p->p_numthreads > max_threads_per_proc) {
max_threads_hits++;
PROC_LOCK(p);
+ mtx_lock_spin(&sched_lock);
while (p->p_numthreads > max_threads_per_proc) {
if (P_SHOULDSTOP(p))
break;
upcalls = 0;
- mtx_lock_spin(&sched_lock);
FOREACH_KSEGRP_IN_PROC(p, kg2) {
if (kg2->kg_numupcalls == 0)
upcalls++;
@@ -1701,7 +1702,9 @@
msleep(&p->p_numthreads, &p->p_mtx, PPAUSE|PCATCH,
"maxthreads", NULL);
p->p_maxthrwaits--;
+ mtx_lock_spin(&sched_lock);
}
+ mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
}
@@ -1818,10 +1821,9 @@
} else
p->p_flag &= ~P_SINGLE_EXIT;
p->p_flag |= P_STOPPED_SINGLE;
+ mtx_lock_spin(&sched_lock);
p->p_singlethread = td;
- /* XXXKSE Which lock protects the below values? */
while ((p->p_numthreads - p->p_suspcount) != 1) {
- mtx_lock_spin(&sched_lock);
FOREACH_THREAD_IN_PROC(p, td2) {
if (td2 == td)
continue;
@@ -1855,10 +1857,8 @@
/*
* Maybe we suspended some threads.. was it enough?
*/
- if ((p->p_numthreads - p->p_suspcount) == 1) {
- mtx_unlock_spin(&sched_lock);
+ if ((p->p_numthreads - p->p_suspcount) == 1)
break;
- }
/*
* Wake us up when everyone else has suspended.
@@ -1872,15 +1872,14 @@
mtx_unlock_spin(&sched_lock);
PICKUP_GIANT();
PROC_LOCK(p);
+ mtx_lock_spin(&sched_lock);
}
if (force_exit == SINGLE_EXIT) {
- if (td->td_upcall) {
- mtx_lock_spin(&sched_lock);
+ if (td->td_upcall)
upcall_remove(td);
- mtx_unlock_spin(&sched_lock);
- }
kse_purge(p, td);
}
+ mtx_unlock_spin(&sched_lock);
return (0);
}
@@ -1987,6 +1986,7 @@
struct proc *p = td->td_proc;
mtx_assert(&sched_lock, MA_OWNED);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
KASSERT(!TD_IS_SUSPENDED(td), ("already suspended"));
p->p_suspcount++;
TD_SET_SUSPENDED(td);
@@ -2007,6 +2007,7 @@
struct proc *p = td->td_proc;
mtx_assert(&sched_lock, MA_OWNED);
+ PROC_LOCK_ASSERT(p, MA_OWNED);
TAILQ_REMOVE(&p->p_suspended, td, td_runq);
TD_CLR_SUSPENDED(td);
p->p_suspcount--;
@@ -2048,6 +2049,7 @@
p = td->td_proc;
PROC_LOCK_ASSERT(p, MA_OWNED);
p->p_flag &= ~P_STOPPED_SINGLE;
+ mtx_lock_spin(&sched_lock);
p->p_singlethread = NULL;
/*
* If there are other threads they mey now run,
@@ -2056,12 +2058,11 @@
* to continue however as this is a bad place to stop.
*/
if ((p->p_numthreads != 1) && (!P_SHOULDSTOP(p))) {
- mtx_lock_spin(&sched_lock);
while (( td = TAILQ_FIRST(&p->p_suspended))) {
thread_unsuspend_one(td);
}
- mtx_unlock_spin(&sched_lock);
}
+ mtx_unlock_spin(&sched_lock);
}
==== //depot/projects/smpng/sys/kern/sched_4bsd.c#9 (text+ko) ====
@@ -35,7 +35,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/kern/sched_4bsd.c,v 1.16 2003/04/22 20:50:38 jhb Exp $
+ * $FreeBSD: src/sys/kern/sched_4bsd.c,v 1.17 2003/04/23 18:51:05 jhb Exp $
*/
#include <sys/param.h>
@@ -441,6 +441,7 @@
struct ksegrp *kg;
struct thread *td;
+ mtx_assert(&sched_lock, MA_OWNED);
kg = ke->ke_ksegrp;
td = ke->ke_thread;
@@ -476,6 +477,8 @@
void
sched_exit_ksegrp(struct ksegrp *kg, struct ksegrp *child)
{
+
+ mtx_assert(&sched_lock, MA_OWNED);
kg->kg_estcpu = ESTCPULIM(kg->kg_estcpu + child->kg_estcpu);
}
@@ -501,6 +504,7 @@
void
sched_fork_ksegrp(struct ksegrp *kg, struct ksegrp *child)
{
+ mtx_assert(&sched_lock, MA_OWNED);
child->kg_estcpu = kg->kg_estcpu;
}
@@ -522,6 +526,7 @@
void
sched_class(struct ksegrp *kg, int class)
{
+ mtx_assert(&sched_lock, MA_OWNED);
kg->kg_pri_class = class;
}
@@ -535,6 +540,7 @@
sched_prio(struct thread *td, u_char prio)
{
+ mtx_assert(&sched_lock, MA_OWNED);
if (TD_ON_RUNQ(td)) {
adjustrunqueue(td, prio);
} else {
@@ -545,6 +551,8 @@
void
sched_sleep(struct thread *td, u_char prio)
{
+
+ mtx_assert(&sched_lock, MA_OWNED);
td->td_ksegrp->kg_slptime = 0;
td->td_priority = prio;
}
@@ -552,6 +560,8 @@
void
sched_switchin(struct thread *td)
{
+
+ mtx_assert(&sched_lock, MA_OWNED);
td->td_oncpu = PCPU_GET(cpuid);
}
@@ -564,6 +574,7 @@
ke = td->td_kse;
p = td->td_proc;
+ mtx_assert(&sched_lock, MA_OWNED);
KASSERT((ke->ke_state == KES_THREAD), ("mi_switch: kse state?"));
td->td_lastcpu = td->td_oncpu;
@@ -593,6 +604,7 @@
{
struct ksegrp *kg;
+ mtx_assert(&sched_lock, MA_OWNED);
kg = td->td_ksegrp;
if (kg->kg_slptime > 1)
updatepri(kg);
==== //depot/projects/smpng/sys/kern/sched_ule.c#9 (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.31 2003/04/22 20:50:38 jhb Exp $
+ * $FreeBSD: src/sys/kern/sched_ule.c,v 1.32 2003/04/23 18:51:05 jhb Exp $
*/
#include <sys/param.h>
@@ -769,6 +769,7 @@
void
sched_fork_kse(struct kse *ke, struct kse *child)
{
+
child->ke_slice = ke->ke_slice;
child->ke_cpu = ke->ke_cpu; /* sched_pickcpu(); */
child->ke_runq = NULL;
@@ -785,6 +786,8 @@
void
sched_fork_ksegrp(struct ksegrp *kg, struct ksegrp *child)
{
+
+ PROC_LOCK_ASSERT(child->kg_proc, MA_OWNED);
/* XXX Need something better here */
if (kg->kg_slptime > kg->kg_runtime) {
child->kg_slptime = SCHED_DYN_RANGE;
@@ -809,6 +812,7 @@
struct kseq *kseq;
struct kse *ke;
+ mtx_assert(&sched_lock, MA_OWNED);
if (kg->kg_pri_class == class)
return;
==== //depot/projects/smpng/sys/kern/subr_trap.c#52 (text+ko) ====
@@ -35,7 +35,7 @@
* SUCH DAMAGE.
*
* from: @(#)trap.c 7.4 (Berkeley) 5/13/91
- * $FreeBSD: src/sys/kern/subr_trap.c,v 1.252 2003/04/22 20:54:04 jhb Exp $
+ * $FreeBSD: src/sys/kern/subr_trap.c,v 1.253 2003/04/23 18:51:55 jhb Exp $
*/
#include "opt_mac.h"
@@ -78,7 +78,6 @@
p->p_comm);
#ifdef INVARIANTS
/* Check that we called signotify() enough. */
- mtx_lock(&Giant);
PROC_LOCK(p);
mtx_lock_spin(&sched_lock);
if (SIGPENDING(td) && ((td->td_flags & TDF_NEEDSIGCHK) == 0 ||
@@ -86,7 +85,6 @@
printf("failed to set signal flags properly for ast()\n");
mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
- mtx_unlock(&Giant);
#endif
/*
==== //depot/projects/smpng/sys/net/if_ethersubr.c#30 (text+ko) ====
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)if_ethersubr.c 8.1 (Berkeley) 6/10/93
- * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.143 2003/03/21 17:53:15 mdodd Exp $
+ * $FreeBSD: src/sys/net/if_ethersubr.c,v 1.144 2003/04/23 18:35:40 archie Exp $
*/
#include "opt_atalk.h"
@@ -281,13 +281,13 @@
if ((m->m_flags & M_BCAST) || (loop_copy > 0)) {
struct mbuf *n;
- n = m_copy(m, 0, (int)M_COPYALL);
- n->m_pkthdr.csum_flags |= csum_flags;
- if (csum_flags & CSUM_DATA_VALID)
- n->m_pkthdr.csum_data = 0xffff;
-
- (void) if_simloop(ifp, n, dst->sa_family, hlen);
+ if ((n = m_copy(m, 0, (int)M_COPYALL)) != NULL) {
+ n->m_pkthdr.csum_flags |= csum_flags;
+ if (csum_flags & CSUM_DATA_VALID)
+ n->m_pkthdr.csum_data = 0xffff;
+ (void)if_simloop(ifp, n, dst->sa_family, hlen);
+ }
} else if (bcmp(eh->ether_dhost, eh->ether_shost,
ETHER_ADDR_LEN) == 0) {
m->m_pkthdr.csum_flags |= csum_flags;
==== //depot/projects/smpng/sys/sys/proc.h#83 (text+ko) ====
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)proc.h 8.15 (Berkeley) 5/19/95
- * $FreeBSD: src/sys/sys/proc.h,v 1.321 2003/04/22 20:54:04 jhb Exp $
+ * $FreeBSD: src/sys/sys/proc.h,v 1.322 2003/04/23 18:54:30 jhb Exp $
*/
#ifndef _SYS_PROC_H_
@@ -157,6 +157,7 @@
* o - ktrace lock
* p - select lock (sellock)
* r - p_peers lock
+ * z - zombie threads/kse/ksegroup lock
*
* If the locking key specifies two identifiers (for example, p_pptr) then
* either lock is sufficient for read access, but both locks must be held
@@ -263,15 +264,15 @@
* are linked to them. Other threads are not yet assigned.
*/
struct thread {
- struct proc *td_proc; /* Associated process. */
- struct ksegrp *td_ksegrp; /* Associated KSEG. */
- TAILQ_ENTRY(thread) td_plist; /* All threads in this proc */
- TAILQ_ENTRY(thread) td_kglist; /* All threads in this ksegrp */
+ struct proc *td_proc; /* (*) Associated process. */
+ struct ksegrp *td_ksegrp; /* (*) Associated KSEG. */
+ TAILQ_ENTRY(thread) td_plist; /* (*) All threads in this proc */
+ TAILQ_ENTRY(thread) td_kglist; /* (*) All threads in this ksegrp */
/* The two queues below should someday be merged */
TAILQ_ENTRY(thread) td_slpq; /* (j) Sleep queue. XXXKSE */
TAILQ_ENTRY(thread) td_lockq; /* (j) Lock queue. XXXKSE */
- TAILQ_ENTRY(thread) td_runq; /* (j) Run queue(s). XXXKSE */
+ TAILQ_ENTRY(thread) td_runq; /* (j/z) Run queue(s). XXXKSE */
TAILQ_HEAD(, selinfo) td_selq; /* (p) List of selinfos. */
@@ -295,21 +296,21 @@
LIST_HEAD(, mtx) td_contested; /* (j) Contested locks. */
struct lock_list_entry *td_sleeplocks; /* (k) Held sleep locks. */
int td_intr_nesting_level; /* (k) Interrupt recursion. */
- struct kse_thr_mailbox *td_mailbox; /* The userland mailbox address */
+ struct kse_thr_mailbox *td_mailbox; /* (*) Userland mailbox address */
struct ucred *td_ucred; /* (k) Reference to credentials. */
void (*td_switchin)(void); /* (k) Switchin special func. */
- struct thread *td_standin; /* (?) Use this for an upcall */
- u_int td_prticks; /* (?) Profclock hits in sys for user */
- struct kse_upcall *td_upcall; /* our upcall structure. */
+ struct thread *td_standin; /* (*) Use this for an upcall */
+ u_int td_prticks; /* (*) Profclock hits in sys for user */
+ struct kse_upcall *td_upcall; /* (*) Upcall structure. */
u_int64_t td_sticks; /* (j) Statclock hits in system mode. */
- u_int td_uuticks; /* Statclock hits in user, for UTS */
- u_int td_usticks; /* Statclock hits in kernel, for UTS */
+ u_int td_uuticks; /* (*) Statclock hits in user, for UTS */
+ u_int td_usticks; /* (*) Statclock hits in kernel, for UTS */
u_int td_critnest; /* (k) Critical section nest level. */
- sigset_t td_oldsigmask; /* (c) Saved mask from pre sigpause. */
+ sigset_t td_oldsigmask; /* (k) Saved mask from pre sigpause. */
sigset_t td_sigmask; /* (c) Current signal mask. */
sigset_t td_siglist; /* (c) Sigs arrived, not delivered. */
- STAILQ_HEAD(, thread) td_umtxq; /* (p) List of threads blocked by us. */
- STAILQ_ENTRY(thread) td_umtx; /* (p) Link for when we're blocked. */
+ STAILQ_HEAD(, thread) td_umtxq; /* (c?) List of threads blocked by us. */
+ STAILQ_ENTRY(thread) td_umtx; /* (c?) Link for when we're blocked. */
#define td_endzero td_base_pri
@@ -335,13 +336,13 @@
struct callout td_slpcallout; /* (h) Callout for sleep. */
struct trapframe *td_frame; /* (k) */
struct vm_object *td_kstack_obj;/* (a) Kstack object. */
- vm_offset_t td_kstack; /* Kernel VA of kstack. */
- int td_kstack_pages; /* Size of the kstack */
+ vm_offset_t td_kstack; /* (a) Kernel VA of kstack. */
+ int td_kstack_pages; /* (a) Size of the kstack */
struct vm_object *td_altkstack_obj;/* (a) Alternate kstack object. */
- vm_offset_t td_altkstack; /* Kernel VA of alternate kstack. */
- int td_altkstack_pages; /* Size of the alternate kstack */
+ vm_offset_t td_altkstack; /* (a) Kernel VA of alternate kstack. */
+ int td_altkstack_pages; /* (a) Size of the alternate kstack */
struct mdthread td_md; /* (k) Any machine-dependent fields. */
- struct td_sched *td_sched; /* Scheduler specific data */
+ struct td_sched *td_sched; /* (*) Scheduler specific data */
};
/* flags kept in td_flags */
#define TDF_OLDMASK 0x000001 /* Need to restore mask after suspend. */
@@ -425,16 +426,16 @@
* for the group.
*/
struct kse {
- struct proc *ke_proc; /* Associated process. */
- struct ksegrp *ke_ksegrp; /* Associated KSEG. */
- TAILQ_ENTRY(kse) ke_kglist; /* Queue of all KSEs in ke_ksegrp. */
- TAILQ_ENTRY(kse) ke_kgrlist; /* Queue of all KSEs in this state. */
- TAILQ_ENTRY(kse) ke_procq; /* (j) Run queue. */
+ struct proc *ke_proc; /* (*) Associated process. */
+ struct ksegrp *ke_ksegrp; /* (*) Associated KSEG. */
+ TAILQ_ENTRY(kse) ke_kglist; /* (*) Queue of KSEs in ke_ksegrp. */
+ TAILQ_ENTRY(kse) ke_kgrlist; /* (*) Queue of KSEs in this state. */
+ TAILQ_ENTRY(kse) ke_procq; /* (j/z) Run queue. */
#define ke_startzero ke_flags
int ke_flags; /* (j) KEF_* flags. */
- struct thread *ke_thread; /* Active associated thread. */
- fixpt_t ke_pctcpu; /* (j) %cpu during p_swtime. */
+ struct thread *ke_thread; /* (*) Active associated thread. */
+ fixpt_t ke_pctcpu; /* (j) %cpu during p_swtime. */
u_char ke_oncpu; /* (j) Which cpu we are on. */
char ke_rqindex; /* (j) Run queue index. */
enum {
@@ -443,10 +444,10 @@
KES_ONRUNQ,
KES_UNQUEUED, /* in transit */
KES_THREAD /* slaved to thread state */
- } ke_state; /* (j) S* process status. */
+ } ke_state; /* (j) KSE status. */
#define ke_endzero ke_dummy
u_char ke_dummy;
- struct ke_sched *ke_sched; /* Scheduler specific data */
+ struct ke_sched *ke_sched; /* (*) Scheduler specific data */
};
/* flags kept in ke_flags */
@@ -478,8 +479,8 @@
* contain multiple KSEs.
*/
struct ksegrp {
- struct proc *kg_proc; /* Process that contains this KSEG. */
- TAILQ_ENTRY(ksegrp) kg_ksegrp; /* Queue of KSEGs in kg_proc. */
+ struct proc *kg_proc; /* (*) Process that contains this KSEG. */
+ TAILQ_ENTRY(ksegrp) kg_ksegrp; /* (*) Queue of KSEGs in kg_proc. */
TAILQ_HEAD(, kse) kg_kseq; /* (ke_kglist) All KSEs. */
TAILQ_HEAD(, kse) kg_iq; /* (ke_kgrlist) All idle KSEs. */
TAILQ_HEAD(, thread) kg_threads;/* (td_kglist) All threads. */
@@ -487,27 +488,27 @@
TAILQ_HEAD(, thread) kg_slpq; /* (td_runq) NONRUNNABLE threads. */
TAILQ_HEAD(, kse_upcall) kg_upcalls; /* All upcalls in the group */
#define kg_startzero kg_estcpu
- u_int kg_estcpu; /* Sum of the same field in KSEs. */
+ u_int kg_estcpu; /* (j) Sum of the same field in KSEs. */
u_int kg_slptime; /* (j) How long completely blocked. */
- struct thread *kg_last_assigned; /* (j) Last thread assigned to a KSE */
+ struct thread *kg_last_assigned; /* (j) Last thread assigned to a KSE. */
int kg_runnable; /* (j) Num runnable threads on queue. */
int kg_runq_kses; /* (j) Num KSEs on runq. */
int kg_idle_kses; /* (j) Num KSEs on iq */
int kg_numupcalls; /* (j) Num upcalls */
int kg_upsleeps; /* (c) Num threads in kse_release() */
- struct kse_thr_mailbox *kg_completed; /* (c) completed thread mboxes */
- int kg_nextupcall; /* next upcall time */
- int kg_upquantum; /* quantum to schedule an upcall */
+ struct kse_thr_mailbox *kg_completed; /* (c) Completed thread mboxes. */
+ int kg_nextupcall; /* (*) Next upcall time */
+ int kg_upquantum; /* (*) Quantum to schedule an upcall */
#define kg_endzero kg_pri_class
#define kg_startcopy kg_endzero
u_char kg_pri_class; /* (j) Scheduling class. */
u_char kg_user_pri; /* (j) User pri from estcpu and nice. */
- char kg_nice; /* (j?/k?) Process "nice" value. */
+ char kg_nice; /* (c + j) Process "nice" value. */
#define kg_endcopy kg_numthreads
int kg_numthreads; /* (j) Num threads in total */
int kg_kses; /* (j) Num KSEs in group. */
- struct kg_sched *kg_sched; /* Scheduler specific data */
+ struct kg_sched *kg_sched; /* (*) Scheduler specific data */
};
/*
@@ -518,12 +519,12 @@
LIST_ENTRY(proc) p_list; /* (d) List of all processes. */
TAILQ_HEAD(, ksegrp) p_ksegrps; /* (kg_ksegrp) All KSEGs. */
TAILQ_HEAD(, thread) p_threads; /* (td_plist) Threads. (shortcut) */
- TAILQ_HEAD(, thread) p_suspended; /* (td_runq) suspended threads */
+ TAILQ_HEAD(, thread) p_suspended; /* (td_runq) Suspended threads. */
struct ucred *p_ucred; /* (c) Process owner's identity. */
struct filedesc *p_fd; /* (b) Ptr to open files structure. */
/* Accumulated stats for all KSEs? */
struct pstats *p_stats; /* (b) Accounting/statistics (CPU). */
- struct plimit *p_limit; /* (m) Process limits. */
+ struct plimit *p_limit; /* (c*) Process limits. */
struct vm_object *p_upages_obj; /* (a) Upages object. */
struct procsig *p_procsig; /* (c) Signal actions, state (CPU). */
@@ -540,14 +541,14 @@
PRS_NEW = 0, /* In creation */
PRS_NORMAL, /* KSEs can be run */
PRS_ZOMBIE
- } p_state; /* (j) S* process status. */
+ } p_state; /* (j/c) S* process status. */
pid_t p_pid; /* (b) Process identifier. */
LIST_ENTRY(proc) p_hash; /* (d) Hash chain. */
LIST_ENTRY(proc) p_pglist; /* (g + e) List of processes in pgrp. */
struct proc *p_pptr; /* (c + e) Pointer to parent process. */
LIST_ENTRY(proc) p_sibling; /* (e) List of sibling processes. */
LIST_HEAD(, proc) p_children; /* (e) Pointer to list of children. */
- struct mtx p_mtx; /* (k) Lock for this struct. */
+ struct mtx p_mtx; /* (n) Lock for this struct. */
/* The following fields are all zeroed upon creation in fork. */
#define p_startzero p_oppid
@@ -580,9 +581,9 @@
char p_step; /* (c) Process is stopped. */
u_char p_pfsflags; /* (c) Procfs flags. */
struct nlminfo *p_nlminfo; /* (?) Only used by/for lockd. */
- void *p_aioinfo; /* (c) ASYNC I/O info. */
- struct thread *p_singlethread;/* (j) If single threading this is it */
- int p_suspcount; /* (j) # threads in suspended mode */
+ void *p_aioinfo; /* (?) ASYNC I/O info. */
+ struct thread *p_singlethread;/* (c + j) If single threading this is it */
+ int p_suspcount; /* (c) # threads in suspended mode */
/* End area that is zeroed on creation. */
#define p_endzero p_sigstk
@@ -599,18 +600,18 @@
#define p_endcopy p_xstat
u_short p_xstat; /* (c) Exit status; also stop sig. */
- int p_numthreads; /* (?) number of threads */
+ int p_numthreads; /* (j) Number of threads. */
int p_numksegrps; /* (?) number of ksegrps */
- struct mdproc p_md; /* (c) Any machine-dependent fields. */
- struct callout p_itcallout; /* (h) Interval timer callout. */
+ struct mdproc p_md; /* Any machine-dependent fields. */
+ struct callout p_itcallout; /* (h + c) Interval timer callout. */
struct user *p_uarea; /* (k) Kernel VA of u-area (CPU) */
u_short p_acflag; /* (c) Accounting flags. */
struct rusage *p_ru; /* (a) Exit information. XXX */
struct proc *p_peers; /* (r) */
struct proc *p_leader; /* (b) */
void *p_emuldata; /* (c) Emulator state data. */
- struct label p_label; /* process (not subject) MAC label */
- struct p_sched *p_sched; /* Scheduler specific data */
+ struct label p_label; /* (*) Process (not subject) MAC label */
+ struct p_sched *p_sched; /* (*) Scheduler specific data */
};
#define p_rlimit p_limit->pl_rlimit
==== //depot/projects/smpng/sys/vm/vm_glue.c#24 (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.166 2003/04/22 20:00:26 jhb Exp $
+ * $FreeBSD: src/sys/vm/vm_glue.c,v 1.167 2003/04/23 18:21:41 jhb Exp $
*/
#include "opt_vm.h"
@@ -513,14 +513,16 @@
faultin(p)
struct proc *p;
{
+#ifdef NO_SWAPPING
+
+ PROC_LOCK_ASSERT(p, MA_OWNED);
+ if ((p->p_sflag & PS_INMEM) == 0)
+ panic("faultin: proc swapped out with NO_SWAPPING!");
+#else /* !NO_SWAPPING */
struct thread *td;
GIANT_REQUIRED;
PROC_LOCK_ASSERT(p, MA_OWNED);
-#ifdef NO_SWAPPING
- if ((p->p_sflag & PS_INMEM) == 0)
- panic("faultin: proc swapped out with NO_SWAPPING!");
-#else
/*
* If another process is swapping in this process,
* just wait until it finishes.
@@ -558,7 +560,7 @@
/* Allow other threads to swap p out now. */
--p->p_lock;
}
-#endif
+#endif /* NO_SWAPPING */
}
/*
More information about the p4-projects
mailing list