Commit 3f2aa566 authored by David S. Miller's avatar David S. Miller

Merge branch 'mlx4-order-0-allocations-and-page-recycling'

Eric Dumazet says:

====================
mlx4: order-0 allocations and page recycling

As mentioned half a year ago, we better switch mlx4 driver to order-0
allocations and page recycling.

This reduces vulnerability surface thanks to better skb->truesize
tracking and provides better performance in most cases.
(33 Gbit for one TCP flow on my lab hosts)

I will provide for linux-4.13 a patch on top of this series,
trying to improve data locality as described in
https://www.spinics.net/lists/netdev/msg422258.html

v2 provides an ethtool -S new counter (rx_alloc_pages) and
code factorization, plus Tariq fix.

v3 includes various fixes based on Tariq tests and feedback
from Saeed and Tariq.

v4 rebased on net-next for inclusion in linux-4.12, as requested
by Tariq.

Worth noting this patch series deletes ~250 lines of code ;)
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 3c66d1c7 68b8df46
...@@ -117,7 +117,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = { ...@@ -117,7 +117,7 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
/* port statistics */ /* port statistics */
"tso_packets", "tso_packets",
"xmit_more", "xmit_more",
"queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_failed", "queue_stopped", "wake_queue", "tx_timeout", "rx_alloc_pages",
"rx_csum_good", "rx_csum_none", "rx_csum_complete", "tx_chksum_offload", "rx_csum_good", "rx_csum_none", "rx_csum_complete", "tx_chksum_offload",
/* pf statistics */ /* pf statistics */
......
...@@ -213,6 +213,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) ...@@ -213,6 +213,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
priv->port_stats.rx_chksum_good = 0; priv->port_stats.rx_chksum_good = 0;
priv->port_stats.rx_chksum_none = 0; priv->port_stats.rx_chksum_none = 0;
priv->port_stats.rx_chksum_complete = 0; priv->port_stats.rx_chksum_complete = 0;
priv->port_stats.rx_alloc_pages = 0;
priv->xdp_stats.rx_xdp_drop = 0; priv->xdp_stats.rx_xdp_drop = 0;
priv->xdp_stats.rx_xdp_tx = 0; priv->xdp_stats.rx_xdp_tx = 0;
priv->xdp_stats.rx_xdp_tx_full = 0; priv->xdp_stats.rx_xdp_tx_full = 0;
...@@ -223,6 +224,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) ...@@ -223,6 +224,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset)
priv->port_stats.rx_chksum_good += READ_ONCE(ring->csum_ok); priv->port_stats.rx_chksum_good += READ_ONCE(ring->csum_ok);
priv->port_stats.rx_chksum_none += READ_ONCE(ring->csum_none); priv->port_stats.rx_chksum_none += READ_ONCE(ring->csum_none);
priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete); priv->port_stats.rx_chksum_complete += READ_ONCE(ring->csum_complete);
priv->port_stats.rx_alloc_pages += READ_ONCE(ring->rx_alloc_pages);
priv->xdp_stats.rx_xdp_drop += READ_ONCE(ring->xdp_drop); priv->xdp_stats.rx_xdp_drop += READ_ONCE(ring->xdp_drop);
priv->xdp_stats.rx_xdp_tx += READ_ONCE(ring->xdp_tx); priv->xdp_stats.rx_xdp_tx += READ_ONCE(ring->xdp_tx);
priv->xdp_stats.rx_xdp_tx_full += READ_ONCE(ring->xdp_tx_full); priv->xdp_stats.rx_xdp_tx_full += READ_ONCE(ring->xdp_tx_full);
......
This diff is collapsed.
...@@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) ...@@ -81,14 +81,11 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
{ {
u32 loopback_ok = 0; u32 loopback_ok = 0;
int i; int i;
bool gro_enabled;
priv->loopback_ok = 0; priv->loopback_ok = 0;
priv->validate_loopback = 1; priv->validate_loopback = 1;
gro_enabled = priv->dev->features & NETIF_F_GRO;
mlx4_en_update_loopback_state(priv->dev, priv->dev->features); mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
priv->dev->features &= ~NETIF_F_GRO;
/* xmit */ /* xmit */
if (mlx4_en_test_loopback_xmit(priv)) { if (mlx4_en_test_loopback_xmit(priv)) {
...@@ -111,9 +108,6 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv) ...@@ -111,9 +108,6 @@ static int mlx4_en_test_loopback(struct mlx4_en_priv *priv)
priv->validate_loopback = 0; priv->validate_loopback = 0;
if (gro_enabled)
priv->dev->features |= NETIF_F_GRO;
mlx4_en_update_loopback_state(priv->dev, priv->dev->features); mlx4_en_update_loopback_state(priv->dev, priv->dev->features);
return !loopback_ok; return !loopback_ok;
} }
......
...@@ -354,13 +354,11 @@ u32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv, ...@@ -354,13 +354,11 @@ u32 mlx4_en_recycle_tx_desc(struct mlx4_en_priv *priv,
struct mlx4_en_rx_alloc frame = { struct mlx4_en_rx_alloc frame = {
.page = tx_info->page, .page = tx_info->page,
.dma = tx_info->map0_dma, .dma = tx_info->map0_dma,
.page_offset = XDP_PACKET_HEADROOM,
.page_size = PAGE_SIZE,
}; };
if (!mlx4_en_rx_recycle(ring->recycle_ring, &frame)) { if (!mlx4_en_rx_recycle(ring->recycle_ring, &frame)) {
dma_unmap_page(priv->ddev, tx_info->map0_dma, dma_unmap_page(priv->ddev, tx_info->map0_dma,
PAGE_SIZE, priv->frag_info[0].dma_dir); PAGE_SIZE, priv->dma_dir);
put_page(tx_info->page); put_page(tx_info->page);
} }
......
...@@ -102,17 +102,6 @@ ...@@ -102,17 +102,6 @@
/* Use the maximum between 16384 and a single page */ /* Use the maximum between 16384 and a single page */
#define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384) #define MLX4_EN_ALLOC_SIZE PAGE_ALIGN(16384)
#define MLX4_EN_ALLOC_PREFER_ORDER min_t(int, get_order(32768), \
PAGE_ALLOC_COSTLY_ORDER)
/* Receive fragment sizes; we use at most 3 fragments (for 9600 byte MTU
* and 4K allocations) */
enum {
FRAG_SZ0 = 1536 - NET_IP_ALIGN,
FRAG_SZ1 = 4096,
FRAG_SZ2 = 4096,
FRAG_SZ3 = MLX4_EN_ALLOC_SIZE
};
#define MLX4_EN_MAX_RX_FRAGS 4 #define MLX4_EN_MAX_RX_FRAGS 4
/* Maximum ring sizes */ /* Maximum ring sizes */
...@@ -264,13 +253,16 @@ struct mlx4_en_rx_alloc { ...@@ -264,13 +253,16 @@ struct mlx4_en_rx_alloc {
struct page *page; struct page *page;
dma_addr_t dma; dma_addr_t dma;
u32 page_offset; u32 page_offset;
u32 page_size;
}; };
#define MLX4_EN_CACHE_SIZE (2 * NAPI_POLL_WEIGHT) #define MLX4_EN_CACHE_SIZE (2 * NAPI_POLL_WEIGHT)
struct mlx4_en_page_cache { struct mlx4_en_page_cache {
u32 index; u32 index;
struct mlx4_en_rx_alloc buf[MLX4_EN_CACHE_SIZE]; struct {
struct page *page;
dma_addr_t dma;
} buf[MLX4_EN_CACHE_SIZE];
}; };
struct mlx4_en_priv; struct mlx4_en_priv;
...@@ -335,7 +327,6 @@ struct mlx4_en_rx_desc { ...@@ -335,7 +327,6 @@ struct mlx4_en_rx_desc {
struct mlx4_en_rx_ring { struct mlx4_en_rx_ring {
struct mlx4_hwq_resources wqres; struct mlx4_hwq_resources wqres;
struct mlx4_en_rx_alloc page_alloc[MLX4_EN_MAX_RX_FRAGS];
u32 size ; /* number of Rx descs*/ u32 size ; /* number of Rx descs*/
u32 actual_size; u32 actual_size;
u32 size_mask; u32 size_mask;
...@@ -355,6 +346,7 @@ struct mlx4_en_rx_ring { ...@@ -355,6 +346,7 @@ struct mlx4_en_rx_ring {
unsigned long csum_ok; unsigned long csum_ok;
unsigned long csum_none; unsigned long csum_none;
unsigned long csum_complete; unsigned long csum_complete;
unsigned long rx_alloc_pages;
unsigned long xdp_drop; unsigned long xdp_drop;
unsigned long xdp_tx; unsigned long xdp_tx;
unsigned long xdp_tx_full; unsigned long xdp_tx_full;
...@@ -472,11 +464,7 @@ struct mlx4_en_mc_list { ...@@ -472,11 +464,7 @@ struct mlx4_en_mc_list {
struct mlx4_en_frag_info { struct mlx4_en_frag_info {
u16 frag_size; u16 frag_size;
u16 frag_prefix_size;
u32 frag_stride; u32 frag_stride;
enum dma_data_direction dma_dir;
u16 order;
u16 rx_headroom;
}; };
#ifdef CONFIG_MLX4_EN_DCB #ifdef CONFIG_MLX4_EN_DCB
...@@ -584,8 +572,10 @@ struct mlx4_en_priv { ...@@ -584,8 +572,10 @@ struct mlx4_en_priv {
u32 rx_ring_num; u32 rx_ring_num;
u32 rx_skb_size; u32 rx_skb_size;
struct mlx4_en_frag_info frag_info[MLX4_EN_MAX_RX_FRAGS]; struct mlx4_en_frag_info frag_info[MLX4_EN_MAX_RX_FRAGS];
u16 num_frags; u8 num_frags;
u16 log_rx_info; u8 log_rx_info;
u8 dma_dir;
u16 rx_headroom;
struct mlx4_en_tx_ring **tx_ring[MLX4_EN_NUM_TX_TYPES]; struct mlx4_en_tx_ring **tx_ring[MLX4_EN_NUM_TX_TYPES];
struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS]; struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS];
......
...@@ -37,7 +37,7 @@ struct mlx4_en_port_stats { ...@@ -37,7 +37,7 @@ struct mlx4_en_port_stats {
unsigned long queue_stopped; unsigned long queue_stopped;
unsigned long wake_queue; unsigned long wake_queue;
unsigned long tx_timeout; unsigned long tx_timeout;
unsigned long rx_alloc_failed; unsigned long rx_alloc_pages;
unsigned long rx_chksum_good; unsigned long rx_chksum_good;
unsigned long rx_chksum_none; unsigned long rx_chksum_none;
unsigned long rx_chksum_complete; unsigned long rx_chksum_complete;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment