aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/intel/fm10k/fm10k_main.c14
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 **/
1202static bool fm10k_clean_tx_irq(struct fm10k_q_vector *q_vector, 1203static 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 */