Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Nov 2004 14:24:49 -0500
From:      John Baldwin <jhb@FreeBSD.org>
To:        freebsd-current@FreeBSD.org
Cc:        current@FreeBSD.org
Subject:   Re: 6-CURRENT unbelievably slow?
Message-ID:  <200411151424.49790.jhb@FreeBSD.org>
In-Reply-To: <20041111223705.GL582@hub.freebsd.org>
References:  <Pine.NEB.3.96L.1041110212739.85487A-100000@fledge.watson.org> <1100176749.41935d6d12032@netchild.homeip.net> <20041111223705.GL582@hub.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 11 November 2004 05:37 pm, Kris Kennaway wrote:
> On Thu, Nov 11, 2004 at 01:39:09PM +0100, Alexander@Leidinger.net wrote:
> > Zitat von Joe Marcus Clarke <marcus@freebsd.org>:
> > > I noticed the interrupt storm detection line in dmesg.  In previous
> > > builds, this worked, but it doesn't seem to be taking effect anymore.
> >
> > AFAIK the interrupt storm detection was removed (at least partially).
>
> s/removed/fixed so it doesn't give so many false positives/
>
> (at least partially) ;-)
>
> Talk to jhb..

Please try this patch out and let me know if it does any better:

--- //depot/vendor/freebsd/src/sys/kern/kern_intr.c	2004/11/05 19:15:40
+++ //depot/projects/smpng/sys/kern/kern_intr.c	2004/11/15 19:20:11
@@ -485,7 +485,7 @@
 	struct intrhand *ih;		/* and our interrupt handler chain */
 	struct thread *td;
 	struct proc *p;
-	int count, warned;
+	int count, warned, storming;
 	
 	td = curthread;
 	p = td->td_proc;
@@ -494,6 +494,7 @@
 	    ("%s: ithread and proc linkage out of sync", __func__));
 	count = 0;
 	warned = 0;
+	storming = 0;
 
 	/*
 	 * As long as we have interrupts outstanding, go through the
@@ -549,10 +550,26 @@
 			}
 
 			/*
-			 * If we detect an interrupt storm, pause with the
-			 * source masked until the next hardclock tick.
+			 * Interrupt storm handling:
+			 *
+			 * If this interrupt source is currently storming,
+			 * then throttle it to only fire the handler once
+			 * per clock tick.  Each second we go out of storming
+			 * mode to see if the storm has subsided.
+			 *
+			 * If this interrupt source is not currently
+			 * storming, but the number of back to back
+			 * interrupts exceeds the storm threshold, then
+			 * enter storming mode.
 			 */
-			if (intr_storm_threshold != 0 &&
+			if (storming) {
+				tsleep(&count, td->td_priority, "istorm", 1);
+				if (count > hz) {
+					storming = 0;
+					count = 0;
+				} else
+					count++;
+			} else if (intr_storm_threshold != 0 &&
 			    count >= intr_storm_threshold) {
 				if (!warned) {
 					printf(
@@ -560,7 +577,7 @@
 					    p->p_comm);
 					warned = 1;
 				}
-				tsleep(&count, td->td_priority, "istorm", 1);
+				storming = 1;
 				count = 0;
 			} else
 				count++;
@@ -580,6 +597,7 @@
 		if (!ithd->it_need) {
 			TD_SET_IWAIT(td);
 			count = 0;
+			storming = 0;
 			CTR2(KTR_INTR, "%s: pid %d: done", __func__, p->p_pid);
 			mi_switch(SW_VOL, NULL);
 			CTR2(KTR_INTR, "%s: pid %d: resumed", __func__, p->p_pid);

-- 
John Baldwin <jhb@FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org



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