Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Oct 2004 23:07:32 +1000
From:      Sam Lawrance <boris@brooknet.com.au>
To:        Robert Watson <rwatson@freebsd.org>
Cc:        David Xu <davidxu@freebsd.org>
Subject:   Re: Noticable Delays Since Beta 3 (possible cause)
Message-ID:  <1097500052.2797.10.camel@dirk.no.domain>
In-Reply-To: <Pine.NEB.3.96L.1041011045403.31040K-100000@fledge.watson.org>
References:  <Pine.NEB.3.96L.1041011045403.31040K-100000@fledge.watson.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Folks,

On Mon, 2004-10-11 at 04:55 -0400, Robert Watson wrote:
> On Sat, 9 Oct 2004, Sam Lawrance wrote:
> 
> > I'm sorry, that patch was missing paths.. this one:
> > 
> > http://sam.stral.net/freebsd/wakeupdelay-patch
> > 
> > is much nicer. 
> 
> Are there plans to get this patch merged for 5.3?  I was chatting with
> Brian yesterday about the accept locking issue in sofree() and he was
> indicating that he was seeing symptoms very much like the ones described
> in this thread (long wakeup times for keypresses, etc).

I just noticed that the messages David sent to me and the list have yet
to make it through to the list. One was a patch which puts the wakeup in
the critical_exit where he suggested (but I didn't understand :). Here
it is:

Index: sys/proc.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/proc.h,v
retrieving revision 1.409
diff -u -r1.409 proc.h
--- sys/proc.h	6 Oct 2004 00:40:40 -0000	1.409
+++ sys/proc.h	9 Oct 2004 10:59:50 -0000
@@ -369,7 +369,7 @@
 #define	TDP_SA		0x00000080 /* A scheduler activation based thread. */
 #define	TDP_OWEPREEMPT	0x00000100 /* Thread has a pending preemption. */
 #define	TDP_OWEUPC	0x00000200 /* Call addupc() at next AST. */
-#define	TDP_UNUSED10	0x00000400 /* -- available-- */
+#define	TDP_WAKEPROC0	0x00000400 /* Wants caller to wakeup(&proc0) */
 #define	TDP_CAN_UNBIND	0x00000800 /* Only temporarily bound. */
 #define	TDP_SCHED1	0x00001000 /* Reserved for scheduler private use */
 #define	TDP_SCHED2	0x00002000 /* Reserved for scheduler private use */
Index: kern/kern_switch.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_switch.c,v
retrieving revision 1.97
diff -u -r1.97 kern_switch.c
--- kern/kern_switch.c	5 Oct 2004 22:03:10 -0000	1.97
+++ kern/kern_switch.c	9 Oct 2004 10:59:50 -0000
@@ -449,6 +449,10 @@
 	KASSERT(td->td_critnest != 0,
 	    ("critical_exit: td_critnest == 0"));
 	if (td->td_critnest == 1) {
+		if (td->td_pflags & TDP_WAKEPROC0) {
+			td->td_pflags &= ~TDP_WAKEPROC0;
+			wakeup(&proc0);
+		}
 #ifdef PREEMPTION
 		mtx_assert(&sched_lock, MA_NOTOWNED);
 		if (td->td_pflags & TDP_OWEPREEMPT) {
Index: kern/kern_synch.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.262
diff -u -r1.262 kern_synch.c
--- kern/kern_synch.c	5 Oct 2004 18:51:11 -0000	1.262
+++ kern/kern_synch.c	9 Oct 2004 10:59:51 -0000
@@ -390,13 +390,13 @@
 	if ((p->p_sflag & PS_INMEM) == 0) {
 		if ((p->p_sflag & PS_SWAPPINGIN) == 0) {
 			p->p_sflag |= PS_SWAPINREQ;
-#ifndef SMP
 			/*
-			 * XXX: Disabled on SMP due to a LOR between
-			 * sched_lock and the sleepqueue chain locks.
+			 * due to a LOR between sched_lock and
+			 * the sleepqueue chain locks, delay
+			 * wakeup proc0 until thread leaves
+			 * critical region.
 			 */
-			wakeup(&proc0);
-#endif
+			curthread->td_pflags |= TDP_WAKEPROC0;
 		}
 	} else
 		sched_wakeup(td);





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