Skip to content

Commit 20e5a59

Browse files
Guy Levijgunthorpe
authored andcommitted
IB/mlx5: Use fragmented SRQ's buffer for in-kernel users
The current implementation of create SRQ requires contiguous memory, such a requirement is problematic once the memory is fragmented or the system is low in memory, it causes failures in dma_zalloc_coherent(). This patch takes the advantage of the new mlx5_core API which allocates a fragmented buffer, and makes the SRQ creation much more resilient to memory fragmentation. Data-path code was adapted to the fact that WQEs can cross buffers. Signed-off-by: Guy Levi <guyle@mellanox.com> Reviewed-by: Majd Dibbiny <majd@mellanox.com> Reviewed-by: Yishai Hadas <yishaih@mellanox.com> Signed-off-by: Leon Romanovsky <leonro@mellanox.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
1 parent b024dd0 commit 20e5a59

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

drivers/infiniband/hw/mlx5/mlx5_ib.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ struct mlx5_ib_srq {
523523
struct mlx5_core_srq msrq;
524524
struct mlx5_frag_buf buf;
525525
struct mlx5_db db;
526+
struct mlx5_frag_buf_ctrl fbc;
526527
u64 *wrid;
527528
/* protect SRQ hanlding
528529
*/

drivers/infiniband/hw/mlx5/srq.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ static int srq_signature;
4444

4545
static void *get_wqe(struct mlx5_ib_srq *srq, int n)
4646
{
47-
return mlx5_buf_offset(&srq->buf, n << srq->msrq.wqe_shift);
47+
return mlx5_frag_buf_get_wqe(&srq->fbc, n);
4848
}
4949

5050
static void mlx5_ib_srq_event(struct mlx5_core_srq *srq, enum mlx5_event type)
@@ -173,12 +173,16 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
173173
return err;
174174
}
175175

176-
if (mlx5_buf_alloc(dev->mdev, buf_size, &srq->buf)) {
176+
if (mlx5_frag_buf_alloc_node(dev->mdev, buf_size, &srq->buf,
177+
dev->mdev->priv.numa_node)) {
177178
mlx5_ib_dbg(dev, "buf alloc failed\n");
178179
err = -ENOMEM;
179180
goto err_db;
180181
}
181182

183+
mlx5_init_fbc(srq->buf.frags, srq->msrq.wqe_shift, ilog2(srq->msrq.max),
184+
&srq->fbc);
185+
182186
srq->head = 0;
183187
srq->tail = srq->msrq.max - 1;
184188
srq->wqe_ctr = 0;
@@ -195,7 +199,7 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
195199
err = -ENOMEM;
196200
goto err_buf;
197201
}
198-
mlx5_fill_page_array(&srq->buf, in->pas);
202+
mlx5_fill_page_frag_array(&srq->buf, in->pas);
199203

200204
srq->wrid = kvmalloc_array(srq->msrq.max, sizeof(u64), GFP_KERNEL);
201205
if (!srq->wrid) {
@@ -215,7 +219,7 @@ static int create_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq,
215219
kvfree(in->pas);
216220

217221
err_buf:
218-
mlx5_buf_free(dev->mdev, &srq->buf);
222+
mlx5_frag_buf_free(dev->mdev, &srq->buf);
219223

220224
err_db:
221225
mlx5_db_free(dev->mdev, &srq->db);
@@ -232,7 +236,7 @@ static void destroy_srq_user(struct ib_pd *pd, struct mlx5_ib_srq *srq)
232236
static void destroy_srq_kernel(struct mlx5_ib_dev *dev, struct mlx5_ib_srq *srq)
233237
{
234238
kvfree(srq->wrid);
235-
mlx5_buf_free(dev->mdev, &srq->buf);
239+
mlx5_frag_buf_free(dev->mdev, &srq->buf);
236240
mlx5_db_free(dev->mdev, &srq->db);
237241
}
238242

0 commit comments

Comments
 (0)