diff options
author | Jiri Kosina <jkosina@suse.cz> | 2014-05-11 08:15:12 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-06-02 17:58:11 -0400 |
commit | 40f2287bd583f4df4c602c1a29a48df2730fb6d4 (patch) | |
tree | d3dcabe51b5821b1334ea656f6d2166fcf732a18 /drivers | |
parent | 09b93088d75009807b72293f26e2634430ce5ba9 (diff) |
IB/mlx4: Implement IB_QP_CREATE_USE_GFP_NOIO
Modify the various routines used to allocate memory resources which
serve QPs in mlx4 to get an input GFP directive. Have the Ethernet
driver to use GFP_KERNEL in it's QP allocations as done prior to this
commit, and the IB driver to use GFP_NOIO when the IB verbs
IB_QP_CREATE_USE_GFP_NOIO QP creation flag is provided.
Signed-off-by: Mel Gorman <mgorman@suse.de>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/mlx4/cq.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/mlx4_ib.h | 1 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/qp.c | 30 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/srq.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/alloc.c | 27 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cq.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_rx.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_tx.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/icm.c | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/icm.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mr.c | 17 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/qp.c | 20 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/srq.c | 4 |
15 files changed, 76 insertions, 66 deletions
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 5f640814cc81..1066eec854a9 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -102,7 +102,7 @@ static int mlx4_ib_alloc_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf * | |||
102 | int err; | 102 | int err; |
103 | 103 | ||
104 | err = mlx4_buf_alloc(dev->dev, nent * dev->dev->caps.cqe_size, | 104 | err = mlx4_buf_alloc(dev->dev, nent * dev->dev->caps.cqe_size, |
105 | PAGE_SIZE * 2, &buf->buf); | 105 | PAGE_SIZE * 2, &buf->buf, GFP_KERNEL); |
106 | 106 | ||
107 | if (err) | 107 | if (err) |
108 | goto out; | 108 | goto out; |
@@ -113,7 +113,7 @@ static int mlx4_ib_alloc_cq_buf(struct mlx4_ib_dev *dev, struct mlx4_ib_cq_buf * | |||
113 | if (err) | 113 | if (err) |
114 | goto err_buf; | 114 | goto err_buf; |
115 | 115 | ||
116 | err = mlx4_buf_write_mtt(dev->dev, &buf->mtt, &buf->buf); | 116 | err = mlx4_buf_write_mtt(dev->dev, &buf->mtt, &buf->buf, GFP_KERNEL); |
117 | if (err) | 117 | if (err) |
118 | goto err_mtt; | 118 | goto err_mtt; |
119 | 119 | ||
@@ -209,7 +209,7 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev, int entries, int vector | |||
209 | 209 | ||
210 | uar = &to_mucontext(context)->uar; | 210 | uar = &to_mucontext(context)->uar; |
211 | } else { | 211 | } else { |
212 | err = mlx4_db_alloc(dev->dev, &cq->db, 1); | 212 | err = mlx4_db_alloc(dev->dev, &cq->db, 1, GFP_KERNEL); |
213 | if (err) | 213 | if (err) |
214 | goto err_cq; | 214 | goto err_cq; |
215 | 215 | ||
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h index f589522fddfd..bb8c9dd442ae 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h | |||
@@ -156,6 +156,7 @@ enum mlx4_ib_qp_flags { | |||
156 | MLX4_IB_QP_LSO = IB_QP_CREATE_IPOIB_UD_LSO, | 156 | MLX4_IB_QP_LSO = IB_QP_CREATE_IPOIB_UD_LSO, |
157 | MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK = IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK, | 157 | MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK = IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK, |
158 | MLX4_IB_QP_NETIF = IB_QP_CREATE_NETIF_QP, | 158 | MLX4_IB_QP_NETIF = IB_QP_CREATE_NETIF_QP, |
159 | MLX4_IB_QP_CREATE_USE_GFP_NOIO = IB_QP_CREATE_USE_GFP_NOIO, | ||
159 | MLX4_IB_SRIOV_TUNNEL_QP = 1 << 30, | 160 | MLX4_IB_SRIOV_TUNNEL_QP = 1 << 30, |
160 | MLX4_IB_SRIOV_SQP = 1 << 31, | 161 | MLX4_IB_SRIOV_SQP = 1 << 31, |
161 | }; | 162 | }; |
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c index 41308af4163c..8710baf60bb9 100644 --- a/drivers/infiniband/hw/mlx4/qp.c +++ b/drivers/infiniband/hw/mlx4/qp.c | |||
@@ -610,7 +610,8 @@ static int qp_has_rq(struct ib_qp_init_attr *attr) | |||
610 | 610 | ||
611 | static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | 611 | static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, |
612 | struct ib_qp_init_attr *init_attr, | 612 | struct ib_qp_init_attr *init_attr, |
613 | struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp) | 613 | struct ib_udata *udata, int sqpn, struct mlx4_ib_qp **caller_qp, |
614 | gfp_t gfp) | ||
614 | { | 615 | { |
615 | int qpn; | 616 | int qpn; |
616 | int err; | 617 | int err; |
@@ -748,14 +749,14 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
748 | goto err; | 749 | goto err; |
749 | 750 | ||
750 | if (qp_has_rq(init_attr)) { | 751 | if (qp_has_rq(init_attr)) { |
751 | err = mlx4_db_alloc(dev->dev, &qp->db, 0); | 752 | err = mlx4_db_alloc(dev->dev, &qp->db, 0, gfp); |
752 | if (err) | 753 | if (err) |
753 | goto err; | 754 | goto err; |
754 | 755 | ||
755 | *qp->db.db = 0; | 756 | *qp->db.db = 0; |
756 | } | 757 | } |
757 | 758 | ||
758 | if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf)) { | 759 | if (mlx4_buf_alloc(dev->dev, qp->buf_size, PAGE_SIZE * 2, &qp->buf, gfp)) { |
759 | err = -ENOMEM; | 760 | err = -ENOMEM; |
760 | goto err_db; | 761 | goto err_db; |
761 | } | 762 | } |
@@ -765,13 +766,12 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
765 | if (err) | 766 | if (err) |
766 | goto err_buf; | 767 | goto err_buf; |
767 | 768 | ||
768 | err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf); | 769 | err = mlx4_buf_write_mtt(dev->dev, &qp->mtt, &qp->buf, gfp); |
769 | if (err) | 770 | if (err) |
770 | goto err_mtt; | 771 | goto err_mtt; |
771 | 772 | ||
772 | qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), GFP_KERNEL); | 773 | qp->sq.wrid = kmalloc(qp->sq.wqe_cnt * sizeof (u64), gfp); |
773 | qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), GFP_KERNEL); | 774 | qp->rq.wrid = kmalloc(qp->rq.wqe_cnt * sizeof (u64), gfp); |
774 | |||
775 | if (!qp->sq.wrid || !qp->rq.wrid) { | 775 | if (!qp->sq.wrid || !qp->rq.wrid) { |
776 | err = -ENOMEM; | 776 | err = -ENOMEM; |
777 | goto err_wrid; | 777 | goto err_wrid; |
@@ -801,7 +801,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, | |||
801 | goto err_proxy; | 801 | goto err_proxy; |
802 | } | 802 | } |
803 | 803 | ||
804 | err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp); | 804 | err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp, gfp); |
805 | if (err) | 805 | if (err) |
806 | goto err_qpn; | 806 | goto err_qpn; |
807 | 807 | ||
@@ -1040,7 +1040,10 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1040 | struct mlx4_ib_qp *qp = NULL; | 1040 | struct mlx4_ib_qp *qp = NULL; |
1041 | int err; | 1041 | int err; |
1042 | u16 xrcdn = 0; | 1042 | u16 xrcdn = 0; |
1043 | gfp_t gfp; | ||
1043 | 1044 | ||
1045 | gfp = (init_attr->create_flags & MLX4_IB_QP_CREATE_USE_GFP_NOIO) ? | ||
1046 | GFP_NOIO : GFP_KERNEL; | ||
1044 | /* | 1047 | /* |
1045 | * We only support LSO, vendor flag1, and multicast loopback blocking, | 1048 | * We only support LSO, vendor flag1, and multicast loopback blocking, |
1046 | * and only for kernel UD QPs. | 1049 | * and only for kernel UD QPs. |
@@ -1049,7 +1052,8 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1049 | MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK | | 1052 | MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK | |
1050 | MLX4_IB_SRIOV_TUNNEL_QP | | 1053 | MLX4_IB_SRIOV_TUNNEL_QP | |
1051 | MLX4_IB_SRIOV_SQP | | 1054 | MLX4_IB_SRIOV_SQP | |
1052 | MLX4_IB_QP_NETIF)) | 1055 | MLX4_IB_QP_NETIF | |
1056 | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) | ||
1053 | return ERR_PTR(-EINVAL); | 1057 | return ERR_PTR(-EINVAL); |
1054 | 1058 | ||
1055 | if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) { | 1059 | if (init_attr->create_flags & IB_QP_CREATE_NETIF_QP) { |
@@ -1059,7 +1063,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1059 | 1063 | ||
1060 | if (init_attr->create_flags && | 1064 | if (init_attr->create_flags && |
1061 | (udata || | 1065 | (udata || |
1062 | ((init_attr->create_flags & ~MLX4_IB_SRIOV_SQP) && | 1066 | ((init_attr->create_flags & ~(MLX4_IB_SRIOV_SQP | MLX4_IB_QP_CREATE_USE_GFP_NOIO)) && |
1063 | init_attr->qp_type != IB_QPT_UD) || | 1067 | init_attr->qp_type != IB_QPT_UD) || |
1064 | ((init_attr->create_flags & MLX4_IB_SRIOV_SQP) && | 1068 | ((init_attr->create_flags & MLX4_IB_SRIOV_SQP) && |
1065 | init_attr->qp_type > IB_QPT_GSI))) | 1069 | init_attr->qp_type > IB_QPT_GSI))) |
@@ -1079,7 +1083,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1079 | case IB_QPT_RC: | 1083 | case IB_QPT_RC: |
1080 | case IB_QPT_UC: | 1084 | case IB_QPT_UC: |
1081 | case IB_QPT_RAW_PACKET: | 1085 | case IB_QPT_RAW_PACKET: |
1082 | qp = kzalloc(sizeof *qp, GFP_KERNEL); | 1086 | qp = kzalloc(sizeof *qp, gfp); |
1083 | if (!qp) | 1087 | if (!qp) |
1084 | return ERR_PTR(-ENOMEM); | 1088 | return ERR_PTR(-ENOMEM); |
1085 | qp->pri.vid = 0xFFFF; | 1089 | qp->pri.vid = 0xFFFF; |
@@ -1088,7 +1092,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1088 | case IB_QPT_UD: | 1092 | case IB_QPT_UD: |
1089 | { | 1093 | { |
1090 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, | 1094 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, |
1091 | udata, 0, &qp); | 1095 | udata, 0, &qp, gfp); |
1092 | if (err) | 1096 | if (err) |
1093 | return ERR_PTR(err); | 1097 | return ERR_PTR(err); |
1094 | 1098 | ||
@@ -1106,7 +1110,7 @@ struct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd, | |||
1106 | 1110 | ||
1107 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, udata, | 1111 | err = create_qp_common(to_mdev(pd->device), pd, init_attr, udata, |
1108 | get_sqp_num(to_mdev(pd->device), init_attr), | 1112 | get_sqp_num(to_mdev(pd->device), init_attr), |
1109 | &qp); | 1113 | &qp, gfp); |
1110 | if (err) | 1114 | if (err) |
1111 | return ERR_PTR(err); | 1115 | return ERR_PTR(err); |
1112 | 1116 | ||
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c index 60c5fb025fc7..62d9285300af 100644 --- a/drivers/infiniband/hw/mlx4/srq.c +++ b/drivers/infiniband/hw/mlx4/srq.c | |||
@@ -134,13 +134,14 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd, | |||
134 | if (err) | 134 | if (err) |
135 | goto err_mtt; | 135 | goto err_mtt; |
136 | } else { | 136 | } else { |
137 | err = mlx4_db_alloc(dev->dev, &srq->db, 0); | 137 | err = mlx4_db_alloc(dev->dev, &srq->db, 0, GFP_KERNEL); |
138 | if (err) | 138 | if (err) |
139 | goto err_srq; | 139 | goto err_srq; |
140 | 140 | ||
141 | *srq->db.db = 0; | 141 | *srq->db.db = 0; |
142 | 142 | ||
143 | if (mlx4_buf_alloc(dev->dev, buf_size, PAGE_SIZE * 2, &srq->buf)) { | 143 | if (mlx4_buf_alloc(dev->dev, buf_size, PAGE_SIZE * 2, &srq->buf, |
144 | GFP_KERNEL)) { | ||
144 | err = -ENOMEM; | 145 | err = -ENOMEM; |
145 | goto err_db; | 146 | goto err_db; |
146 | } | 147 | } |
@@ -165,7 +166,7 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd, | |||
165 | if (err) | 166 | if (err) |
166 | goto err_buf; | 167 | goto err_buf; |
167 | 168 | ||
168 | err = mlx4_buf_write_mtt(dev->dev, &srq->mtt, &srq->buf); | 169 | err = mlx4_buf_write_mtt(dev->dev, &srq->mtt, &srq->buf, GFP_KERNEL); |
169 | if (err) | 170 | if (err) |
170 | goto err_mtt; | 171 | goto err_mtt; |
171 | 172 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/alloc.c b/drivers/net/ethernet/mellanox/mlx4/alloc.c index c3ad464d0627..b0297da50304 100644 --- a/drivers/net/ethernet/mellanox/mlx4/alloc.c +++ b/drivers/net/ethernet/mellanox/mlx4/alloc.c | |||
@@ -171,7 +171,7 @@ void mlx4_bitmap_cleanup(struct mlx4_bitmap *bitmap) | |||
171 | */ | 171 | */ |
172 | 172 | ||
173 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | 173 | int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, |
174 | struct mlx4_buf *buf) | 174 | struct mlx4_buf *buf, gfp_t gfp) |
175 | { | 175 | { |
176 | dma_addr_t t; | 176 | dma_addr_t t; |
177 | 177 | ||
@@ -180,7 +180,7 @@ int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | |||
180 | buf->npages = 1; | 180 | buf->npages = 1; |
181 | buf->page_shift = get_order(size) + PAGE_SHIFT; | 181 | buf->page_shift = get_order(size) + PAGE_SHIFT; |
182 | buf->direct.buf = dma_alloc_coherent(&dev->pdev->dev, | 182 | buf->direct.buf = dma_alloc_coherent(&dev->pdev->dev, |
183 | size, &t, GFP_KERNEL); | 183 | size, &t, gfp); |
184 | if (!buf->direct.buf) | 184 | if (!buf->direct.buf) |
185 | return -ENOMEM; | 185 | return -ENOMEM; |
186 | 186 | ||
@@ -200,14 +200,14 @@ int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | |||
200 | buf->npages = buf->nbufs; | 200 | buf->npages = buf->nbufs; |
201 | buf->page_shift = PAGE_SHIFT; | 201 | buf->page_shift = PAGE_SHIFT; |
202 | buf->page_list = kcalloc(buf->nbufs, sizeof(*buf->page_list), | 202 | buf->page_list = kcalloc(buf->nbufs, sizeof(*buf->page_list), |
203 | GFP_KERNEL); | 203 | gfp); |
204 | if (!buf->page_list) | 204 | if (!buf->page_list) |
205 | return -ENOMEM; | 205 | return -ENOMEM; |
206 | 206 | ||
207 | for (i = 0; i < buf->nbufs; ++i) { | 207 | for (i = 0; i < buf->nbufs; ++i) { |
208 | buf->page_list[i].buf = | 208 | buf->page_list[i].buf = |
209 | dma_alloc_coherent(&dev->pdev->dev, PAGE_SIZE, | 209 | dma_alloc_coherent(&dev->pdev->dev, PAGE_SIZE, |
210 | &t, GFP_KERNEL); | 210 | &t, gfp); |
211 | if (!buf->page_list[i].buf) | 211 | if (!buf->page_list[i].buf) |
212 | goto err_free; | 212 | goto err_free; |
213 | 213 | ||
@@ -218,7 +218,7 @@ int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, | |||
218 | 218 | ||
219 | if (BITS_PER_LONG == 64) { | 219 | if (BITS_PER_LONG == 64) { |
220 | struct page **pages; | 220 | struct page **pages; |
221 | pages = kmalloc(sizeof *pages * buf->nbufs, GFP_KERNEL); | 221 | pages = kmalloc(sizeof *pages * buf->nbufs, gfp); |
222 | if (!pages) | 222 | if (!pages) |
223 | goto err_free; | 223 | goto err_free; |
224 | for (i = 0; i < buf->nbufs; ++i) | 224 | for (i = 0; i < buf->nbufs; ++i) |
@@ -260,11 +260,12 @@ void mlx4_buf_free(struct mlx4_dev *dev, int size, struct mlx4_buf *buf) | |||
260 | } | 260 | } |
261 | EXPORT_SYMBOL_GPL(mlx4_buf_free); | 261 | EXPORT_SYMBOL_GPL(mlx4_buf_free); |
262 | 262 | ||
263 | static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) | 263 | static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device, |
264 | gfp_t gfp) | ||
264 | { | 265 | { |
265 | struct mlx4_db_pgdir *pgdir; | 266 | struct mlx4_db_pgdir *pgdir; |
266 | 267 | ||
267 | pgdir = kzalloc(sizeof *pgdir, GFP_KERNEL); | 268 | pgdir = kzalloc(sizeof *pgdir, gfp); |
268 | if (!pgdir) | 269 | if (!pgdir) |
269 | return NULL; | 270 | return NULL; |
270 | 271 | ||
@@ -272,7 +273,7 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) | |||
272 | pgdir->bits[0] = pgdir->order0; | 273 | pgdir->bits[0] = pgdir->order0; |
273 | pgdir->bits[1] = pgdir->order1; | 274 | pgdir->bits[1] = pgdir->order1; |
274 | pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE, | 275 | pgdir->db_page = dma_alloc_coherent(dma_device, PAGE_SIZE, |
275 | &pgdir->db_dma, GFP_KERNEL); | 276 | &pgdir->db_dma, gfp); |
276 | if (!pgdir->db_page) { | 277 | if (!pgdir->db_page) { |
277 | kfree(pgdir); | 278 | kfree(pgdir); |
278 | return NULL; | 279 | return NULL; |
@@ -312,7 +313,7 @@ found: | |||
312 | return 0; | 313 | return 0; |
313 | } | 314 | } |
314 | 315 | ||
315 | int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) | 316 | int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order, gfp_t gfp) |
316 | { | 317 | { |
317 | struct mlx4_priv *priv = mlx4_priv(dev); | 318 | struct mlx4_priv *priv = mlx4_priv(dev); |
318 | struct mlx4_db_pgdir *pgdir; | 319 | struct mlx4_db_pgdir *pgdir; |
@@ -324,7 +325,7 @@ int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) | |||
324 | if (!mlx4_alloc_db_from_pgdir(pgdir, db, order)) | 325 | if (!mlx4_alloc_db_from_pgdir(pgdir, db, order)) |
325 | goto out; | 326 | goto out; |
326 | 327 | ||
327 | pgdir = mlx4_alloc_db_pgdir(&(dev->pdev->dev)); | 328 | pgdir = mlx4_alloc_db_pgdir(&(dev->pdev->dev), gfp); |
328 | if (!pgdir) { | 329 | if (!pgdir) { |
329 | ret = -ENOMEM; | 330 | ret = -ENOMEM; |
330 | goto out; | 331 | goto out; |
@@ -376,13 +377,13 @@ int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres, | |||
376 | { | 377 | { |
377 | int err; | 378 | int err; |
378 | 379 | ||
379 | err = mlx4_db_alloc(dev, &wqres->db, 1); | 380 | err = mlx4_db_alloc(dev, &wqres->db, 1, GFP_KERNEL); |
380 | if (err) | 381 | if (err) |
381 | return err; | 382 | return err; |
382 | 383 | ||
383 | *wqres->db.db = 0; | 384 | *wqres->db.db = 0; |
384 | 385 | ||
385 | err = mlx4_buf_alloc(dev, size, max_direct, &wqres->buf); | 386 | err = mlx4_buf_alloc(dev, size, max_direct, &wqres->buf, GFP_KERNEL); |
386 | if (err) | 387 | if (err) |
387 | goto err_db; | 388 | goto err_db; |
388 | 389 | ||
@@ -391,7 +392,7 @@ int mlx4_alloc_hwq_res(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres, | |||
391 | if (err) | 392 | if (err) |
392 | goto err_buf; | 393 | goto err_buf; |
393 | 394 | ||
394 | err = mlx4_buf_write_mtt(dev, &wqres->mtt, &wqres->buf); | 395 | err = mlx4_buf_write_mtt(dev, &wqres->mtt, &wqres->buf, GFP_KERNEL); |
395 | if (err) | 396 | if (err) |
396 | goto err_mtt; | 397 | goto err_mtt; |
397 | 398 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/cq.c b/drivers/net/ethernet/mellanox/mlx4/cq.c index 0487121e4a0f..c90cde5b4aee 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cq.c +++ b/drivers/net/ethernet/mellanox/mlx4/cq.c | |||
@@ -173,11 +173,11 @@ int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn) | |||
173 | if (*cqn == -1) | 173 | if (*cqn == -1) |
174 | return -ENOMEM; | 174 | return -ENOMEM; |
175 | 175 | ||
176 | err = mlx4_table_get(dev, &cq_table->table, *cqn); | 176 | err = mlx4_table_get(dev, &cq_table->table, *cqn, GFP_KERNEL); |
177 | if (err) | 177 | if (err) |
178 | goto err_out; | 178 | goto err_out; |
179 | 179 | ||
180 | err = mlx4_table_get(dev, &cq_table->cmpt_table, *cqn); | 180 | err = mlx4_table_get(dev, &cq_table->cmpt_table, *cqn, GFP_KERNEL); |
181 | if (err) | 181 | if (err) |
182 | goto err_put; | 182 | goto err_put; |
183 | return 0; | 183 | return 0; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index ba049ae88749..87857a6463eb 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | |||
@@ -972,7 +972,7 @@ static int mlx4_en_config_rss_qp(struct mlx4_en_priv *priv, int qpn, | |||
972 | if (!context) | 972 | if (!context) |
973 | return -ENOMEM; | 973 | return -ENOMEM; |
974 | 974 | ||
975 | err = mlx4_qp_alloc(mdev->dev, qpn, qp); | 975 | err = mlx4_qp_alloc(mdev->dev, qpn, qp, GFP_KERNEL); |
976 | if (err) { | 976 | if (err) { |
977 | en_err(priv, "Failed to allocate qp #%x\n", qpn); | 977 | en_err(priv, "Failed to allocate qp #%x\n", qpn); |
978 | goto out; | 978 | goto out; |
@@ -1012,7 +1012,7 @@ int mlx4_en_create_drop_qp(struct mlx4_en_priv *priv) | |||
1012 | en_err(priv, "Failed reserving drop qpn\n"); | 1012 | en_err(priv, "Failed reserving drop qpn\n"); |
1013 | return err; | 1013 | return err; |
1014 | } | 1014 | } |
1015 | err = mlx4_qp_alloc(priv->mdev->dev, qpn, &priv->drop_qp); | 1015 | err = mlx4_qp_alloc(priv->mdev->dev, qpn, &priv->drop_qp, GFP_KERNEL); |
1016 | if (err) { | 1016 | if (err) { |
1017 | en_err(priv, "Failed allocating drop qp\n"); | 1017 | en_err(priv, "Failed allocating drop qp\n"); |
1018 | mlx4_qp_release_range(priv->mdev->dev, qpn, 1); | 1018 | mlx4_qp_release_range(priv->mdev->dev, qpn, 1); |
@@ -1071,7 +1071,7 @@ int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv) | |||
1071 | } | 1071 | } |
1072 | 1072 | ||
1073 | /* Configure RSS indirection qp */ | 1073 | /* Configure RSS indirection qp */ |
1074 | err = mlx4_qp_alloc(mdev->dev, priv->base_qpn, &rss_map->indir_qp); | 1074 | err = mlx4_qp_alloc(mdev->dev, priv->base_qpn, &rss_map->indir_qp, GFP_KERNEL); |
1075 | if (err) { | 1075 | if (err) { |
1076 | en_err(priv, "Failed to allocate RSS indirection QP\n"); | 1076 | en_err(priv, "Failed to allocate RSS indirection QP\n"); |
1077 | goto rss_err; | 1077 | goto rss_err; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index dd1f6d346459..bc0cc1eb214d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
@@ -113,7 +113,7 @@ int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, | |||
113 | ring->buf_size, (unsigned long long) ring->wqres.buf.direct.map); | 113 | ring->buf_size, (unsigned long long) ring->wqres.buf.direct.map); |
114 | 114 | ||
115 | ring->qpn = qpn; | 115 | ring->qpn = qpn; |
116 | err = mlx4_qp_alloc(mdev->dev, ring->qpn, &ring->qp); | 116 | err = mlx4_qp_alloc(mdev->dev, ring->qpn, &ring->qp, GFP_KERNEL); |
117 | if (err) { | 117 | if (err) { |
118 | en_err(priv, "Failed allocating qp %d\n", ring->qpn); | 118 | en_err(priv, "Failed allocating qp %d\n", ring->qpn); |
119 | goto err_map; | 119 | goto err_map; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/icm.c b/drivers/net/ethernet/mellanox/mlx4/icm.c index 5fbf4924c272..eb1747e1937d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/icm.c +++ b/drivers/net/ethernet/mellanox/mlx4/icm.c | |||
@@ -245,7 +245,8 @@ int mlx4_UNMAP_ICM_AUX(struct mlx4_dev *dev) | |||
245 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); | 245 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); |
246 | } | 246 | } |
247 | 247 | ||
248 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) | 248 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj, |
249 | int gfp) | ||
249 | { | 250 | { |
250 | u32 i = (obj & (table->num_obj - 1)) / | 251 | u32 i = (obj & (table->num_obj - 1)) / |
251 | (MLX4_TABLE_CHUNK_SIZE / table->obj_size); | 252 | (MLX4_TABLE_CHUNK_SIZE / table->obj_size); |
@@ -259,7 +260,7 @@ int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) | |||
259 | } | 260 | } |
260 | 261 | ||
261 | table->icm[i] = mlx4_alloc_icm(dev, MLX4_TABLE_CHUNK_SIZE >> PAGE_SHIFT, | 262 | table->icm[i] = mlx4_alloc_icm(dev, MLX4_TABLE_CHUNK_SIZE >> PAGE_SHIFT, |
262 | (table->lowmem ? GFP_KERNEL : GFP_HIGHUSER) | | 263 | (table->lowmem ? gfp : GFP_HIGHUSER) | |
263 | __GFP_NOWARN, table->coherent); | 264 | __GFP_NOWARN, table->coherent); |
264 | if (!table->icm[i]) { | 265 | if (!table->icm[i]) { |
265 | ret = -ENOMEM; | 266 | ret = -ENOMEM; |
@@ -356,7 +357,7 @@ int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | |||
356 | u32 i; | 357 | u32 i; |
357 | 358 | ||
358 | for (i = start; i <= end; i += inc) { | 359 | for (i = start; i <= end; i += inc) { |
359 | err = mlx4_table_get(dev, table, i); | 360 | err = mlx4_table_get(dev, table, i, GFP_KERNEL); |
360 | if (err) | 361 | if (err) |
361 | goto fail; | 362 | goto fail; |
362 | } | 363 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/icm.h b/drivers/net/ethernet/mellanox/mlx4/icm.h index dee67fa39107..067e6e0af36c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/icm.h +++ b/drivers/net/ethernet/mellanox/mlx4/icm.h | |||
@@ -71,7 +71,8 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages, | |||
71 | gfp_t gfp_mask, int coherent); | 71 | gfp_t gfp_mask, int coherent); |
72 | void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); | 72 | void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); |
73 | 73 | ||
74 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); | 74 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj, |
75 | int gfp); | ||
75 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); | 76 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); |
76 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 77 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
77 | u32 start, u32 end); | 78 | u32 start, u32 end); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index f9c465101963..627a54ef2955 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -888,7 +888,7 @@ void mlx4_cleanup_cq_table(struct mlx4_dev *dev); | |||
888 | void mlx4_cleanup_qp_table(struct mlx4_dev *dev); | 888 | void mlx4_cleanup_qp_table(struct mlx4_dev *dev); |
889 | void mlx4_cleanup_srq_table(struct mlx4_dev *dev); | 889 | void mlx4_cleanup_srq_table(struct mlx4_dev *dev); |
890 | void mlx4_cleanup_mcg_table(struct mlx4_dev *dev); | 890 | void mlx4_cleanup_mcg_table(struct mlx4_dev *dev); |
891 | int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn); | 891 | int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp); |
892 | void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn); | 892 | void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn); |
893 | int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn); | 893 | int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn); |
894 | void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn); | 894 | void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn); |
@@ -896,7 +896,7 @@ int __mlx4_srq_alloc_icm(struct mlx4_dev *dev, int *srqn); | |||
896 | void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn); | 896 | void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn); |
897 | int __mlx4_mpt_reserve(struct mlx4_dev *dev); | 897 | int __mlx4_mpt_reserve(struct mlx4_dev *dev); |
898 | void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index); | 898 | void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index); |
899 | int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index); | 899 | int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp); |
900 | void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index); | 900 | void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index); |
901 | u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order); | 901 | u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order); |
902 | void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order); | 902 | void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mr.c b/drivers/net/ethernet/mellanox/mlx4/mr.c index 24835853b753..4c71dafad217 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mr.c +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c | |||
@@ -364,14 +364,14 @@ static void mlx4_mpt_release(struct mlx4_dev *dev, u32 index) | |||
364 | __mlx4_mpt_release(dev, index); | 364 | __mlx4_mpt_release(dev, index); |
365 | } | 365 | } |
366 | 366 | ||
367 | int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) | 367 | int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp) |
368 | { | 368 | { |
369 | struct mlx4_mr_table *mr_table = &mlx4_priv(dev)->mr_table; | 369 | struct mlx4_mr_table *mr_table = &mlx4_priv(dev)->mr_table; |
370 | 370 | ||
371 | return mlx4_table_get(dev, &mr_table->dmpt_table, index); | 371 | return mlx4_table_get(dev, &mr_table->dmpt_table, index, gfp); |
372 | } | 372 | } |
373 | 373 | ||
374 | static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) | 374 | static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp) |
375 | { | 375 | { |
376 | u64 param = 0; | 376 | u64 param = 0; |
377 | 377 | ||
@@ -382,7 +382,7 @@ static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) | |||
382 | MLX4_CMD_TIME_CLASS_A, | 382 | MLX4_CMD_TIME_CLASS_A, |
383 | MLX4_CMD_WRAPPED); | 383 | MLX4_CMD_WRAPPED); |
384 | } | 384 | } |
385 | return __mlx4_mpt_alloc_icm(dev, index); | 385 | return __mlx4_mpt_alloc_icm(dev, index, gfp); |
386 | } | 386 | } |
387 | 387 | ||
388 | void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index) | 388 | void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index) |
@@ -469,7 +469,7 @@ int mlx4_mr_enable(struct mlx4_dev *dev, struct mlx4_mr *mr) | |||
469 | struct mlx4_mpt_entry *mpt_entry; | 469 | struct mlx4_mpt_entry *mpt_entry; |
470 | int err; | 470 | int err; |
471 | 471 | ||
472 | err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mr->key)); | 472 | err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mr->key), GFP_KERNEL); |
473 | if (err) | 473 | if (err) |
474 | return err; | 474 | return err; |
475 | 475 | ||
@@ -627,13 +627,14 @@ int mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | |||
627 | EXPORT_SYMBOL_GPL(mlx4_write_mtt); | 627 | EXPORT_SYMBOL_GPL(mlx4_write_mtt); |
628 | 628 | ||
629 | int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, | 629 | int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, |
630 | struct mlx4_buf *buf) | 630 | struct mlx4_buf *buf, gfp_t gfp) |
631 | { | 631 | { |
632 | u64 *page_list; | 632 | u64 *page_list; |
633 | int err; | 633 | int err; |
634 | int i; | 634 | int i; |
635 | 635 | ||
636 | page_list = kmalloc(buf->npages * sizeof *page_list, GFP_KERNEL); | 636 | page_list = kmalloc(buf->npages * sizeof *page_list, |
637 | gfp); | ||
637 | if (!page_list) | 638 | if (!page_list) |
638 | return -ENOMEM; | 639 | return -ENOMEM; |
639 | 640 | ||
@@ -680,7 +681,7 @@ int mlx4_mw_enable(struct mlx4_dev *dev, struct mlx4_mw *mw) | |||
680 | struct mlx4_mpt_entry *mpt_entry; | 681 | struct mlx4_mpt_entry *mpt_entry; |
681 | int err; | 682 | int err; |
682 | 683 | ||
683 | err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mw->key)); | 684 | err = mlx4_mpt_alloc_icm(dev, key_to_hw_index(mw->key), GFP_KERNEL); |
684 | if (err) | 685 | if (err) |
685 | return err; | 686 | return err; |
686 | 687 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/qp.c b/drivers/net/ethernet/mellanox/mlx4/qp.c index 61d64ebffd56..917f0d0ba7c6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/qp.c +++ b/drivers/net/ethernet/mellanox/mlx4/qp.c | |||
@@ -272,29 +272,29 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt) | |||
272 | } | 272 | } |
273 | EXPORT_SYMBOL_GPL(mlx4_qp_release_range); | 273 | EXPORT_SYMBOL_GPL(mlx4_qp_release_range); |
274 | 274 | ||
275 | int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) | 275 | int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp) |
276 | { | 276 | { |
277 | struct mlx4_priv *priv = mlx4_priv(dev); | 277 | struct mlx4_priv *priv = mlx4_priv(dev); |
278 | struct mlx4_qp_table *qp_table = &priv->qp_table; | 278 | struct mlx4_qp_table *qp_table = &priv->qp_table; |
279 | int err; | 279 | int err; |
280 | 280 | ||
281 | err = mlx4_table_get(dev, &qp_table->qp_table, qpn); | 281 | err = mlx4_table_get(dev, &qp_table->qp_table, qpn, gfp); |
282 | if (err) | 282 | if (err) |
283 | goto err_out; | 283 | goto err_out; |
284 | 284 | ||
285 | err = mlx4_table_get(dev, &qp_table->auxc_table, qpn); | 285 | err = mlx4_table_get(dev, &qp_table->auxc_table, qpn, gfp); |
286 | if (err) | 286 | if (err) |
287 | goto err_put_qp; | 287 | goto err_put_qp; |
288 | 288 | ||
289 | err = mlx4_table_get(dev, &qp_table->altc_table, qpn); | 289 | err = mlx4_table_get(dev, &qp_table->altc_table, qpn, gfp); |
290 | if (err) | 290 | if (err) |
291 | goto err_put_auxc; | 291 | goto err_put_auxc; |
292 | 292 | ||
293 | err = mlx4_table_get(dev, &qp_table->rdmarc_table, qpn); | 293 | err = mlx4_table_get(dev, &qp_table->rdmarc_table, qpn, gfp); |
294 | if (err) | 294 | if (err) |
295 | goto err_put_altc; | 295 | goto err_put_altc; |
296 | 296 | ||
297 | err = mlx4_table_get(dev, &qp_table->cmpt_table, qpn); | 297 | err = mlx4_table_get(dev, &qp_table->cmpt_table, qpn, gfp); |
298 | if (err) | 298 | if (err) |
299 | goto err_put_rdmarc; | 299 | goto err_put_rdmarc; |
300 | 300 | ||
@@ -316,7 +316,7 @@ err_out: | |||
316 | return err; | 316 | return err; |
317 | } | 317 | } |
318 | 318 | ||
319 | static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) | 319 | static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, int gfp) |
320 | { | 320 | { |
321 | u64 param = 0; | 321 | u64 param = 0; |
322 | 322 | ||
@@ -326,7 +326,7 @@ static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) | |||
326 | MLX4_CMD_ALLOC_RES, MLX4_CMD_TIME_CLASS_A, | 326 | MLX4_CMD_ALLOC_RES, MLX4_CMD_TIME_CLASS_A, |
327 | MLX4_CMD_WRAPPED); | 327 | MLX4_CMD_WRAPPED); |
328 | } | 328 | } |
329 | return __mlx4_qp_alloc_icm(dev, qpn); | 329 | return __mlx4_qp_alloc_icm(dev, qpn, gfp); |
330 | } | 330 | } |
331 | 331 | ||
332 | void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn) | 332 | void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn) |
@@ -355,7 +355,7 @@ static void mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn) | |||
355 | __mlx4_qp_free_icm(dev, qpn); | 355 | __mlx4_qp_free_icm(dev, qpn); |
356 | } | 356 | } |
357 | 357 | ||
358 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp) | 358 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp, gfp_t gfp) |
359 | { | 359 | { |
360 | struct mlx4_priv *priv = mlx4_priv(dev); | 360 | struct mlx4_priv *priv = mlx4_priv(dev); |
361 | struct mlx4_qp_table *qp_table = &priv->qp_table; | 361 | struct mlx4_qp_table *qp_table = &priv->qp_table; |
@@ -366,7 +366,7 @@ int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp) | |||
366 | 366 | ||
367 | qp->qpn = qpn; | 367 | qp->qpn = qpn; |
368 | 368 | ||
369 | err = mlx4_qp_alloc_icm(dev, qpn); | 369 | err = mlx4_qp_alloc_icm(dev, qpn, gfp); |
370 | if (err) | 370 | if (err) |
371 | return err; | 371 | return err; |
372 | 372 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 1c3fdd4a1f7d..45da913b5679 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
@@ -1532,7 +1532,7 @@ static int qp_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, | |||
1532 | return err; | 1532 | return err; |
1533 | 1533 | ||
1534 | if (!fw_reserved(dev, qpn)) { | 1534 | if (!fw_reserved(dev, qpn)) { |
1535 | err = __mlx4_qp_alloc_icm(dev, qpn); | 1535 | err = __mlx4_qp_alloc_icm(dev, qpn, GFP_KERNEL); |
1536 | if (err) { | 1536 | if (err) { |
1537 | res_abort_move(dev, slave, RES_QP, qpn); | 1537 | res_abort_move(dev, slave, RES_QP, qpn); |
1538 | return err; | 1538 | return err; |
@@ -1619,7 +1619,7 @@ static int mpt_alloc_res(struct mlx4_dev *dev, int slave, int op, int cmd, | |||
1619 | if (err) | 1619 | if (err) |
1620 | return err; | 1620 | return err; |
1621 | 1621 | ||
1622 | err = __mlx4_mpt_alloc_icm(dev, mpt->key); | 1622 | err = __mlx4_mpt_alloc_icm(dev, mpt->key, GFP_KERNEL); |
1623 | if (err) { | 1623 | if (err) { |
1624 | res_abort_move(dev, slave, RES_MPT, id); | 1624 | res_abort_move(dev, slave, RES_MPT, id); |
1625 | return err; | 1625 | return err; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/srq.c b/drivers/net/ethernet/mellanox/mlx4/srq.c index 98faf870b0b0..67146624eb58 100644 --- a/drivers/net/ethernet/mellanox/mlx4/srq.c +++ b/drivers/net/ethernet/mellanox/mlx4/srq.c | |||
@@ -103,11 +103,11 @@ int __mlx4_srq_alloc_icm(struct mlx4_dev *dev, int *srqn) | |||
103 | if (*srqn == -1) | 103 | if (*srqn == -1) |
104 | return -ENOMEM; | 104 | return -ENOMEM; |
105 | 105 | ||
106 | err = mlx4_table_get(dev, &srq_table->table, *srqn); | 106 | err = mlx4_table_get(dev, &srq_table->table, *srqn, GFP_KERNEL); |
107 | if (err) | 107 | if (err) |
108 | goto err_out; | 108 | goto err_out; |
109 | 109 | ||
110 | err = mlx4_table_get(dev, &srq_table->cmpt_table, *srqn); | 110 | err = mlx4_table_get(dev, &srq_table->cmpt_table, *srqn, GFP_KERNEL); |
111 | if (err) | 111 | if (err) |
112 | goto err_put; | 112 | goto err_put; |
113 | return 0; | 113 | return 0; |