aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Duyck <aduyck@mirantis.com>2016-03-07 12:30:15 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-04-21 02:06:20 -0400
commit144d8305585a00467aaedc86d039a4ab036a9bcc (patch)
tree13aaa98d4c4e1e0941036efdd6c9b526e92c71ba
parent3ef2f563267892230681b1b8890d8f759d39e64d (diff)
fm10k: Add support for bulk Tx cleanup & cleanup boolean logic
This patch enables bulk free in Tx cleanup for fm10k and cleans up the boolean logic in the polling routines for fm10k in the hopes of avoiding any mix-ups similar to what occurred with i40e and i40evf. Signed-off-by: Alexander Duyck <aduyck@mirantis.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-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 */