aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp
diff options
context:
space:
mode:
authorSagi Grimberg <sagig@mellanox.com>2014-12-02 09:57:46 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-12-13 02:32:32 -0500
commitc7e160ee092059d3d1ddc24397c9d7a4dbe8186a (patch)
treedf6283a898f01e6c7a225fb73509134cf61c534a /drivers/infiniband/ulp
parent36ea63b523f3f3b57f708f14af848cac100677d5 (diff)
iser-target: Don't wait for session commands from completion context
Might result in a deadlock where completion context waits for session commands release where the later might need a final completion for it. Signed-off-by: Sagi Grimberg <sagig@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/infiniband/ulp')
-rw-r--r--drivers/infiniband/ulp/isert/ib_isert.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c
index 276054b65b98..fc4641e5fd1e 100644
--- a/drivers/infiniband/ulp/isert/ib_isert.c
+++ b/drivers/infiniband/ulp/isert/ib_isert.c
@@ -1984,13 +1984,6 @@ static void
1984isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc) 1984isert_cq_comp_err(struct isert_conn *isert_conn, struct ib_wc *wc)
1985{ 1985{
1986 if (wc->wr_id == ISER_BEACON_WRID) { 1986 if (wc->wr_id == ISER_BEACON_WRID) {
1987 struct iscsi_conn *conn = isert_conn->conn;
1988
1989 if (conn->sess) {
1990 target_sess_cmd_list_set_waiting(conn->sess->se_sess);
1991 target_wait_for_sess_cmds(conn->sess->se_sess);
1992 }
1993
1994 pr_info("conn %p completing conn_wait_comp_err\n", 1987 pr_info("conn %p completing conn_wait_comp_err\n",
1995 isert_conn); 1988 isert_conn);
1996 complete(&isert_conn->conn_wait_comp_err); 1989 complete(&isert_conn->conn_wait_comp_err);
@@ -3243,6 +3236,15 @@ static void isert_release_work(struct work_struct *work)
3243} 3236}
3244 3237
3245static void 3238static void
3239isert_wait4cmds(struct iscsi_conn *conn)
3240{
3241 if (conn->sess) {
3242 target_sess_cmd_list_set_waiting(conn->sess->se_sess);
3243 target_wait_for_sess_cmds(conn->sess->se_sess);
3244 }
3245}
3246
3247static void
3246isert_wait4flush(struct isert_conn *isert_conn) 3248isert_wait4flush(struct isert_conn *isert_conn)
3247{ 3249{
3248 struct ib_recv_wr *bad_wr; 3250 struct ib_recv_wr *bad_wr;
@@ -3276,6 +3278,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
3276 isert_conn_terminate(isert_conn); 3278 isert_conn_terminate(isert_conn);
3277 mutex_unlock(&isert_conn->conn_mutex); 3279 mutex_unlock(&isert_conn->conn_mutex);
3278 3280
3281 isert_wait4cmds(conn);
3279 isert_wait4flush(isert_conn); 3282 isert_wait4flush(isert_conn);
3280 3283
3281 INIT_WORK(&isert_conn->release_work, isert_release_work); 3284 INIT_WORK(&isert_conn->release_work, isert_release_work);