diff options
author | David S. Miller <davem@davemloft.net> | 2016-03-13 22:35:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-03-13 22:35:36 -0400 |
commit | 5d6084142e8c7535710ba83a6e11ef8952354b02 (patch) | |
tree | 543137e609a451177fffd4cd2da7aea7d05c356b | |
parent | c45569755e828a8458d125bb93feb1d90ac9be6f (diff) | |
parent | 8ec736e556e3340b4b4295c7567b0766d6629702 (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.c | 15 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c | 2 | ||||
-rw-r--r-- | net/core/skbuff.c | 4 |
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 | ||
277 | static u32 mlx4_en_free_tx_desc(struct mlx4_en_priv *priv, | 277 | static 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 | ||
387 | static bool mlx4_en_process_tx_cq(struct net_device *dev, | 390 | static 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); | |||
629 | void mlx5e_completion_event(struct mlx5_core_cq *mcq); | 629 | void mlx5e_completion_event(struct mlx5_core_cq *mcq); |
630 | void mlx5e_cq_error_event(struct mlx5_core_cq *mcq, enum mlx5_event event); | 630 | void mlx5e_cq_error_event(struct mlx5_core_cq *mcq, enum mlx5_event event); |
631 | int mlx5e_napi_poll(struct napi_struct *napi, int budget); | 631 | int mlx5e_napi_poll(struct napi_struct *napi, int budget); |
632 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq); | 632 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget); |
633 | int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget); | 633 | int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget); |
634 | bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq); | 634 | bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq); |
635 | struct mlx5_cqe64 *mlx5e_get_cqe(struct mlx5e_cq *cq); | 635 | struct 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 | ||
342 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq) | 342 | bool 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 | ||