diff options
-rw-r--r-- | drivers/net/ethernet/intel/fm10k/fm10k_main.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_main.c b/drivers/net/ethernet/intel/fm10k/fm10k_main.c index 0b465394f88a..97650802a4cc 100644 --- a/drivers/net/ethernet/intel/fm10k/fm10k_main.c +++ b/drivers/net/ethernet/intel/fm10k/fm10k_main.c | |||
@@ -1198,9 +1198,10 @@ void fm10k_tx_timeout_reset(struct fm10k_intfc *interface) | |||
1198 | * fm10k_clean_tx_irq - Reclaim resources after transmit completes | 1198 | * fm10k_clean_tx_irq - Reclaim resources after transmit completes |
1199 | * @q_vector: structure containing interrupt and ring information | 1199 | * @q_vector: structure containing interrupt and ring information |
1200 | * @tx_ring: tx ring to clean | 1200 | * @tx_ring: tx ring to clean |
1201 | * @napi_budget: Used to determine if we are in netpoll | ||
1201 | **/ | 1202 | **/ |
1202 | static bool fm10k_clean_tx_irq(struct fm10k_q_vector *q_vector, | 1203 | static bool fm10k_clean_tx_irq(struct fm10k_q_vector *q_vector, |
1203 | struct fm10k_ring *tx_ring) | 1204 | struct fm10k_ring *tx_ring, int napi_budget) |
1204 | { | 1205 | { |
1205 | struct fm10k_intfc *interface = q_vector->interface; | 1206 | struct fm10k_intfc *interface = q_vector->interface; |
1206 | struct fm10k_tx_buffer *tx_buffer; | 1207 | struct fm10k_tx_buffer *tx_buffer; |
@@ -1238,7 +1239,7 @@ static bool fm10k_clean_tx_irq(struct fm10k_q_vector *q_vector, | |||
1238 | total_packets += tx_buffer->gso_segs; | 1239 | total_packets += tx_buffer->gso_segs; |
1239 | 1240 | ||
1240 | /* free the skb */ | 1241 | /* free the skb */ |
1241 | dev_consume_skb_any(tx_buffer->skb); | 1242 | napi_consume_skb(tx_buffer->skb, napi_budget); |
1242 | 1243 | ||
1243 | /* unmap skb header data */ | 1244 | /* unmap skb header data */ |
1244 | dma_unmap_single(tx_ring->dev, | 1245 | dma_unmap_single(tx_ring->dev, |
@@ -1449,8 +1450,10 @@ static int fm10k_poll(struct napi_struct *napi, int budget) | |||
1449 | int per_ring_budget, work_done = 0; | 1450 | int per_ring_budget, work_done = 0; |
1450 | bool clean_complete = true; | 1451 | bool clean_complete = true; |
1451 | 1452 | ||
1452 | fm10k_for_each_ring(ring, q_vector->tx) | 1453 | fm10k_for_each_ring(ring, q_vector->tx) { |
1453 | clean_complete &= fm10k_clean_tx_irq(q_vector, ring); | 1454 | if (!fm10k_clean_tx_irq(q_vector, ring, budget)) |
1455 | clean_complete = false; | ||
1456 | } | ||
1454 | 1457 | ||
1455 | /* Handle case where we are called by netpoll with a budget of 0 */ | 1458 | /* Handle case where we are called by netpoll with a budget of 0 */ |
1456 | if (budget <= 0) | 1459 | if (budget <= 0) |
@@ -1468,7 +1471,8 @@ static int fm10k_poll(struct napi_struct *napi, int budget) | |||
1468 | int work = fm10k_clean_rx_irq(q_vector, ring, per_ring_budget); | 1471 | int work = fm10k_clean_rx_irq(q_vector, ring, per_ring_budget); |
1469 | 1472 | ||
1470 | work_done += work; | 1473 | work_done += work; |
1471 | clean_complete &= !!(work < per_ring_budget); | 1474 | if (work >= per_ring_budget) |
1475 | clean_complete = false; | ||
1472 | } | 1476 | } |
1473 | 1477 | ||
1474 | /* If all work not completed, return budget and keep polling */ | 1478 | /* If all work not completed, return budget and keep polling */ |