Skip to content

Commit

Permalink
drivers/char/ip2: separate polling and irq-driven work entry points
Browse files Browse the repository at this point in the history
Polling currently calls the irq handler, which loops through all the
boards, calling the work function for all polling boards with work.

irq handling loops through all the boards, finding the specific board
that applies to us, and calling the work just for that one board.

The two logics are sufficiently different to warrant different
functions, rather than being slack and calling the same function in two
different ways.

This serves to make the interrupt handler a -lot- more efficient.

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Jeff Garzik committed Oct 23, 2007
1 parent f3518e4 commit 6bd3bd6
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions drivers/char/ip2/ip2main.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,7 @@ ip2_loadmain(int *iop, int *irqp, unsigned char *firmware, int firmsize)
continue;
rc = request_irq( ip2config.irq[i], ip2_interrupt,
IP2_SA_FLAGS | (ip2config.type[i] == PCI ? IRQF_SHARED : 0),
pcName, (void *)&pcName);
pcName, i2BoardPtrTable[i]);
if (rc) {
printk(KERN_ERR "IP2: an request_irq failed: error %d\n",rc);
ip2config.irq[i] = CIR_POLL;
Expand Down Expand Up @@ -1191,12 +1191,12 @@ ip2_irq_work(i2eBordStrPtr pB)
#endif /* USE_IQI */
}

static irqreturn_t
ip2_interrupt(int irq, void *dev_id)
static void
ip2_polled_interrupt(void)
{
int i;
i2eBordStrPtr pB;
int handled = 0;
const int irq = 0;

ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, irq );

Expand All @@ -1208,15 +1208,28 @@ ip2_interrupt(int irq, void *dev_id)
// IRQ = 0 for polled boards, we won't poll "IRQ" boards

if ( pB && (pB->i2eUsingIrq == irq) ) {
handled = 1;
ip2_irq_work(pB);
}
}

++irq_counter;

ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
return IRQ_RETVAL(handled);
}

static irqreturn_t
ip2_interrupt(int irq, void *dev_id)
{
i2eBordStrPtr pB = dev_id;

ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, pB->i2eUsingIrq );

ip2_irq_work(pB);

++irq_counter;

ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 );
return IRQ_HANDLED;
}

/******************************************************************************/
Expand All @@ -1239,7 +1252,7 @@ ip2_poll(unsigned long arg)
// Just polled boards, IRQ = 0 will hit all non-interrupt boards.
// It will NOT poll boards handled by hard interrupts.
// The issue of queued BH interrups is handled in ip2_interrupt().
ip2_interrupt(0, NULL);
ip2_polled_interrupt();

PollTimer.expires = POLL_TIMEOUT;
add_timer( &PollTimer );
Expand Down

0 comments on commit 6bd3bd6

Please sign in to comment.