aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/isert/ib_isert.c
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2015-03-29 08:52:10 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-04-08 02:27:52 -0400
commit40fc069ad8c910e2c20348bd9adeb79b3a945fef (patch)
treecdf2ea7a6ae922ed7250cc2a3ef2adaa9e6d0369 /drivers/infiniband/ulp/isert/ib_isert.c
parent6700425eb0fc92a5e3944ec3e43711877d2d5862 (diff)
iser-target: Split isert_setup_qp
Simplify iser QP creation by splitting some unrelated logic bulks to routines. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband/ulp/isert/ib_isert.c')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c56
1 files changed, 42 insertions, 14 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index 1b133372e2d9..2a4a435fc516 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -107,13 +107,12 @@ isert_query_device(struct ib_device *ib_dev, struct ib_device_attr *devattr)
107 return 0; 107 return 0;
108} 108}
109 109
110static int 110static struct isert_comp *
111isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id) 111isert_comp_get(struct isert_conn *isert_conn)
112{ 112{
113 struct isert_device *device = isert_conn->conn_device; 113 struct isert_device *device = isert_conn->conn_device;
114 struct ib_qp_init_attr attr;
115 struct isert_comp *comp; 114 struct isert_comp *comp;
116 int ret, i, min = 0; 115 int i, min = 0;
117 116
118 mutex_lock(&device_list_mutex); 117 mutex_lock(&device_list_mutex);
119 for (i = 0; i < device->comps_used; i++) 118 for (i = 0; i < device->comps_used; i++)
@@ -122,9 +121,30 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
122 min = i; 121 min = i;
123 comp = &device->comps[min]; 122 comp = &device->comps[min];
124 comp->active_qps++; 123 comp->active_qps++;
124 mutex_unlock(&device_list_mutex);
125
125 isert_info("conn %p, using comp %p min_index: %d\n", 126 isert_info("conn %p, using comp %p min_index: %d\n",
126 isert_conn, comp, min); 127 isert_conn, comp, min);
128
129 return comp;
130}
131
132static void
133isert_comp_put(struct isert_comp *comp)
134{
135 mutex_lock(&device_list_mutex);
136 comp->active_qps--;
127 mutex_unlock(&device_list_mutex); 137 mutex_unlock(&device_list_mutex);
138}
139
140static struct ib_qp *
141isert_create_qp(struct isert_conn *isert_conn,
142 struct isert_comp *comp,
143 struct rdma_cm_id *cma_id)
144{
145 struct isert_device *device = isert_conn->conn_device;
146 struct ib_qp_init_attr attr;
147 int ret;
128 148
129 memset(&attr, 0, sizeof(struct ib_qp_init_attr)); 149 memset(&attr, 0, sizeof(struct ib_qp_init_attr));
130 attr.event_handler = isert_qp_event_callback; 150 attr.event_handler = isert_qp_event_callback;
@@ -152,16 +172,28 @@ isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
152 ret = rdma_create_qp(cma_id, device->pd, &attr); 172 ret = rdma_create_qp(cma_id, device->pd, &attr);
153 if (ret) { 173 if (ret) {
154 isert_err("rdma_create_qp failed for cma_id %d\n", ret); 174 isert_err("rdma_create_qp failed for cma_id %d\n", ret);
175 return ERR_PTR(ret);
176 }
177
178 return cma_id->qp;
179}
180
181static int
182isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id)
183{
184 struct isert_comp *comp;
185 int ret;
186
187 comp = isert_comp_get(isert_conn);
188 isert_conn->conn_qp = isert_create_qp(isert_conn, comp, cma_id);
189 if (IS_ERR(isert_conn->conn_qp)) {
190 ret = PTR_ERR(isert_conn->conn_qp);
155 goto err; 191 goto err;
156 } 192 }
157 isert_conn->conn_qp = cma_id->qp;
158 193
159 return 0; 194 return 0;
160err: 195err:
161 mutex_lock(&device_list_mutex); 196 isert_comp_put(comp);
162 comp->active_qps--;
163 mutex_unlock(&device_list_mutex);
164
165 return ret; 197 return ret;
166} 198}
167 199
@@ -736,11 +768,7 @@ isert_connect_release(struct isert_conn *isert_conn)
736 if (isert_conn->conn_qp) { 768 if (isert_conn->conn_qp) {
737 struct isert_comp *comp = isert_conn->conn_qp->recv_cq->cq_context; 769 struct isert_comp *comp = isert_conn->conn_qp->recv_cq->cq_context;
738 770
739 isert_dbg("dec completion context %p active_qps\n", comp); 771 isert_comp_put(comp);
740 mutex_lock(&device_list_mutex);
741 comp->active_qps--;
742 mutex_unlock(&device_list_mutex);
743
744 ib_destroy_qp(isert_conn->conn_qp); 772 ib_destroy_qp(isert_conn->conn_qp);
745 } 773 }
746 774