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

Reply via email to