Skip to content

Commit 869c5f9

Browse files
ayalevinSaeed Mahameed
authored andcommitted
net/mlx5e: Generalize open RQ
Unify RQ creation for different RQ types. For each RQ type add a separate open helper which initializes the RQ specific values and trigger a call for generic open RQ function. Avoid passing the mlx5e_channel pointer to the generic open RQ as a container, since the RQ may reside under a different type of channel. Signed-off-by: Aya Levin <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 183532b commit 869c5f9

File tree

4 files changed

+147
-202
lines changed

4 files changed

+147
-202
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -961,9 +961,9 @@ struct mlx5e_tirc_config mlx5e_tirc_get_default_config(enum mlx5e_traffic_types
961961
struct mlx5e_xsk_param;
962962

963963
struct mlx5e_rq_param;
964-
int mlx5e_open_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
965-
struct mlx5e_rq_param *param, struct mlx5e_xsk_param *xsk,
966-
struct xsk_buff_pool *xsk_pool, struct mlx5e_rq *rq);
964+
int mlx5e_open_rq(struct mlx5e_params *params, struct mlx5e_rq_param *param,
965+
struct mlx5e_xsk_param *xsk, int node,
966+
struct mlx5e_rq *rq);
967967
int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time);
968968
void mlx5e_deactivate_rq(struct mlx5e_rq *rq);
969969
void mlx5e_close_rq(struct mlx5e_rq *rq);

drivers/net/ethernet/mellanox/mlx5/core/en/trap.c

Lines changed: 33 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -30,163 +30,63 @@ static int mlx5e_trap_napi_poll(struct napi_struct *napi, int budget)
3030
return work_done;
3131
}
3232

33-
static int mlx5e_alloc_trap_rq(struct mlx5e_priv *priv, struct mlx5e_rq_param *rqp,
34-
struct mlx5e_rq_stats *stats, struct mlx5e_params *params,
35-
struct mlx5e_ch_stats *ch_stats,
36-
struct mlx5e_rq *rq)
33+
static void mlx5e_free_trap_rq(struct mlx5e_rq *rq)
3734
{
38-
void *rqc_wq = MLX5_ADDR_OF(rqc, rqp->rqc, wq);
39-
struct mlx5_core_dev *mdev = priv->mdev;
40-
struct page_pool_params pp_params = {};
41-
int node = dev_to_node(mdev->device);
42-
u32 pool_size;
43-
int wq_sz;
44-
int err;
45-
int i;
46-
47-
rqp->wq.db_numa_node = node;
48-
49-
rq->wq_type = params->rq_wq_type;
50-
rq->pdev = mdev->device;
51-
rq->netdev = priv->netdev;
52-
rq->mdev = mdev;
53-
rq->priv = priv;
54-
rq->stats = stats;
55-
rq->clock = &mdev->clock;
56-
rq->tstamp = &priv->tstamp;
57-
rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
58-
59-
xdp_rxq_info_unused(&rq->xdp_rxq);
60-
61-
rq->buff.map_dir = DMA_FROM_DEVICE;
62-
rq->buff.headroom = mlx5e_get_rq_headroom(mdev, params, NULL);
63-
pool_size = 1 << params->log_rq_mtu_frames;
64-
65-
err = mlx5_wq_cyc_create(mdev, &rqp->wq, rqc_wq, &rq->wqe.wq, &rq->wq_ctrl);
66-
if (err)
67-
return err;
68-
69-
rq->wqe.wq.db = &rq->wqe.wq.db[MLX5_RCV_DBR];
70-
71-
wq_sz = mlx5_wq_cyc_get_size(&rq->wqe.wq);
72-
73-
rq->wqe.info = rqp->frags_info;
74-
rq->buff.frame0_sz = rq->wqe.info.arr[0].frag_stride;
75-
rq->wqe.frags = kvzalloc_node(array_size(sizeof(*rq->wqe.frags),
76-
(wq_sz << rq->wqe.info.log_num_frags)),
77-
GFP_KERNEL, node);
78-
if (!rq->wqe.frags) {
79-
err = -ENOMEM;
80-
goto err_wq_cyc_destroy;
81-
}
82-
83-
err = mlx5e_init_di_list(rq, wq_sz, node);
84-
if (err)
85-
goto err_free_frags;
86-
87-
rq->mkey_be = cpu_to_be32(mdev->mlx5e_res.hw_objs.mkey.key);
88-
89-
mlx5e_rq_set_trap_handlers(rq, params);
90-
91-
/* Create a page_pool and register it with rxq */
92-
pp_params.order = 0;
93-
pp_params.flags = 0; /* No-internal DMA mapping in page_pool */
94-
pp_params.pool_size = pool_size;
95-
pp_params.nid = node;
96-
pp_params.dev = mdev->device;
97-
pp_params.dma_dir = rq->buff.map_dir;
98-
99-
/* page_pool can be used even when there is no rq->xdp_prog,
100-
* given page_pool does not handle DMA mapping there is no
101-
* required state to clear. And page_pool gracefully handle
102-
* elevated refcnt.
103-
*/
104-
rq->page_pool = page_pool_create(&pp_params);
105-
if (IS_ERR(rq->page_pool)) {
106-
err = PTR_ERR(rq->page_pool);
107-
rq->page_pool = NULL;
108-
goto err_free_di_list;
109-
}
110-
for (i = 0; i < wq_sz; i++) {
111-
struct mlx5e_rx_wqe_cyc *wqe =
112-
mlx5_wq_cyc_get_wqe(&rq->wqe.wq, i);
113-
int f;
114-
115-
for (f = 0; f < rq->wqe.info.num_frags; f++) {
116-
u32 frag_size = rq->wqe.info.arr[f].frag_size |
117-
MLX5_HW_START_PADDING;
118-
119-
wqe->data[f].byte_count = cpu_to_be32(frag_size);
120-
wqe->data[f].lkey = rq->mkey_be;
121-
}
122-
/* check if num_frags is not a pow of two */
123-
if (rq->wqe.info.num_frags < (1 << rq->wqe.info.log_num_frags)) {
124-
wqe->data[f].byte_count = 0;
125-
wqe->data[f].lkey = cpu_to_be32(MLX5_INVALID_LKEY);
126-
wqe->data[f].addr = 0;
127-
}
128-
}
129-
return 0;
130-
131-
err_free_di_list:
35+
page_pool_destroy(rq->page_pool);
13236
mlx5e_free_di_list(rq);
133-
err_free_frags:
13437
kvfree(rq->wqe.frags);
135-
err_wq_cyc_destroy:
13638
mlx5_wq_destroy(&rq->wq_ctrl);
137-
138-
return err;
13939
}
14040

