The low-level interrupt routine is started by the high-level interrupt routine triggering a software interrupt. Once running, it should continue to do so until there is nothing left to process, as Example 7-5 shows.
Example 7-5 Low-level Interrupt Routine
static uint_t
xxlowintr(caddr_t arg)
{
struct xxstate *xsp = (struct xxstate *)arg;
....
mutex_enter(&xsp->low_mu);
mutex_enter(&xsp->high_mu);
if (xsp->softint_count > 1) {
xsp->softint_count--;
mutex_exit(&xsp->high_mu);
mutex_exit(&xsp->low_mu);
return (DDI_INTR_CLAIMED);
}
if (queue empty) {
mutex_exit(&xsp->high_mu);
mutex_exit(&xsp->low_mu);
return (DDI_INTR_UNCLAIMED);
}
xsp->softint_running = 1;
while (data on queue) {
ASSERT(mutex_owned(&xsp->high_mu);
dequeue data from high-level queue;
mutex_exit(&xsp->high_mu);
normal interrupt processing
mutex_enter(&xsp->high_mu);
}
xsp->softint_running = 0;
xsp->softint_count = 0;
mutex_exit(&xsp->high_mu);
mutex_exit(&xsp->low_mu);
return (DDI_INTR_CLAIMED);
}
|