aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband
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/infiniband
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/infiniband')
-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
4 files changed, 25 insertions, 19 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