IB/iser: Drain the tx cq once before looping on the rx cq
authorRoi Dayan <roid@mellanox.com>
Tue, 1 Apr 2014 13:28:38 +0000 (16:28 +0300)
committerRoland Dreier <roland@purestorage.com>
Tue, 1 Apr 2014 18:09:46 +0000 (11:09 -0700)
commit1d6c2b736fd251c1f827704b1234d81b28c112d6
treee2d21beff3ae208830a32f750d3c97e24d99cae9
parent39c978cd1704dc03f6913bd40f858def7fd31185
IB/iser: Drain the tx cq once before looping on the rx cq

The iser disconnection flow isn't done before all the inflight
recv/send buffers posted to the QP are either flushed or normally
completed to the CQ that serves this connection.  The condition check
is done in iser_handle_comp_error().

Currently, it's possible for the send buffer completion that makes the
posted send buffers counter reach zero to be polled in the drain tx
call, which is after the rx cq is fully drained.  Since this
completion might be not an error one (for example, it might be a
completion of the logout request iSCSI PDU) we will skip
iser_handle_comp_error().  So the connection will never terminate from
the iscsi stack point of view, and we hang.

To resolve this race, do the draining of the tx cq before the loop on
the rx cq.

Signed-off-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/ulp/iser/iser_verbs.c