diff options
-rw-r--r-- | sys/kern/kern_intr.c | 54 |
1 files changed, 12 insertions, 42 deletions
diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c index c777da3..180abfd 100644 --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -485,14 +485,14 @@ ithread_loop(void *arg) struct intrhand *ih; /* and our interrupt handler chain */ struct thread *td; struct proc *p; - int count, warming, warned; + int count, warned; 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__)); - warming = 10 * intr_storm_threshold; + count = 0; warned = 0; /* @@ -514,7 +514,6 @@ ithread_loop(void *arg) CTR4(KTR_INTR, "%s: pid %d: (%s) need=%d", __func__, p->p_pid, p->p_comm, ithd->it_need); - count = 0; while (ithd->it_need) { /* * Service interrupts. If another interrupt @@ -548,33 +547,13 @@ restart: if ((ih->ih_flags & IH_MPSAFE) == 0) mtx_unlock(&Giant); } - if (ithd->it_enable != NULL) { - ithd->it_enable(ithd->it_vector); - - /* - * 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; - } - } /* - * 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 we detect an interrupt storm, pause with the + * source masked until the next hardclock tick. */ - if (count >= intr_storm_threshold) { + if (intr_storm_threshold != 0 && + count >= intr_storm_threshold) { if (!warned) { printf( "Interrupt storm detected on \"%s\"; throttling interrupt source\n", @@ -582,22 +561,12 @@ restart: warned = 1; } tsleep(&count, td->td_priority, "istorm", 1); + count = 0; + } else + count++; - /* - * 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++; + if (ithd->it_enable != NULL) + ithd->it_enable(ithd->it_vector); } WITNESS_WARN(WARN_PANIC, NULL, "suspending ithread"); mtx_assert(&Giant, MA_NOTOWNED); @@ -610,6 +579,7 @@ restart: mtx_lock_spin(&sched_lock); if (!ithd->it_need) { TD_SET_IWAIT(td); + count = 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); |