141-
static void mlx5e_free_trap_rq(struct mlx5e_rq *rq)
41+
static void mlx5e_init_trap_rq(struct mlx5e_trap *t, struct mlx5e_params *params,
42+
struct mlx5e_rq *rq)
14243
{
143-
page_pool_destroy(rq->page_pool);
144-
mlx5e_free_di_list(rq);
145-
kvfree(rq->wqe.frags);
146-
mlx5_wq_destroy(&rq->wq_ctrl);
44+
struct mlx5_core_dev *mdev = t->mdev;
45+
struct mlx5e_priv *priv = t->priv;
46+
47+
rq->wq_type = params->rq_wq_type;
48+
rq->pdev = mdev->device;
49+
rq->netdev = priv->netdev;
50+
rq->priv = priv;
51+
rq->clock = &mdev->clock;
52+
rq->tstamp = &priv->tstamp;
53+
rq->mdev = mdev;
54+
rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
55+
rq->stats = &priv->trap_stats.rq;
56+
rq->ptp_cyc2time = mlx5_rq_ts_translator(mdev);
57+
xdp_rxq_info_unused(&rq->xdp_rxq);
58+
mlx5e_rq_set_trap_handlers(rq, params);
14759
}
14860

149-
static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct napi_struct *napi,
150-
struct mlx5e_rq_stats *stats, struct mlx5e_params *params,
151-
struct mlx5e_rq_param *rq_param,
152-
struct mlx5e_ch_stats *ch_stats,
153-
struct mlx5e_rq *rq)
61+
static int mlx5e_open_trap_rq(struct mlx5e_priv *priv, struct mlx5e_trap *t)
15462
{
63+
struct mlx5e_rq_param *rq_param = &t->rq_param;
15564
struct mlx5_core_dev *mdev = priv->mdev;
15665
struct mlx5e_create_cq_param ccp = {};
15766
struct dim_cq_moder trap_moder = {};
158-
struct mlx5e_cq *cq = &rq->cq;
67+
struct mlx5e_rq *rq = &t->rq;
68+
int node;
15969
int err;
16070

161-
ccp.node = dev_to_node(mdev->device);
162-
ccp.ch_stats = ch_stats;
163-
ccp.napi = napi;
71+
node = dev_to_node(mdev->device);
72+
73+
ccp.node = node;
74+
ccp.ch_stats = t->stats;
75+
ccp.napi = &t->napi;
16476
ccp.ix = 0;
165-
err = mlx5e_open_cq(priv, trap_moder, &rq_param->cqp, &ccp, cq);
77+
err = mlx5e_open_cq(priv, trap_moder, &rq_param->cqp, &ccp, &rq->cq);
16678
if (err)
16779
return err;
16880

169-
err = mlx5e_alloc_trap_rq(priv, rq_param, stats, params, ch_stats, rq);
81+
mlx5e_init_trap_rq(t, &t->params, rq);
82+
err = mlx5e_open_rq(&t->params, rq_param, NULL, node, rq);
17083
if (err)
17184
goto err_destroy_cq;
17285

173-
err = mlx5e_create_rq(rq, rq_param);
174-
if (err)
175-
goto err_free_rq;
176-
177-
err = mlx5e_modify_rq_state(rq, MLX5_RQC_STATE_RST, MLX5_RQC_STATE_RDY);
178-
if (err)
179-
goto err_destroy_rq;
180-
18186
return 0;
18287

183-
err_destroy_rq:
184-
mlx5e_destroy_rq(rq);
185-
mlx5e_free_rx_descs(rq);
186-
err_free_rq:
187-
mlx5e_free_trap_rq(rq);
18888
err_destroy_cq:
189-
mlx5e_close_cq(cq);
89+
mlx5e_close_cq(&rq->cq);
19090

19191
return err;
19292
}
@@ -273,11 +173,7 @@ static struct mlx5e_trap *mlx5e_open_trap(struct mlx5e_priv *priv)
273173

