Subject: Re: Problems with ath(4) and interrupt sharing
To: None <firstname.lastname@example.org>
From: Joerg Sonnenberger <email@example.com>
Date: 11/19/2007 12:28:55
On Fri, Nov 16, 2007 at 06:32:18PM -0800, Brian Buhrow wrote:
> In looking at the ath driver source code, I find I have a couple of
> questions in ath_intr() in src/sys/dev/ic/ath.c
> Here's the snippet, with my questions below that.
> 810 if ((ifp->if_flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP))
> 811 DPRINTF(sc, ATH_DEBUG_ANY, "%s: if_flags 0x%x\n",
> 812 __func__, ifp->if_flags);
> 813 ath_hal_getisr(ah, &status); /* clear ISR */
> 814 ath_hal_intrset(ah, 0); /* disable further intr's */
> 815 return 1; /* XXX */
> 816 }
> My questions are:
> 1. Does the call to ath_hal_intrset() disable the device from generating
> interupts, or does it disable the interrupts from being acted upon,
> regardless of which device on that interrupt generated them?
It stops the device from generating further interrupts. You haven't
quoted the check for pending interrupts directly above this and the
logic is that (a) if there's no pending interrupt it won't reach above
block and (b) if it reaches the above block and the interface is not
running, it stops further interrupts.
Do you see interrupt storms, e.g. vmstat -i gives interrupt rates >
1k/s? Otherwise this shouldn't be the problem.