[rds-devel] [PATCH future/20090207 2/2] RDS/IB+IW: Allow recv handling while in CONNECTING state.
Andy Grover
andy.grover at oracle.com
Wed Feb 11 16:56:42 PST 2009
Thanks, applied both patches (fixed the "From:") -- Andy
Steve Wise wrote:
> From: None <None>
>
> It is possible to get a recv completion with the QP in RTS _before_
> RDS has a change to process the RDMA-CM ESTABLISHED event. The result is
> that the recv completion handler can be called with the RDS connection
> state set to CONNECTING.
>
> The current logic only processes recv completions if the RDS connection
> state is UP. Further, it _skips_ completions in this state which results
> in effectively missing incoming data.
>
> I've reproduced this problem by running simultaneous rds-stress runs
> on 2 nodes over iwarp (one in each direction effectively generating
> bidir traffic). The failure mode in this case is a connection drop due
> to an unexpected fragment.
>
> The solution is to allow recv processing while in CONNECTING mode.
> This resolves the failure mode I'm seeing.
>
> Signed-off-by: Steve Wise <swise at opengridcomputing.com>
> ---
>
> net/rds/ib_recv.c | 7 ++++++-
> net/rds/iw_recv.c | 7 ++++++-
> net/rds/rds.h | 6 ++++++
> 3 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c
> index 45b569d..e45638a 100644
> --- a/net/rds/ib_recv.c
> +++ b/net/rds/ib_recv.c
> @@ -803,7 +803,12 @@ void rds_ib_recv_cq_comp_handler(struct ib_cq *cq, void *context)
>
> rds_ib_recv_unmap_page(ic, recv);
>
> - if (rds_conn_up(conn)) {
> + /*
> + * Also process recvs in connecting state because it is possible
> + * to get a recv completion _before_ the rdmacm ESTABLISHED
> + * event is processed.
> + */
> + if (rds_conn_up(conn) || rds_conn_connecting(conn)) {
> /* We expect errors as the qp is drained during shutdown */
> if (wc.status == IB_WC_SUCCESS) {
> rds_ib_process_recv(conn, recv, wc.byte_len, &state);
> diff --git a/net/rds/iw_recv.c b/net/rds/iw_recv.c
> index 05bccc5..5b89344 100644
> --- a/net/rds/iw_recv.c
> +++ b/net/rds/iw_recv.c
> @@ -803,7 +803,12 @@ void rds_iw_recv_cq_comp_handler(struct ib_cq *cq, void *context)
>
> rds_iw_recv_unmap_page(ic, recv);
>
> - if (rds_conn_up(conn)) {
> + /*
> + * Also process recvs in connecting state because it is possible
> + * to get a recv completion _before_ the rdmacm ESTABLISHED
> + * event is processed.
> + */
> + if (rds_conn_up(conn) || rds_conn_connecting(conn)) {
> /* We expect errors as the qp is drained during shutdown */
> if (wc.status == IB_WC_SUCCESS) {
> rds_iw_process_recv(conn, recv, wc.byte_len, &state);
> diff --git a/net/rds/rds.h b/net/rds/rds.h
> index 0a88b8e..0247af8 100644
> --- a/net/rds/rds.h
> +++ b/net/rds/rds.h
> @@ -624,6 +624,12 @@ rds_conn_up(struct rds_connection *conn)
> return atomic_read(&conn->c_state) == RDS_CONN_UP;
> }
>
> +static inline int
> +rds_conn_connecting(struct rds_connection *conn)
> +{
> + return atomic_read(&conn->c_state) == RDS_CONN_CONNECTING;
> +}
> +
> /* message.c */
> struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp);
> struct rds_message *rds_message_copy_from_user(struct iovec *first_iov,
>
More information about the rds-devel
mailing list