|
@@ -804,13 +804,13 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
struct ixgbe_tx_buffer *tx_buffer;
|
|
|
union ixgbe_adv_tx_desc *tx_desc;
|
|
|
unsigned int total_bytes = 0, total_packets = 0;
|
|
|
+ u16 budget = q_vector->tx.work_limit;
|
|
|
u16 i = tx_ring->next_to_clean;
|
|
|
- u16 count;
|
|
|
|
|
|
tx_buffer = &tx_ring->tx_buffer_info[i];
|
|
|
tx_desc = IXGBE_TX_DESC_ADV(tx_ring, i);
|
|
|
|
|
|
- for (count = 0; count < q_vector->tx.work_limit; count++) {
|
|
|
+ for (; budget; budget--) {
|
|
|
union ixgbe_adv_tx_desc *eop_desc = tx_buffer->next_to_watch;
|
|
|
|
|
|
/* if next_to_watch is not set then there is no work pending */
|
|
@@ -891,11 +891,11 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
ixgbe_tx_timeout_reset(adapter);
|
|
|
|
|
|
/* the adapter is about to reset, no point in enabling stuff */
|
|
|
- return true;
|
|
|
+ return budget;
|
|
|
}
|
|
|
|
|
|
#define TX_WAKE_THRESHOLD (DESC_NEEDED * 2)
|
|
|
- if (unlikely(count && netif_carrier_ok(tx_ring->netdev) &&
|
|
|
+ if (unlikely(total_packets && netif_carrier_ok(tx_ring->netdev) &&
|
|
|
(ixgbe_desc_unused(tx_ring) >= TX_WAKE_THRESHOLD))) {
|
|
|
/* Make sure that anybody stopping the queue after this
|
|
|
* sees the new next_to_clean.
|
|
@@ -908,7 +908,7 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return count < q_vector->tx.work_limit;
|
|
|
+ return budget;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_IXGBE_DCA
|