diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2015-03-29 08:52:10 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-04-08 02:27:52 -0400 |
commit | 40fc069ad8c910e2c20348bd9adeb79b3a945fef (patch) | |
tree | cdf2ea7a6ae922ed7250cc2a3ef2adaa9e6d0369 /drivers/infiniband/ulp/isert/ib_isert.c | |
parent | 6700425eb0fc92a5e3944ec3e43711877d2d5862 (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.c | 56 |
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 | ||
110 | static int | 110 | static struct isert_comp * |
111 | isert_conn_setup_qp(struct isert_conn *isert_conn, struct rdma_cm_id *cma_id) | 111 | isert_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 | |||
132 | static void | ||
133 | isert_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 | |||
140 | static struct ib_qp * | ||
141 | isert_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 | |||
181 | static int | ||
182 | isert_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; |
160 | err: | 195 | err: |
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 | ||