[patch] if_ath_tx: change interrupt scheduling deferral

Adrian Chadd adrian at freebsd.org
Sat Sep 10 12:24:29 UTC 2011


This patch changes how the deferred interrupt handling works. It's
likely I'll have to change things a bit before I commit it so I won't
be (yet) committing this.
It brings the interrupt handling in line with how ath9k and the
reference driver works. It eliminates a possible race condition:

* ath_intr() and ath_hal_getisr() set AH5212(ah)->ah_intrTxqs, which
is a bitmap of TXQs which need servicing;
* The ath TX processes call txqactive() which check the above bitmap
and clear the bit that's been tested.

The interrupt handler ath_intr() can be called during the TX
completion task, so I think it's possible that the interrupt could
occur, setting a TXQ bit, in between txqactive()'s "check bit X" and
"clear bit X".
My testing was only showing up one queue hang every 20-50 million
packets where the TXQ had active packets in it which were completed,
but hadn't been processed.

I've only just begun testing this. I'll post updates as they're needed.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: ar5416-int-sched.diff
Type: application/octet-stream
Size: 8684 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-wireless/attachments/20110910/85aad26d/ar5416-int-sched.obj

More information about the freebsd-wireless mailing list