Steve Wise cc18b939e1 RDMA/cxgb4: Fix endpoint mutex deadlocks
In cases where the cm calls c4iw_modify_rc_qp() with the endpoint
mutex held, they must be called with internal == 1.  rx_data() and
process_mpa_reply() are not doing this.  This causes a deadlock
because c4iw_modify_rc_qp() might call c4iw_ep_disconnect() in some
!internal cases, and c4iw_ep_disconnect() acquires the endpoint mutex.
The design was intended to only do the disconnect for !internal calls.

Change rx_data(), FPDU_MODE case, to call c4iw_modify_rc_qp() with
internal == 1, and then disconnect only after releasing the mutex.

Change process_mpa_reply() to call c4iw_modify_rc_qp(TERMINATE) with
internal == 1 and set a new attr flag telling it to send a TERMINATE
message.  Previously this was implied by !internal.

Change process_mpa_reply() to return whether the caller should
disconnect after releasing the endpoint mutex.  Now rx_data() will do
the disconnect in the cases where process_mpa_reply() wants to
disconnect after the TERMINATE is sent.

Change c4iw_modify_rc_qp() RTS->TERM to only disconnect if !internal,
and to send a TERMINATE message if attrs->send_term is 1.

Change abort_connection() to not aquire the ep mutex for setting the
state, and make all calls to abort_connection() do so with the mutex
held.

Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
2014-04-28 17:29:41 -07:00
..
2014-04-05 15:37:40 -07:00
2014-04-05 15:37:40 -07:00
2014-04-18 16:57:53 -07:00
2014-04-24 23:46:58 +02:00
2014-04-08 13:27:40 +02:00
2014-04-22 09:28:02 -07:00
2014-04-17 10:51:01 -07:00
2014-04-09 08:39:39 -07:00
2014-04-16 12:28:47 -07:00
2014-04-09 08:39:39 -07:00
2014-04-18 16:40:08 -07:00
2014-04-15 15:21:22 -05:00
2014-04-24 12:53:38 -07:00
2014-04-18 16:40:08 -07:00
2014-04-05 15:37:40 -07:00
2014-04-21 14:28:40 -07:00
2014-04-05 15:38:41 -07:00
2014-04-03 14:05:02 -07:00
2014-04-16 14:07:51 -07:00