2008-05-19 03:49:01

by Peter Leckie

[permalink] [raw]
Subject: Re: [PATCH 02/04] NFS/RDMA client stall patches

Drain both the sending and resend queues on disconnect.
This prevents the client from getting it's self into a
dead state when the server disconnects us.

Signed-off-by: Peter Leckie <pleckie-cP1dWloDopni96+mSzHFpQC/[email protected]>
Reviewed-by: Greg Banks <gnb-cP1dWloDopni96+mSzHFpQC/[email protected]>
X-Sgi-Pv: 971446
<http://bugworks/query.cgi/971446>---
Index: linux-2.6.25.3/net/sunrpc/xprt.c
===================================================================
--- linux-2.6.25.3.orig/net/sunrpc/xprt.c
+++ linux-2.6.25.3/net/sunrpc/xprt.c
@@ -586,6 +586,8 @@ void xprt_disconnect_done(struct rpc_xpr
spin_lock_bh(&xprt->transport_lock);
xprt_clear_connected(xprt);
xprt_wake_pending_tasks(xprt, -ENOTCONN);
+ rpc_wake_up_status(&xprt->resend, -ENOTCONN);
+ rpc_wake_up_status(&xprt->sending, -ENOTCONN);
spin_unlock_bh(&xprt->transport_lock);
}
EXPORT_SYMBOL_GPL(xprt_disconnect_done);



2008-06-10 19:19:26

by Trond Myklebust

[permalink] [raw]
Subject: Re: [PATCH 02/04] NFS/RDMA client stall patches

On Mon, 2008-05-19 at 13:51 +1000, Peter Leckie wrote:
> Drain both the sending and resend queues on disconnect.
> This prevents the client from getting it's self into a
> dead state when the server disconnects us.
>
> Signed-off-by: Peter Leckie <pleckie-cP1dWloDopni96+mSzHFpQC/[email protected]>
> Reviewed-by: Greg Banks <gnb-cP1dWloDopni96+mSzHFpQC/[email protected]>
> X-Sgi-Pv: 971446
> <http://bugworks/query.cgi/971446>---
> Index: linux-2.6.25.3/net/sunrpc/xprt.c
> ===================================================================
> --- linux-2.6.25.3.orig/net/sunrpc/xprt.c
> +++ linux-2.6.25.3/net/sunrpc/xprt.c
> @@ -586,6 +586,8 @@ void xprt_disconnect_done(struct rpc_xpr
> spin_lock_bh(&xprt->transport_lock);
> xprt_clear_connected(xprt);
> xprt_wake_pending_tasks(xprt, -ENOTCONN);
> + rpc_wake_up_status(&xprt->resend, -ENOTCONN);
> + rpc_wake_up_status(&xprt->sending, -ENOTCONN);
> spin_unlock_bh(&xprt->transport_lock);
> }
> EXPORT_SYMBOL_GPL(xprt_disconnect_done);

What kind of a deadlock? The tasks on these queues should be waiting for
the XPRT_LOCKED bit. Why would the change in connection status change
anything to that?

Trond