IB/mlx4: Don't use GFP_ATOMIC for CQ resize struct
authorRoland Dreier <roland@purestorage.com>
Fri, 29 Jul 2016 04:58:43 +0000 (21:58 -0700)
committerDoug Ledford <dledford@redhat.com>
Thu, 4 Aug 2016 01:03:32 +0000 (21:03 -0400)
We allocate a small tracking structure as part of mlx4_ib_resize_cq().
However, we don't need to use GFP_ATOMIC -- immediately after the
allocation, we call mlx4_cq_resize(), which allocates a command
mailbox with GFP_KERNEL and then sleeps on a firmware command, so we
better not be in an atomic context.

This actually has a real impact, because when this GFP_ATOMIC
allocation fails (and GFP_ATOMIC does fail in practice) then a
userspace consumer resizing a CQ will get a spurious failure that we
can easily avoid.

Signed-off-by: Roland Dreier <roland@purestorage.com>
Reviewed-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx4/cq.c

index 9f8b516eb2b0f2412452685d21df360075245f0c..d6fc8a6e8c3324fcef4d9081167cce9cc998f13b 100644 (file)
@@ -288,7 +288,7 @@ static int mlx4_alloc_resize_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq,
        if (cq->resize_buf)
                return -EBUSY;
 
-       cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_ATOMIC);
+       cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_KERNEL);
        if (!cq->resize_buf)
                return -ENOMEM;
 
@@ -316,7 +316,7 @@ static int mlx4_alloc_resize_umem(struct mlx4_ib_dev *dev, struct mlx4_ib_cq *cq
        if (ib_copy_from_udata(&ucmd, udata, sizeof ucmd))
                return -EFAULT;
 
-       cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_ATOMIC);
+       cq->resize_buf = kmalloc(sizeof *cq->resize_buf, GFP_KERNEL);
        if (!cq->resize_buf)
                return -ENOMEM;
 
This page took 0.028611 seconds and 5 git commands to generate.