Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Oct 2004 15:27:01 GMT
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 63883 for review
Message-ID:  <200410281527.i9SFR1FC084325@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=63883

Change 63883 by jhb@jhb_slimer on 2004/10/28 15:26:59

	Remove bde's pessimizations to the interrupt storm detection code.

Affected files ...

.. //depot/projects/smpng/sys/kern/kern_intr.c#54 edit

Differences ...

==== //depot/projects/smpng/sys/kern/kern_intr.c#54 (text+ko) ====

@@ -485,22 +485,14 @@
 	struct intrhand *ih;		/* and our interrupt handler chain */
 	struct thread *td;
 	struct proc *p;
-#ifdef HACK
-	int count, warming, warned;
-#else
 	int count, warned;
-#endif
 	
 	td = curthread;
 	p = td->td_proc;
 	ithd = (struct ithd *)arg;	/* point to myself */
 	KASSERT(ithd->it_td == td && td->td_ithd == ithd,
 	    ("%s: ithread and proc linkage out of sync", __func__));
-#ifdef HACK
-	warming = 10 * intr_storm_threshold;
-#else
 	count = 0;
-#endif
 	warned = 0;
 
 	/*
@@ -522,9 +514,6 @@
 
 		CTR4(KTR_INTR, "%s: pid %d: (%s) need=%d", __func__,
 		     p->p_pid, p->p_comm, ithd->it_need);
-#ifdef HACK
-		count = 0;
-#endif
 		while (ithd->it_need) {
 			/*
 			 * Service interrupts.  If another interrupt
@@ -559,7 +548,6 @@
 					mtx_unlock(&Giant);
 			}
 
-#ifndef HACK
 			/*
 			 * If we detect an interrupt storm, pause with the
 			 * source masked until the next hardclock tick.
@@ -576,62 +564,9 @@
 				count = 0;
 			} else
 				count++;
-#endif
 
-			if (ithd->it_enable != NULL) {
+			if (ithd->it_enable != NULL)
 				ithd->it_enable(ithd->it_vector);
-#ifdef HACK
-				/*
-				 * Storm detection needs a delay here
-				 * to see slightly delayed interrupts
-				 * on some machines, but we don't
-				 * want to always delay, so only delay
-				 * while warming up.
-				 *
-				 * XXXRW: Calling DELAY() in the interrupt
-				 * path surely needs to be revisited.
-				 */
-				if (warming != 0) {
-					DELAY(1);
-					--warming;
-				}
-#endif
-			}
-
-#ifdef HACK
-			/*
-			 * If we detect an interrupt storm, sleep until
-			 * the next hardclock tick.  We sleep at the
-			 * end of the loop instead of at the beginning
-			 * to ensure that we see slightly delayed
-			 * interrupts.
-			 */
-			if (intr_storm_threshold != 0 &&
-			    count >= intr_storm_threshold) {
-				if (!warned) {
-					printf(
-	"Interrupt storm detected on \"%s\"; throttling interrupt source\n",
-					    p->p_comm);
-					warned = 1;
-				}
-				tsleep(&count, td->td_priority, "istorm", 1);
-
-				/*
-				 * Fudge the count to re-throttle if the
-				 * interrupt is still active.  Our storm
-				 * detection is too primitive to detect
-				 * whether the storm has gone away
-				 * reliably, even if we were to waste a
-				 * lot of time spinning for the next
-				 * intr_storm_threshold interrupts, so
-				 * we assume that the storm hasn't gone
-				 * away unless the interrupt repeats
-				 * less often the hardclock interrupt.
-				 */
-				count = INT_MAX - 1;
-			}
-			count++;
-#endif
 		}
 		WITNESS_WARN(WARN_PANIC, NULL, "suspending ithread");
 		mtx_assert(&Giant, MA_NOTOWNED);
@@ -644,9 +579,7 @@
 		mtx_lock_spin(&sched_lock);
 		if (!ithd->it_need) {
 			TD_SET_IWAIT(td);
-#ifndef HACK
 			count = 0;
-#endif
 			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);



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