All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 0/3] NFS/RDMA client patches for v5.7-rc
@ 2020-04-20  0:02 Chuck Lever
  2020-04-20  0:03 ` [PATCH 1/3] xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler() Chuck Lever
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Chuck Lever @ 2020-04-20  0:02 UTC (permalink / raw)
  To: anna.schumaker; +Cc: linux-rdma, linux-nfs

Hi Anna-

Patches 1 and 3 fix problems introduced in v5.7, and patch 2
addresses a potential crasher that's been around for a while.

Please consider these for 5.7-rc. Thanks!

---

Chuck Lever (3):
      xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler()
      xprtrdma: Fix trace point use-after-free race
      xprtrdma: Fix use of xdr_stream_encode_item_{present,absent}


 include/trace/events/rpcrdma.h |   12 ++++--------
 net/sunrpc/xprtrdma/rpc_rdma.c |   15 +++++++++++----
 net/sunrpc/xprtrdma/verbs.c    |    3 ++-
 3 files changed, 17 insertions(+), 13 deletions(-)

--
Chuck Lever

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler()
  2020-04-20  0:02 [PATCH v1 0/3] NFS/RDMA client patches for v5.7-rc Chuck Lever
@ 2020-04-20  0:03 ` Chuck Lever
  2020-04-20  0:03 ` [PATCH 2/3] xprtrdma: Fix trace point use-after-free race Chuck Lever
  2020-04-20  0:03 ` [PATCH 3/3] xprtrdma: Fix use of xdr_stream_encode_item_{present, absent} Chuck Lever
  2 siblings, 0 replies; 4+ messages in thread
From: Chuck Lever @ 2020-04-20  0:03 UTC (permalink / raw)
  To: anna.schumaker; +Cc: linux-rdma, linux-nfs

