aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2014-05-11 08:15:12 -0400
committerRoland Dreier <roland@purestorage.com>2014-06-02 17:58:11 -0400
commit40f2287bd583f4df4c602c1a29a48df2730fb6d4 (patch)
treed3dcabe51b5821b1334ea656f6d2166fcf732a18 /drivers
parent09b93088d75009807b72293f26e2634430ce5ba9 (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.c6
-rw-r--r--drivers/infiniband/hw/mlx4/mlx4_ib.h1
-rw-r--r--drivers/infiniband/hw/mlx4/qp.c30
-rw-r--r--drivers/infiniband/hw/mlx4/srq.c7
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/alloc.c27
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/cq.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_rx.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_tx.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/icm.c7
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/icm.h3
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4.h4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mr.c17
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/qp.c20
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/resource_tracker.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/srq.c4
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
611static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, 611static 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
173int mlx4_buf_alloc(struct mlx4_dev *dev, int size, int max_direct, 173int 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}
261EXPORT_SYMBOL_GPL(mlx4_buf_free); 261EXPORT_SYMBOL_GPL(mlx4_buf_free);
262 262
263static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device) 263static 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
315int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order) 316int 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
248int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) 248int 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);
72void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); 72void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent);
73 73
74int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); 74int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj,
75 int gfp);
75void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); 76void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj);
76int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, 77int 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);
888void mlx4_cleanup_qp_table(struct mlx4_dev *dev); 888void mlx4_cleanup_qp_table(struct mlx4_dev *dev);
889void mlx4_cleanup_srq_table(struct mlx4_dev *dev); 889void mlx4_cleanup_srq_table(struct mlx4_dev *dev);
890void mlx4_cleanup_mcg_table(struct mlx4_dev *dev); 890void mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
891int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn); 891int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn, gfp_t gfp);
892void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn); 892void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
893int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn); 893int __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
894void __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn); 894void __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);
896void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn); 896void __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
897int __mlx4_mpt_reserve(struct mlx4_dev *dev); 897int __mlx4_mpt_reserve(struct mlx4_dev *dev);
898void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index); 898void __mlx4_mpt_release(struct mlx4_dev *dev, u32 index);
899int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index); 899int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index, gfp_t gfp);
900void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index); 900void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index);
901u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order); 901u32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
902void __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order); 902void __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
367int __mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) 367int __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
374static int mlx4_mpt_alloc_icm(struct mlx4_dev *dev, u32 index) 374static 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
388void __mlx4_mpt_free_icm(struct mlx4_dev *dev, u32 index) 388void __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,
627EXPORT_SYMBOL_GPL(mlx4_write_mtt); 627EXPORT_SYMBOL_GPL(mlx4_write_mtt);
628 628
629int mlx4_buf_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt, 629int 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}
273EXPORT_SYMBOL_GPL(mlx4_qp_release_range); 273EXPORT_SYMBOL_GPL(mlx4_qp_release_range);
274 274
275int __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) 275int __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
319static int mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn) 319static 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
332void __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn) 332void __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
358int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp) 358int 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;