This moves the knote list to struct process for better process semantics with rthreads. It should have little noticeable effect otherwise, but I've been wrong about simpler diffs before....
Index: sys/proc.h =================================================================== RCS file: /home/tedu/cvs/src/sys/sys/proc.h,v retrieving revision 1.126 diff -u -r1.126 proc.h --- sys/proc.h 20 Apr 2010 22:05:44 -0000 1.126 +++ sys/proc.h 18 May 2010 01:04:06 -0000 @@ -146,6 +146,7 @@ int ps_refcnt; /* Number of references. */ u_int ps_rdomain; /* Process routing domain. */ + struct klist ps_klist; /* knotes attached to this process */ }; #else struct process; @@ -223,8 +224,6 @@ void *p_emuldata; /* Per-process emulation data, or */ /* NULL. Malloc type M_EMULDATA */ - struct klist p_klist; /* knotes attached to this process */ - /* pad to 256, avoid shifting eproc. */ sigset_t p_sigdivert; /* Signals to be diverted to thread. */ Index: kern/kern_event.c =================================================================== RCS file: /home/tedu/cvs/src/sys/kern/kern_event.c,v retrieving revision 1.35 diff -u -r1.35 kern_event.c --- kern/kern_event.c 9 Nov 2009 17:53:39 -0000 1.35 +++ kern/kern_event.c 18 May 2010 01:04:06 -0000 @@ -219,7 +219,7 @@ } /* XXX lock the proc here while adding to the list? */ - SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext); + SLIST_INSERT_HEAD(&p->p_p->ps_klist, kn, kn_selnext); return (0); } @@ -241,7 +241,7 @@ return; /* XXX locking? this might modify another process. */ - SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext); + SLIST_REMOVE(&p->p_p->ps_klist, kn, knote, kn_selnext); } int Index: kern/kern_exec.c =================================================================== RCS file: /home/tedu/cvs/src/sys/kern/kern_exec.c,v retrieving revision 1.111 diff -u -r1.111 kern_exec.c --- kern/kern_exec.c 14 Jan 2010 23:12:11 -0000 1.111 +++ kern/kern_exec.c 18 May 2010 01:04:06 -0000 @@ -599,7 +599,7 @@ /* * notify others that we exec'd */ - KNOTE(&p->p_klist, NOTE_EXEC); + KNOTE(&p->p_p->ps_klist, NOTE_EXEC); /* setup new registers and do misc. setup. */ if (pack.ep_emul->e_fixup != NULL) { Index: kern/kern_exit.c =================================================================== RCS file: /home/tedu/cvs/src/sys/kern/kern_exit.c,v retrieving revision 1.90 diff -u -r1.90 kern_exit.c --- kern/kern_exit.c 24 Mar 2010 23:18:17 -0000 1.90 +++ kern/kern_exit.c 18 May 2010 01:04:06 -0000 @@ -292,7 +292,8 @@ /* * notify interested parties of our demise. */ - KNOTE(&p->p_klist, NOTE_EXIT); + if (p == p->p_p->ps_mainproc) + KNOTE(&p->p_p->ps_klist, NOTE_EXIT); /* * Notify parent that we're gone. If we have P_NOZOMBIE or parent has Index: kern/kern_fork.c =================================================================== RCS file: /home/tedu/cvs/src/sys/kern/kern_fork.c,v retrieving revision 1.109 diff -u -r1.109 kern_fork.c --- kern/kern_fork.c 24 Mar 2010 23:18:17 -0000 1.109 +++ kern/kern_fork.c 18 May 2010 01:04:47 -0000 @@ -156,7 +156,7 @@ { struct process *pr, *parent; - pr = pool_get(&process_pool, PR_WAITOK); + pr = pool_get(&process_pool, PR_WAITOK | PR_ZERO); pr->ps_mainproc = newproc; TAILQ_INIT(&pr->ps_threads); TAILQ_INSERT_TAIL(&pr->ps_threads, newproc, p_thr_link); @@ -460,7 +460,8 @@ /* * Notify any interested parties about the new process. */ - KNOTE(&p1->p_klist, NOTE_FORK | p2->p_pid); + if ((flags & FORK_THREAD) == 0) + KNOTE(&p1->p_p->ps_klist, NOTE_FORK | p2->p_pid); /* * Update stats now that we know the fork was successful. Index: kern/kern_sig.c =================================================================== RCS file: /home/tedu/cvs/src/sys/kern/kern_sig.c,v retrieving revision 1.107 diff -u -r1.107 kern_sig.c --- kern/kern_sig.c 27 Nov 2009 19:43:55 -0000 1.107 +++ kern/kern_sig.c 18 May 2010 01:04:06 -0000 @@ -834,7 +834,7 @@ #endif if (type != SPROPAGATED) - KNOTE(&p->p_klist, NOTE_SIGNAL | signum); + KNOTE(&p->p_p->ps_klist, NOTE_SIGNAL | signum); prop = sigprop[signum]; @@ -1654,7 +1654,7 @@ kn->kn_flags |= EV_CLEAR; /* automatically set */ /* XXX lock the proc here while adding to the list? */ - SLIST_INSERT_HEAD(&p->p_klist, kn, kn_selnext); + SLIST_INSERT_HEAD(&p->p_p->ps_klist, kn, kn_selnext); return (0); } @@ -1664,7 +1664,7 @@ { struct proc *p = kn->kn_ptr.p_proc; - SLIST_REMOVE(&p->p_klist, kn, knote, kn_selnext); + SLIST_REMOVE(&p->p_p->ps_klist, kn, knote, kn_selnext); } /*