Commit e28ce90083f0 ("xprtrdma: kmalloc rpcrdma_ep separate from
rpcrdma_xprt") erroneously removed a xprt_force_disconnect()
call from the "transport disconnect" path. The result was that the
client no longer responded to server-side disconnect requests.

Restore that call.

Fixes: e28ce90083f0 ("xprtrdma: kmalloc rpcrdma_ep separate from rpcrdma_xprt")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/xprtrdma/verbs.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index cdd84c09df10..29ae982d69cf 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -289,6 +289,7 @@ static void rpcrdma_update_cm_private(struct rpcrdma_ep *ep,
 	case RDMA_CM_EVENT_DISCONNECTED:
 		ep->re_connect_status = -ECONNABORTED;
 disconnected:
+		xprt_force_disconnect(xprt);
 		return rpcrdma_ep_destroy(ep);
 	default:
 		break;


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] xprtrdma: Fix trace point use-after-free race
  2020-04-20  0:02 [PATCH v1 0/3] NFS/RDMA client patches for v5.7-rc Chuck Lever
  2020-04-20  0:03 ` [PATCH 1/3] xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler() Chuck Lever
@ 2020-04-20  0:03 ` Chuck Lever
  2020-04-20  0:03 ` [PATCH 3/3] xprtrdma: Fix use of xdr_stream_encode_item_{present, absent} Chuck Lever
  2 siblings, 0 replies; 4+ messages in thread
From: Chuck Lever @ 2020-04-20  0:03 UTC (permalink / raw)
  To: anna.schumaker; +Cc: linux-rdma, linux-nfs

It's not safe to use resources pointed to by the @send_wr of
ib_post_send() _after_ that function returns. Those resources are
typically freed by the Send completion handler, which can run before
ib_post_send() returns.

Thus the trace points currently around ib_post_send() in the
client's RPC/RDMA transport are a hazard, even when they are
disabled. Rearrange them so that they touch the Work Request only
_before_ ib_post_send() is invoked.

Fixes: ab03eff58eb5 ("xprtrdma: Add trace points in RPC Call transmit paths")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 include/trace/events/rpcrdma.h |   12 ++++--------
 net/sunrpc/xprtrdma/verbs.c    |    2 +-
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/include/trace/events/rpcrdma.h b/include/trace/events/rpcrdma.h
index 051f26fedc4d..72f043876019 100644
--- a/include/trace/events/rpcrdma.h
+++ b/include/trace/events/rpcrdma.h
@@ -692,11 +692,10 @@
 
 TRACE_EVENT(xprtrdma_post_send,
 	TP_PROTO(
-		const struct rpcrdma_req *req,
-		int status
+		const struct rpcrdma_req *req
 	),
 
-	TP_ARGS(req, status),
+	TP_ARGS(req),
 
 	TP_STRUCT__entry(
 		__field(const void *, req)
@@ -705,7 +704,6 @@
 		__field(unsigned int, client_id)
 		__field(int, num_sge)
 		__field(int, signaled)
-		__field(int, status)
 	),
 
 	TP_fast_assign(
@@ -718,15 +716,13 @@
 		__entry->sc = req->rl_sendctx;
 		__entry->num_sge = req->rl_wr.num_sge;
 		__entry->signaled = req->rl_wr.send_flags & IB_SEND_SIGNALED;
-		__entry->status = status;
 	),
 
-	TP_printk("task:%u@%u req=%p sc=%p (%d SGE%s) %sstatus=%d",
+	TP_printk("task:%u@%u req=%p sc=%p (%d SGE%s) %s",
 		__entry->task_id, __entry->client_id,
 		__entry->req, __entry->sc, __entry->num_sge,
 		(__entry->num_sge == 1 ? "" : "s"),
-		(__entry->signaled ? "signaled " : ""),
-		__entry->status
+		(__entry->signaled ? "signaled" : "")
 	)
 );
 
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
index 29ae982d69cf..05c4d3a9cda2 100644
--- a/net/sunrpc/xprtrdma/verbs.c
+++ b/net/sunrpc/xprtrdma/verbs.c
@@ -1356,8 +1356,8 @@ int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req)
 		--ep->re_send_count;
 	}
 
+	trace_xprtrdma_post_send(req);
 	rc = frwr_send(r_xprt, req);
-	trace_xprtrdma_post_send(req, rc);
 	if (rc)
 		return -ENOTCONN;
 	return 0;


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] xprtrdma: Fix use of xdr_stream_encode_item_{present, absent}
  2020-04-20  0:02 [PATCH v1 0/3] NFS/RDMA client patches for v5.7-rc Chuck Lever
  2020-04-20  0:03 ` [PATCH 1/3] xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler() Chuck Lever
  2020-04-20  0:03 ` [PATCH 2/3] xprtrdma: Fix trace point use-after-free race Chuck Lever
@ 2020-04-20  0:03 ` Chuck Lever
  2 siblings, 0 replies; 4+ messages in thread
From: Chuck Lever @ 2020-04-20  0:03 UTC (permalink / raw)
  To: anna.schumaker; +Cc: linux-rdma, linux-nfs

These new helpers do not return 0 on success, they return the
encoded size. Thus they are not a drop-in replacement for the
old helpers.

Fixes: 5c266df52701 ("SUNRPC: Add encoders for list item discriminators")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 net/sunrpc/xprtrdma/rpc_rdma.c |   15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c
index 4a81e6995d3e..3c627dc685cc 100644
--- a/net/sunrpc/xprtrdma/rpc_rdma.c
+++ b/net/sunrpc/xprtrdma/rpc_rdma.c
@@ -388,7 +388,9 @@ static int rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
 	} while (nsegs);
 
 done:
-	return xdr_stream_encode_item_absent(xdr);
+	if (xdr_stream_encode_item_absent(xdr) < 0)
+		return -EMSGSIZE;
+	return 0;
 }
 
 /* Register and XDR encode the Write list. Supports encoding a list
@@ -454,7 +456,9 @@ static int rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt,
 	*segcount = cpu_to_be32(nchunks);
 
 done:
-	return xdr_stream_encode_item_absent(xdr);
+	if (xdr_stream_encode_item_absent(xdr) < 0)
+		return -EMSGSIZE;
+	return 0;
 }
 
 /* Register and XDR encode the Reply chunk. Supports encoding an array
@@ -480,8 +484,11 @@ static int rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt,
 	int nsegs, nchunks;
 	__be32 *segcount;
 
-	if (wtype != rpcrdma_replych)
-		return xdr_stream_encode_item_absent(xdr);
+	if (wtype != rpcrdma_replych) {
+		if (xdr_stream_encode_item_absent(xdr) < 0)
+			return -EMSGSIZE;
+		return 0;
+	}
 
 	seg = req->rl_segments;
 	nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg);


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-04-20  0:03 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-20  0:02 [PATCH v1 0/3] NFS/RDMA client patches for v5.7-rc Chuck Lever
2020-04-20  0:03 ` [PATCH 1/3] xprtrdma: Restore wake-up-all to rpcrdma_cm_event_handler() Chuck Lever
2020-04-20  0:03 ` [PATCH 2/3] xprtrdma: Fix trace point use-after-free race Chuck Lever
2020-04-20  0:03 ` [PATCH 3/3] xprtrdma: Fix use of xdr_stream_encode_item_{present, absent} Chuck Lever

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.