Skip to content

Commit 76c2146

Browse files
Wengang-oracleSantoshShilimkar
authored andcommitted
IB/mlx4: Use vmalloc for WR buffers when needed
Orabug: 22025570 There are several hits that WR buffer allocation(kmalloc) failed. It failed at order 3 and/or 4 contigous pages allocation. At the same time there are actually 100MB+ free memory but well fragmented. So try vmalloc when kmalloc failed. Signed-off-by: Wengang Wang <[email protected]> Acked-by: Or Gerlitz <[email protected]> Reviewed-by: Yuval Shaia <[email protected]> Signed-off-by: Santosh Shilimkar <[email protected]>
1 parent 6d02e51 commit 76c2146

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

drivers/infiniband/hw/mlx4/qp.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include <linux/mlx4/driver.h>
4444
#include <linux/mlx4/qp.h>
4545
#include <linux/io.h>
46+
#include <linux/vmalloc.h>
4647

4748
#include "mlx4_ib.h"
4849
#include "user.h"
@@ -809,7 +810,13 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
809810
goto err_mtt;
810811

811812
qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), gfp);
813+
if (!qp->sq.wrid)
814+
qp->sq.wrid = __vmalloc(qp->sq.wqe_cnt * sizeof(u64),
815+
gfp, PAGE_KERNEL);
812816
qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), gfp);
817+
if (!qp->rq.wrid)
818+
qp->rq.wrid = __vmalloc(qp->rq.wqe_cnt * sizeof(u64),
819+
gfp, PAGE_KERNEL);
813820
if (!qp->sq.wrid || !qp->rq.wrid) {
814821
err = -ENOMEM;
815822
goto err_wrid;
@@ -896,8 +903,8 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
896903
if (qp_has_rq(init_attr))
897904
mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &qp->db);
898905
} else {
899-
kfree(qp->sq.wrid);
900-
kfree(qp->rq.wrid);
906+
kvfree(qp->sq.wrid);
907+
kvfree(qp->rq.wrid);
901908
}
902909

903910
err_mtt:
@@ -1026,8 +1033,8 @@ static void destroy_qp_common(struct mlx4_ib_dev *dev, struct mlx4_ib_qp *qp,
10261033
&qp->db);
10271034
ib_umem_release(qp->umem);
10281035
} else {
1029-
kfree(qp->sq.wrid);
1030-
kfree(qp->rq.wrid);
1036+
kvfree(qp->sq.wrid);
1037+
kvfree(qp->rq.wrid);
10311038
if (qp->mlx4_ib_qp_type & (MLX4_IB_QPT_PROXY_SMI_OWNER |
10321039
MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI))
10331040
free_proxy_bufs(&dev->ib_dev, qp);

drivers/infiniband/hw/mlx4/srq.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <linux/mlx4/qp.h>
3535
#include <linux/mlx4/srq.h>
3636
#include <linux/slab.h>
37+
#include <linux/vmalloc.h>
3738

3839
#include "mlx4_ib.h"
3940
#include "user.h"
@@ -172,8 +173,12 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
172173

173174
srq->wrid = kmalloc(srq->msrq.max * sizeof (u64), GFP_KERNEL);
174175
if (!srq->wrid) {
175-
err = -ENOMEM;
176-
goto err_mtt;
176+
srq->wrid = __vmalloc(srq->msrq.max * sizeof(u64),
177+
GFP_KERNEL, PAGE_KERNEL);
178+
if (!srq->wrid) {
179+
err = -ENOMEM;
180+
goto err_mtt;
181+
}
177182
}
178183
}
179184

@@ -204,7 +209,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
204209
if (pd->uobject)
205210
mlx4_ib_db_unmap_user(to_mucontext(pd->uobject->context), &srq->db);
206211
else
207-
kfree(srq->wrid);
212+
kvfree(srq->wrid);
208213

209214
err_mtt:
210215
mlx4_mtt_cleanup(dev->dev, &srq->mtt);

0 commit comments

Comments
 (0)