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>