[PATCH v2 05/21] xprtrdma: On disconnect, don't ignore pending CQEs

2014-07-09 Thread Chuck Lever
xprtrdma is currently throwing away queued completions during
a reconnect. RPC replies posted just before connection loss, or
successful completions that change the state of an FRMR, can be
missed.

Signed-off-by: Chuck Lever chuck.le...@oracle.com
---
 net/sunrpc/xprtrdma/verbs.c |   14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 0d5187d..7fd457e 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -310,6 +310,13 @@ rpcrdma_recvcq_upcall(struct ib_cq *cq, void *cq_context)
rpcrdma_recvcq_poll(cq, ep);
 }
 
+static void
+rpcrdma_flush_cqs(struct rpcrdma_ep *ep)
+{
+   rpcrdma_recvcq_upcall(ep-rep_attr.recv_cq, ep);
+   rpcrdma_sendcq_upcall(ep-rep_attr.send_cq, ep);
+}
+
 #ifdef RPC_DEBUG
 static const char * const conn[] = {
address resolved,
@@ -872,9 +879,7 @@ retry:
if (rc  rc != -ENOTCONN)
dprintk(RPC:   %s: rpcrdma_ep_disconnect
 status %i\n, __func__, rc);
-
-   rpcrdma_clean_cq(ep-rep_attr.recv_cq);
-   rpcrdma_clean_cq(ep-rep_attr.send_cq);
+   rpcrdma_flush_cqs(ep);
 
xprt = container_of(ia, struct rpcrdma_xprt, rx_ia);
id = rpcrdma_create_id(xprt, ia,
@@ -985,8 +990,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct 
rpcrdma_ia *ia)
 {
int rc;
 
-   rpcrdma_clean_cq(ep-rep_attr.recv_cq);
-   rpcrdma_clean_cq(ep-rep_attr.send_cq);
+   rpcrdma_flush_cqs(ep);
rc = rdma_disconnect(ia-ri_id);
if (!rc) {
/* returns without wait if not connected */

--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 05/21] xprtrdma: On disconnect, don't ignore pending CQEs

2014-07-09 Thread Shirley Ma
Should all rdma_clean_cq be replaced by flush_cqs? The outstanding CQEs should 
be processed in any context. 

Shirley

On 07/09/2014 09:57 AM, Chuck Lever wrote:
 xprtrdma is currently throwing away queued completions during
 a reconnect. RPC replies posted just before connection loss, or
 successful completions that change the state of an FRMR, can be
 missed.
 
 Signed-off-by: Chuck Lever chuck.le...@oracle.com
 ---
  net/sunrpc/xprtrdma/verbs.c |   14 +-
  1 file changed, 9 insertions(+), 5 deletions(-)
 
 diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
 index 0d5187d..7fd457e 100644
 --- a/net/sunrpc/xprtrdma/verbs.c
 +++ b/net/sunrpc/xprtrdma/verbs.c
 @@ -310,6 +310,13 @@ rpcrdma_recvcq_upcall(struct ib_cq *cq, void *cq_context)
   rpcrdma_recvcq_poll(cq, ep);
  }
  
 +static void
 +rpcrdma_flush_cqs(struct rpcrdma_ep *ep)
 +{
 + rpcrdma_recvcq_upcall(ep-rep_attr.recv_cq, ep);
 + rpcrdma_sendcq_upcall(ep-rep_attr.send_cq, ep);
 +}
 +
  #ifdef RPC_DEBUG
  static const char * const conn[] = {
   address resolved,
 @@ -872,9 +879,7 @@ retry:
   if (rc  rc != -ENOTCONN)
   dprintk(RPC:   %s: rpcrdma_ep_disconnect
status %i\n, __func__, rc);
 -
 - rpcrdma_clean_cq(ep-rep_attr.recv_cq);
 - rpcrdma_clean_cq(ep-rep_attr.send_cq);
 + rpcrdma_flush_cqs(ep);
  
   xprt = container_of(ia, struct rpcrdma_xprt, rx_ia);
   id = rpcrdma_create_id(xprt, ia,
 @@ -985,8 +990,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct 
 rpcrdma_ia *ia)
  {
   int rc;
  
 - rpcrdma_clean_cq(ep-rep_attr.recv_cq);
 - rpcrdma_clean_cq(ep-rep_attr.send_cq);
 + rpcrdma_flush_cqs(ep);
   rc = rdma_disconnect(ia-ri_id);
   if (!rc) {
   /* returns without wait if not connected */
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-rdma in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 05/21] xprtrdma: On disconnect, don't ignore pending CQEs

2014-07-09 Thread Chuck Lever
Hi Shirley-

On Jul 9, 2014, at 5:28 PM, Shirley Ma shirley...@oracle.com wrote:

 Should all rdma_clean_cq be replaced by flush_cqs? The outstanding CQEs 
 should be processed in any context.

The only other context is when the transport is being destroyed (ie,
at umount time).

Send CQEs don’t matter at that point: the FRMRs are going to get
deregistered no matter what state they are in.

The RPC client waits for all remaining RPCs to complete before it 
attempts to destroy the transport, so there shouldn’t be any receive
CQEs at that point either.

 Shirley
 
 On 07/09/2014 09:57 AM, Chuck Lever wrote:
 xprtrdma is currently throwing away queued completions during
 a reconnect. RPC replies posted just before connection loss, or
 successful completions that change the state of an FRMR, can be
 missed.
 
 Signed-off-by: Chuck Lever chuck.le...@oracle.com
 ---
 net/sunrpc/xprtrdma/verbs.c |   14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)
 
 diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
 index 0d5187d..7fd457e 100644
 --- a/net/sunrpc/xprtrdma/verbs.c
 +++ b/net/sunrpc/xprtrdma/verbs.c
 @@ -310,6 +310,13 @@ rpcrdma_recvcq_upcall(struct ib_cq *cq, void 
 *cq_context)
  rpcrdma_recvcq_poll(cq, ep);
 }
 
 +static void
 +rpcrdma_flush_cqs(struct rpcrdma_ep *ep)
 +{
 +rpcrdma_recvcq_upcall(ep-rep_attr.recv_cq, ep);
 +rpcrdma_sendcq_upcall(ep-rep_attr.send_cq, ep);
 +}
 +
 #ifdef RPC_DEBUG
 static const char * const conn[] = {
  address resolved,
 @@ -872,9 +879,7 @@ retry:
  if (rc  rc != -ENOTCONN)
  dprintk(RPC:   %s: rpcrdma_ep_disconnect
   status %i\n, __func__, rc);
 -
 -rpcrdma_clean_cq(ep-rep_attr.recv_cq);
 -rpcrdma_clean_cq(ep-rep_attr.send_cq);
 +rpcrdma_flush_cqs(ep);
 
  xprt = container_of(ia, struct rpcrdma_xprt, rx_ia);
  id = rpcrdma_create_id(xprt, ia,
 @@ -985,8 +990,7 @@ rpcrdma_ep_disconnect(struct rpcrdma_ep *ep, struct 
 rpcrdma_ia *ia)
 {
  int rc;
 
 -rpcrdma_clean_cq(ep-rep_attr.recv_cq);
 -rpcrdma_clean_cq(ep-rep_attr.send_cq);
 +rpcrdma_flush_cqs(ep);
  rc = rdma_disconnect(ia-ri_id);
  if (!rc) {
  /* returns without wait if not connected */
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-rdma in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-rdma in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com



--
To unsubscribe from this list: send the line unsubscribe linux-rdma in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html