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/infiniband/hw | |
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/infiniband/hw')
-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 |
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 | ||
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 | ||