Re: [PATCH net-next v2] net/mlx5e: Support bpf_xdp_adjust_head()

2017-01-18 Thread David Miller
From: Martin KaFai Lau 
Date: Tue, 17 Jan 2017 22:06:07 -0800

> This patch adds bpf_xdp_adjust_head() support to mlx5e.
> 
> 1. rx_headroom is added to struct mlx5e_rq.  It uses
>an existing 4 byte hole in the struct.
> 2. The adjusted data length is checked against
>MLX5E_XDP_MIN_INLINE and MLX5E_SW2HW_MTU(rq->netdev->mtu).
> 3. The macro MLX5E_SW2HW_MTU is moved from en_main.c to en.h.
>MLX5E_HW2SW_MTU is also moved to en.h for symmetric reason
>but it is not a must.
> 
> v2:
> - Keep the xdp specific logic in mlx5e_xdp_handle()
> - Update dma_len after the sanity checks in mlx5e_xmit_xdp_frame()
> 
> Signed-off-by: Martin KaFai Lau 

Applied.


Re: [PATCH net-next v2] net/mlx5e: Support bpf_xdp_adjust_head()

2017-01-18 Thread Saeed Mahameed
On Wed, Jan 18, 2017 at 8:06 AM, Martin KaFai Lau  wrote:
> This patch adds bpf_xdp_adjust_head() support to mlx5e.
>
> 1. rx_headroom is added to struct mlx5e_rq.  It uses
>an existing 4 byte hole in the struct.
> 2. The adjusted data length is checked against
>MLX5E_XDP_MIN_INLINE and MLX5E_SW2HW_MTU(rq->netdev->mtu).
> 3. The macro MLX5E_SW2HW_MTU is moved from en_main.c to en.h.
>MLX5E_HW2SW_MTU is also moved to en.h for symmetric reason
>but it is not a must.
>
> v2:
> - Keep the xdp specific logic in mlx5e_xdp_handle()
> - Update dma_len after the sanity checks in mlx5e_xmit_xdp_frame()
>
> Signed-off-by: Martin KaFai Lau 

Acked-by: Saeed Mahameed 


Thank you Martin.


[PATCH net-next v2] net/mlx5e: Support bpf_xdp_adjust_head()

2017-01-17 Thread Martin KaFai Lau
This patch adds bpf_xdp_adjust_head() support to mlx5e.

1. rx_headroom is added to struct mlx5e_rq.  It uses
   an existing 4 byte hole in the struct.
2. The adjusted data length is checked against
   MLX5E_XDP_MIN_INLINE and MLX5E_SW2HW_MTU(rq->netdev->mtu).
3. The macro MLX5E_SW2HW_MTU is moved from en_main.c to en.h.
   MLX5E_HW2SW_MTU is also moved to en.h for symmetric reason
   but it is not a must.

v2:
- Keep the xdp specific logic in mlx5e_xdp_handle()
- Update dma_len after the sanity checks in mlx5e_xmit_xdp_frame()

Signed-off-by: Martin KaFai Lau 
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h  |  4 ++
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 18 -
 drivers/net/ethernet/mellanox/mlx5/core/en_rx.c   | 47 ++-
 3 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index a473cea10c16..0d9dd860a295 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -51,6 +51,9 @@
 
 #define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v)
 
+#define MLX5E_HW2SW_MTU(hwmtu) ((hwmtu) - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN))
+#define MLX5E_SW2HW_MTU(swmtu) ((swmtu) + (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN))
+
 #define MLX5E_MAX_NUM_TC   8
 
 #define MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE0x6
@@ -369,6 +372,7 @@ struct mlx5e_rq {
 
unsigned long  state;
intix;
+   u16rx_headroom;
 
struct mlx5e_rx_am am; /* Adaptive Moderation */
struct bpf_prog   *xdp_prog;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index f74ba73c55c7..aba3691e0919 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -343,9 +343,6 @@ static void mlx5e_disable_async_events(struct mlx5e_priv 
*priv)
synchronize_irq(mlx5_get_msix_vec(priv->mdev, MLX5_EQ_VEC_ASYNC));
 }
 
-#define MLX5E_HW2SW_MTU(hwmtu) (hwmtu - (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN))
-#define MLX5E_SW2HW_MTU(swmtu) (swmtu + (ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN))
-
 static inline int mlx5e_get_wqe_mtt_sz(void)
 {
/* UMR copies MTTs in units of MLX5_UMR_MTT_ALIGNMENT bytes.
@@ -534,9 +531,13 @@ static int mlx5e_create_rq(struct mlx5e_channel *c,
goto err_rq_wq_destroy;
}
 
-   rq->buff.map_dir = DMA_FROM_DEVICE;
-   if (rq->xdp_prog)
+   if (rq->xdp_prog) {
rq->buff.map_dir = DMA_BIDIRECTIONAL;
+   rq->rx_headroom = XDP_PACKET_HEADROOM;
+   } else {
+   rq->buff.map_dir = DMA_FROM_DEVICE;
+   rq->rx_headroom = MLX5_RX_HEADROOM;
+   }
 
switch (priv->params.rq_wq_type) {
case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
@@ -586,7 +587,7 @@ static int mlx5e_create_rq(struct mlx5e_channel *c,
byte_count = rq->buff.wqe_sz;
 
/* calc the required page order */
-   frag_sz = MLX5_RX_HEADROOM +
+   frag_sz = rq->rx_headroom +
  byte_count /* packet data */ +
  SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
frag_sz = SKB_DATA_ALIGN(frag_sz);
@@ -3153,11 +3154,6 @@ static int mlx5e_xdp_set(struct net_device *netdev, 
struct bpf_prog *prog)
bool reset, was_opened;
int i;
 
-   if (prog && prog->xdp_adjust_head) {
-   netdev_err(netdev, "Does not support bpf_xdp_adjust_head()\n");
-   return -EOPNOTSUPP;
-   }
-
mutex_lock(>state_lock);
 
if ((netdev->features & NETIF_F_LRO) && prog) {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index 0e2fb3ed1790..20f116f8c457 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -264,7 +264,7 @@ int mlx5e_alloc_rx_wqe(struct mlx5e_rq *rq, struct 
mlx5e_rx_wqe *wqe, u16 ix)
if (unlikely(mlx5e_page_alloc_mapped(rq, di)))
return -ENOMEM;
 
-   wqe->data.addr = cpu_to_be64(di->addr + MLX5_RX_HEADROOM);
+   wqe->data.addr = cpu_to_be64(di->addr + rq->rx_headroom);
return 0;
 }
 
@@ -646,8 +646,7 @@ static inline void mlx5e_xmit_xdp_doorbell(struct mlx5e_sq 
*sq)
 
 static inline void mlx5e_xmit_xdp_frame(struct mlx5e_rq *rq,
struct mlx5e_dma_info *di,
-   unsigned int data_offset,
-   int len)
+   const struct xdp_buff *xdp)
 {
struct mlx5e_sq  *sq   = >channel->xdp_sq;
struct mlx5_wq_cyc   *wq   = >wq;
@@ -659,9 +658,16 @@ static inline void