FAILED: patch "[PATCH] xprtrdma: Fix trace point use-after-free race" failed to apply to 4.19-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From bdb2ce82818577ba6e57b7d68b698b8d17329281 Mon Sep 17 00:00:00 2001
From: Chuck Lever <[email protected]>
Date: Sun, 19 Apr 2020 20:03:05 -0400
Subject: [PATCH] xprtrdma: Fix trace point use-after-free race
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.
include/trace/events/rpcrdma.h +4 -8
@@ -692,11 +692,10 @@ TRACE_EVENT(xprtrdma_prepsend_failed, 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 @@ TRACE_EVENT(xprtrdma_post_send, __field(unsigned int, client_id) __field(int, num_sge) __field(int, signaled) - __field(int, status) ), TP_fast_assign(
@@ -718,15 +716,13 @@ TRACE_EVENT(xprtrdma_post_send, __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" :"" ) ) );
net/sunrpc/xprtrdma/verbs.c +1 -1
@@ -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 ;