On Wed, Aug 16, 2017 at 09:06:32PM +1000, Li Dongyang wrote: > We observed multiple times on our Lustre OSS servers that when > the system memory is fragmented, kmalloc() in create_kernel_qp() > could fail order 4/5 allocations while we still have many free pages. > > Fall back to vmalloc to allow the operation to contine, also switch > to kmalloc_array() from kmalloc(). > > Signed-off-by: Li Dongyang <dongyang.li@xxxxxxxxxx> > --- > drivers/infiniband/hw/mlx5/qp.c | 54 +++++++++++++++++++++++++++++----------- > drivers/infiniband/hw/mlx5/srq.c | 8 ++++-- > 2 files changed, 45 insertions(+), 17 deletions(-) > > diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c > index 0889ff367c86..e662fa5af5bb 100644 > --- a/drivers/infiniband/hw/mlx5/qp.c > +++ b/drivers/infiniband/hw/mlx5/qp.c > @@ -959,11 +959,35 @@ static int create_kernel_qp(struct mlx5_ib_dev *dev, > goto err_free; > } > > - qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof(*qp->sq.wrid), GFP_KERNEL); > - qp->sq.wr_data = kmalloc(qp->sq.wqe_cnt * sizeof(*qp->sq.wr_data), GFP_KERNEL); > - qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof(*qp->rq.wrid), GFP_KERNEL); > - qp->sq.w_list = kmalloc(qp->sq.wqe_cnt * sizeof(*qp->sq.w_list), GFP_KERNEL); > - qp->sq.wqe_head = kmalloc(qp->sq.wqe_cnt * sizeof(*qp->sq.wqe_head), GFP_KERNEL); > + qp->sq.wrid = kmalloc_array(qp->sq.wqe_cnt, sizeof(*qp->sq.wrid), > + GFP_KERNEL | __GFP_NOWARN); > + if (!qp->sq.wrid) > + qp->sq.wrid = __vmalloc(qp->sq.wqe_cnt * sizeof(*qp->sq.wrid), > + GFP_KERNEL, PAGE_KERNEL); Please don't open code, the kvmalloc and kvmalloc_array functions. Thanks for doing it.
Attachment:
signature.asc
Description: PGP signature