Make xdp flags and meta data info avaiable to RQs data path, to enable xdp meta data offloads in next two patches.
Signed-off-by: Saeed Mahameed <sae...@mellanox.com> --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 10 +++- .../net/ethernet/mellanox/mlx5/core/en_main.c | 52 +++++++++++-------- .../net/ethernet/mellanox/mlx5/core/en_rx.c | 2 +- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index eb9eb7aa953a..5893acfae307 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -236,6 +236,12 @@ enum mlx5e_priv_flag { #define MLX5E_MAX_BW_ALLOC 100 /* Max percentage of BW allocation */ #endif +struct mlx5e_xdp_info { + struct bpf_prog *prog; + u32 flags; + xdp_md_info_arr md_info; +}; + struct mlx5e_params { u8 log_sq_size; u8 rq_wq_type; @@ -257,7 +263,7 @@ struct mlx5e_params { bool tx_dim_enabled; u32 lro_timeout; u32 pflags; - struct bpf_prog *xdp_prog; + struct mlx5e_xdp_info xdp; unsigned int sw_mtu; int hard_mtu; }; @@ -566,7 +572,7 @@ struct mlx5e_rq { struct net_dim dim; /* Dynamic Interrupt Moderation */ /* XDP */ - struct bpf_prog *xdp_prog; + struct mlx5e_xdp_info xdp; unsigned int hw_mtu; struct mlx5e_xdpsq xdpsq; DECLARE_BITMAP(flags, 8); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 56c1b6f5593e..8debae6b9cab 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -96,7 +96,7 @@ bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev) static u32 mlx5e_rx_get_linear_frag_sz(struct mlx5e_params *params) { - if (!params->xdp_prog) { + if (!params->xdp.prog) { u16 hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu); u16 rq_headroom = MLX5_RX_HEADROOM + NET_IP_ALIGN; @@ -170,7 +170,7 @@ static u8 mlx5e_mpwqe_get_log_num_strides(struct mlx5_core_dev *mdev, static u16 mlx5e_get_rq_headroom(struct mlx5_core_dev *mdev, struct mlx5e_params *params) { - u16 linear_rq_headroom = params->xdp_prog ? + u16 linear_rq_headroom = params->xdp.prog ? XDP_PACKET_HEADROOM : MLX5_RX_HEADROOM; bool is_linear_skb; @@ -205,7 +205,7 @@ bool mlx5e_striding_rq_possible(struct mlx5_core_dev *mdev, { return mlx5e_check_fragmented_striding_rq_cap(mdev) && !MLX5_IPSEC_DEV(mdev) && - !(params->xdp_prog && !mlx5e_rx_mpwqe_is_linear_skb(mdev, params)); + !(params->xdp.prog && !mlx5e_rx_mpwqe_is_linear_skb(mdev, params)); } void mlx5e_set_rq_type(struct mlx5_core_dev *mdev, struct mlx5e_params *params) @@ -489,11 +489,12 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c, rq->mdev = mdev; rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu); rq->stats = &c->priv->channel_stats[c->ix].rq; + rq->xdp = params->xdp; - rq->xdp_prog = params->xdp_prog ? bpf_prog_inc(params->xdp_prog) : NULL; - if (IS_ERR(rq->xdp_prog)) { - err = PTR_ERR(rq->xdp_prog); - rq->xdp_prog = NULL; + rq->xdp.prog = params->xdp.prog ? bpf_prog_inc(params->xdp.prog) : NULL; + if (IS_ERR(rq->xdp.prog)) { + err = PTR_ERR(rq->xdp.prog); + rq->xdp.prog = NULL; goto err_rq_wq_destroy; } @@ -501,7 +502,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c, if (err < 0) goto err_rq_wq_destroy; - rq->buff.map_dir = rq->xdp_prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE; + rq->buff.map_dir = rq->xdp.prog ? DMA_BIDIRECTIONAL : DMA_FROM_DEVICE; rq->buff.headroom = mlx5e_get_rq_headroom(mdev, params); pool_size = 1 << params->log_rq_mtu_frames; @@ -679,8 +680,8 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c, } err_rq_wq_destroy: - if (rq->xdp_prog) - bpf_prog_put(rq->xdp_prog); + if (rq->xdp.prog) + bpf_prog_put(rq->xdp.prog); xdp_rxq_info_unreg(&rq->xdp_rxq); if (rq->page_pool) page_pool_destroy(rq->page_pool); @@ -693,8 +694,8 @@ static void mlx5e_free_rq(struct mlx5e_rq *rq) { int i; - if (rq->xdp_prog) - bpf_prog_put(rq->xdp_prog); + if (rq->xdp.prog) + bpf_prog_put(rq->xdp.prog); xdp_rxq_info_unreg(&rq->xdp_rxq); if (rq->page_pool) @@ -1906,7 +1907,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, c->netdev = priv->netdev; c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key); c->num_tc = params->num_tc; - c->xdp = !!params->xdp_prog; + c->xdp = !!params->xdp.prog; c->stats = &priv->channel_stats[ix].ch; mlx5_vector2eqn(priv->mdev, ix, &eqn, &irq); @@ -4090,12 +4091,12 @@ static void mlx5e_tx_timeout(struct net_device *dev) queue_work(priv->wq, &priv->tx_timeout_work); } -static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) +static int mlx5e_xdp_set(struct net_device *netdev, struct mlx5e_xdp_info *xdp) { struct mlx5e_priv *priv = netdev_priv(netdev); - struct bpf_prog *old_prog; - int err = 0; + struct bpf_prog *old_prog, *prog = xdp->prog; bool reset, was_opened; + int err = 0; int i; mutex_lock(&priv->state_lock); @@ -4114,7 +4115,7 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state); /* no need for full reset when exchanging programs */ - reset = (!priv->channels.params.xdp_prog || !prog); + reset = (!priv->channels.params.xdp.prog || !prog); if (was_opened && reset) mlx5e_close_locked(netdev); @@ -4132,10 +4133,12 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) /* exchange programs, extra prog reference we got from caller * as long as we don't fail from this point onwards. */ - old_prog = xchg(&priv->channels.params.xdp_prog, prog); + old_prog = xchg(&priv->channels.params.xdp.prog, prog); if (old_prog) bpf_prog_put(old_prog); + priv->channels.params.xdp = *xdp; + if (reset) /* change RQ type according to priv->xdp_prog */ mlx5e_set_rq_type(priv->mdev, &priv->channels.params); @@ -4155,7 +4158,8 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) napi_synchronize(&c->napi); /* prevent mlx5e_poll_rx_cq from accessing rq->xdp_prog */ - old_prog = xchg(&c->rq.xdp_prog, prog); + old_prog = xchg(&c->rq.xdp.prog, prog); + c->rq.xdp = *xdp; set_bit(MLX5E_RQ_STATE_ENABLED, &c->rq.state); /* napi_schedule in case we have missed anything */ @@ -4177,7 +4181,7 @@ static u32 mlx5e_xdp_query(struct net_device *dev) u32 prog_id = 0; mutex_lock(&priv->state_lock); - xdp_prog = priv->channels.params.xdp_prog; + xdp_prog = priv->channels.params.xdp.prog; if (xdp_prog) prog_id = xdp_prog->aux->id; mutex_unlock(&priv->state_lock); @@ -4187,9 +4191,15 @@ static u32 mlx5e_xdp_query(struct net_device *dev) static int mlx5e_xdp(struct net_device *dev, struct netdev_bpf *xdp) { + struct mlx5e_xdp_info xdp_info; + switch (xdp->command) { case XDP_SETUP_PROG: - return mlx5e_xdp_set(dev, xdp->prog); + xdp_info.prog = xdp->prog; + xdp_info.flags = xdp->flags; + memcpy(xdp_info.md_info, xdp->md_info, sizeof(xdp->md_info)); + + return mlx5e_xdp_set(dev, &xdp_info); case XDP_QUERY_PROG: xdp->prog_id = mlx5e_xdp_query(dev); xdp->prog_attached = !!xdp->prog_id; diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index d3a1dd20e41d..d12577c17011 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -925,7 +925,7 @@ static inline bool mlx5e_xdp_handle(struct mlx5e_rq *rq, struct mlx5e_dma_info *di, void *va, u16 *rx_headroom, u32 *len) { - struct bpf_prog *prog = READ_ONCE(rq->xdp_prog); + struct bpf_prog *prog = READ_ONCE(rq->xdp.prog); struct xdp_buff xdp; u32 act; int err; -- 2.17.0