aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-03-13 22:35:36 -0400
committerDavid S. Miller <davem@davemloft.net>2016-03-13 22:35:36 -0400
commit5d6084142e8c7535710ba83a6e11ef8952354b02 (patch)
tree543137e609a451177fffd4cd2da7aea7d05c356b
parentc45569755e828a8458d125bb93feb1d90ac9be6f (diff)
parent8ec736e556e3340b4b4295c7567b0766d6629702 (diff)
Merge branch 'net-more-bulk-free-users'
Jesper Dangaard Brouer says: ==================== net: bulk free adjustment and two driver use-cases I've split out the bulk free adjustments, from the bulk alloc patches, as I want the adjustment to napi_consume_skb be in same kernel cycle the API was introduced. Adjustments based on discussion: Subj: "mlx4: use napi_consume_skb API to get bulk free operations" http://thread.gmane.org/gmane.linux.network/402503/focus=403386 Patchset based on net-next at commit 3ebeac1d0295 V4: more nitpicks from Sergei V3: spelling fixes from Sergei ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c15
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en.h2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tx.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c2
-rw-r--r--net/core/skbuff.c4
5 files changed, 15 insertions, 12 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
index e0946ab22010..c0d7b7296236 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c
@@ -276,7 +276,8 @@ static void mlx4_en_stamp_wqe(struct mlx4_en_priv *priv,
276 276
277static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, 277static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
278 struct mlx4_en_tx_ring *ring, 278 struct mlx4_en_tx_ring *ring,
279 int index, u8 owner, u64 timestamp) 279 int index, u8 owner, u64 timestamp,
280 int napi_mode)
280{ 281{
281 struct mlx4_en_tx_info *tx_info = &ring->tx_info[index]; 282 struct mlx4_en_tx_info *tx_info = &ring->tx_info[index];
282 struct mlx4_en_tx_desc *tx_desc = ring->buf + index * TXBB_SIZE; 283 struct mlx4_en_tx_desc *tx_desc = ring->buf + index * TXBB_SIZE;
@@ -347,7 +348,8 @@ static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv,
347 } 348 }
348 } 349 }
349 } 350 }
350 dev_consume_skb_any(skb); 351 napi_consume_skb(skb, napi_mode);
352
351 return tx_info->nr_txbb; 353 return tx_info->nr_txbb;
352} 354}
353 355
@@ -371,7 +373,8 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring)
371 while (ring->cons != ring->prod) { 373 while (ring->cons != ring->prod) {
372 ring->last_nr_txbb = mlx4_en_free_tx_desc(priv, ring, 374 ring->last_nr_txbb = mlx4_en_free_tx_desc(priv, ring,
373 ring->cons & ring->size_mask, 375 ring->cons & ring->size_mask,
374 !!(ring->cons & ring->size), 0); 376 !!(ring->cons & ring->size), 0,
377 0 /* Non-NAPI caller */);
375 ring->cons += ring->last_nr_txbb; 378 ring->cons += ring->last_nr_txbb;
376 cnt++; 379 cnt++;
377 } 380 }
@@ -385,7 +388,7 @@ int mlx4_en_free_tx_buf(struct net_device *dev, struct mlx4_en_tx_ring *ring)
385} 388}
386 389
387static bool mlx4_en_process_tx_cq(struct net_device *dev, 390static bool mlx4_en_process_tx_cq(struct net_device *dev,
388 struct mlx4_en_cq *cq) 391 struct mlx4_en_cq *cq, int napi_budget)
389{ 392{
390 struct mlx4_en_priv *priv = netdev_priv(dev); 393 struct mlx4_en_priv *priv = netdev_priv(dev);
391 struct mlx4_cq *mcq = &cq->mcq; 394 struct mlx4_cq *mcq = &cq->mcq;
@@ -451,7 +454,7 @@ static bool mlx4_en_process_tx_cq(struct net_device *dev,
451 last_nr_txbb = mlx4_en_free_tx_desc( 454 last_nr_txbb = mlx4_en_free_tx_desc(
452 priv, ring, ring_index, 455 priv, ring, ring_index,
453 !!((ring_cons + txbbs_skipped) & 456 !!((ring_cons + txbbs_skipped) &
454 ring->size), timestamp); 457 ring->size), timestamp, napi_budget);
455 458
456 mlx4_en_stamp_wqe(priv, ring, stamp_index, 459 mlx4_en_stamp_wqe(priv, ring, stamp_index,
457 !!((ring_cons + txbbs_stamp) & 460 !!((ring_cons + txbbs_stamp) &
@@ -511,7 +514,7 @@ int mlx4_en_poll_tx_cq(struct napi_struct *napi, int budget)
511 struct mlx4_en_priv *priv = netdev_priv(dev); 514 struct mlx4_en_priv *priv = netdev_priv(dev);
512 int clean_complete; 515 int clean_complete;
513 516
514 clean_complete = mlx4_en_process_tx_cq(dev, cq); 517 clean_complete = mlx4_en_process_tx_cq(dev, cq, budget);
515 if (!clean_complete) 518 if (!clean_complete)
516 return budget; 519 return budget;
517 520
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 0f76d321030f..0cb4a093958b 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -629,7 +629,7 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev);
629void mlx5e_completion_event(struct mlx5_core_cq *mcq); 629void mlx5e_completion_event(struct mlx5_core_cq *mcq);
630void mlx5e_cq_error_event(struct mlx5_core_cq *mcq, enum mlx5_event event); 630void mlx5e_cq_error_event(struct mlx5_core_cq *mcq, enum mlx5_event event);
631int mlx5e_napi_poll(struct napi_struct *napi, int budget); 631int mlx5e_napi_poll(struct napi_struct *napi, int budget);
632bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq); 632bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget);
633int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget); 633int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget);
634bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq); 634bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq);
635struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq); 635struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index 94a14f85f70d..1ffc7cb6f78c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -339,7 +339,7 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev)
339 return mlx5e_sq_xmit(sq, skb); 339 return mlx5e_sq_xmit(sq, skb);
340} 340}
341 341
342bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq) 342bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)
343{ 343{
344 struct mlx5e_sq *sq; 344 struct mlx5e_sq *sq;
345 u32 dma_fifo_cc; 345 u32 dma_fifo_cc;
@@ -411,7 +411,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq)
411 npkts++; 411 npkts++;
412 nbytes += wi->num_bytes; 412 nbytes += wi->num_bytes;
413 sqcc += wi->num_wqebbs; 413 sqcc += wi->num_wqebbs;
414 dev_kfree_skb(skb); 414 napi_consume_skb(skb, napi_budget);
415 } while (!last_wqe); 415 } while (!last_wqe);
416 } 416 }
417 417
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
index 66d51a77609e..9bb4395aceeb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
@@ -60,7 +60,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
60 clear_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags); 60 clear_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags);
61 61
62 for (i = 0; i < c->num_tc; i++) 62 for (i = 0; i < c->num_tc; i++)
63 busy |= mlx5e_poll_tx_cq(&c->sq[i].cq); 63 busy |= mlx5e_poll_tx_cq(&c->sq[i].cq, budget);
64 64
65 work_done = mlx5e_poll_rx_cq(&c->rq.cq, budget); 65 work_done = mlx5e_poll_rx_cq(&c->rq.cq, budget);
66 busy |= work_done == budget; 66 busy |= work_done == budget;
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 51d768e7bc90..f044f970f1a6 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -801,9 +801,9 @@ void napi_consume_skb(struct sk_buff *skb, int budget)
801 if (unlikely(!skb)) 801 if (unlikely(!skb))
802 return; 802 return;
803 803
804 /* if budget is 0 assume netpoll w/ IRQs disabled */ 804 /* Zero budget indicate non-NAPI context called us, like netpoll */
805 if (unlikely(!budget)) { 805 if (unlikely(!budget)) {
806 dev_consume_skb_irq(skb); 806 dev_consume_skb_any(skb);
807 return; 807 return;
808 } 808 }
809 809