274174
netif_napi_add(netdev, &t->napi, mlx5e_trap_napi_poll, 64);
275175

276-
err = mlx5e_open_trap_rq(priv, &t->napi,
277-
&priv->trap_stats.rq,
278-
&t->params, &t->rq_param,
279-
&priv->trap_stats.ch,
280-
&t->rq);
176+
err = mlx5e_open_trap_rq(priv, t);
281177
if (unlikely(err))
282178
goto err_napi_del;
283179

drivers/net/ethernet/mellanox/mlx5/core/en/xsk/setup.c

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,51 @@ static void mlx5e_build_xsk_cparam(struct mlx5_core_dev *mdev,
4545
mlx5e_build_xdpsq_param(mdev, params, &cparam->xdp_sq);
4646
}
4747

48+
static int mlx5e_init_xsk_rq(struct mlx5e_channel *c,
49+
struct mlx5e_params *params,
50+
struct xsk_buff_pool *pool,
51+
struct mlx5e_xsk_param *xsk,
52+
struct mlx5e_rq *rq)
53+
{
54+
struct mlx5_core_dev *mdev = c->mdev;
55+
int rq_xdp_ix;
56+
int err;
57+
58+
rq->wq_type = params->rq_wq_type;
59+
rq->pdev = c->pdev;
60+
rq->netdev = c->netdev;
61+
rq->priv = c->priv;
62+
rq->tstamp = c->tstamp;
63+
rq->clock = &mdev->clock;
64+
rq->icosq = &c->icosq;
65+
rq->ix = c->ix;
66+
rq->mdev = mdev;
67+
rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
68+
rq->xdpsq = &c->rq_xdpsq;
69+
rq->xsk_pool = pool;
70+
rq->stats = &c->priv->channel_stats[c->ix].xskrq;
71+
rq->ptp_cyc2time = mlx5_rq_ts_translator(mdev);
72+
rq_xdp_ix = c->ix + params->num_channels * MLX5E_RQ_GROUP_XSK;
73+
err = mlx5e_rq_set_handlers(rq, params, xsk);
74+
if (err)
75+
return err;
76+
77+
return xdp_rxq_info_reg(&rq->xdp_rxq, rq->netdev, rq_xdp_ix, 0);
78+
}
79+
80+
static int mlx5e_open_xsk_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
81+
struct mlx5e_rq_param *rq_params, struct xsk_buff_pool *pool,
82+
struct mlx5e_xsk_param *xsk)
83+
{
84+
int err;
85+
86+
err = mlx5e_init_xsk_rq(c, params, pool, xsk, &c->xskrq);
87+
if (err)
88+
return err;
89+
90+
return mlx5e_open_rq(params, rq_params, xsk, cpu_to_node(c->cpu), &c->xskrq);
91+
}
92+
4893
int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
4994
struct mlx5e_xsk_param *xsk, struct xsk_buff_pool *pool,
5095
struct mlx5e_channel *c)
@@ -69,7 +114,7 @@ int mlx5e_open_xsk(struct mlx5e_priv *priv, struct mlx5e_params *params,
69114
if (unlikely(err))
70115
goto err_free_cparam;
71116

72-
err = mlx5e_open_rq(c, params, &cparam->rq, xsk, pool, &c->xskrq);
117+
err = mlx5e_open_xsk_rq(c, params, &cparam->rq, pool, xsk);
73118
if (unlikely(err))
74119
goto err_close_rx_cq;
75120

0 commit comments

Comments
 (0)