summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-11-11 06:17:10 -0500
committerJeff Garzik <jgarzik@pobox.com>2004-11-11 06:17:10 -0500
commitf5c830f6142f0806bb281cb021d71e0e18bdb511 (patch)
treea3a0919fa3b3e487081ea2e2a2e4930b57d82b14 /drivers
parentd993b31a2a141d2a7f9812d28659e19c09ed3dbb (diff)
[PATCH] ixgb: fix ixgb_intr looping checks
This patch undoes a change that we believe will impact performance adversely, by creating possibly too long a delay between servicing completions. The comment pretty much explains it. We need to call both cleanup routines each pass through the loop, this time we have a comment explaining why. Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ixgb/ixgb_main.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
index 87af2c7dd1d2..bcc10686806c 100644
--- a/drivers/net/ixgb/ixgb_main.c
+++ b/drivers/net/ixgb/ixgb_main.c
@@ -1613,13 +1613,14 @@ static irqreturn_t ixgb_intr(int irq, void *data, struct pt_regs *regs)
__netif_rx_schedule(netdev);
}
#else
- for (i = 0; i < IXGB_MAX_INTR; i++)
- if (ixgb_clean_rx_irq(adapter) == FALSE)
+ /* yes, that is actually a & and it is meant to make sure that
+ * every pass through this for loop checks both receive and
+ * transmit queues for completed descriptors, intended to
+ * avoid starvation issues and assist tx/rx fairness. */
+ for(i = 0; i < IXGB_MAX_INTR; i++)
+ if(!ixgb_clean_rx_irq(adapter) &
+ !ixgb_clean_tx_irq(adapter))
break;
- for (i = 0; i < IXGB_MAX_INTR; i++)
- if (ixgb_clean_tx_irq(adapter) == FALSE)
- break;
-
/* if RAIDC:EN == 1 and ICR:RXDMT0 == 1, we need to
* set IMS:RXDMT0 to 1 to restart the RBD timer (POLL)
*/