xprtrdma: Introduce Send completion IDs
authorChuck Lever <chuck.lever@oracle.com>
Mon, 9 Nov 2020 19:39:26 +0000 (14:39 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 11 Nov 2020 15:21:12 +0000 (10:21 -0500)
Set up a completion ID in each rpcrdma_req. The ID is used to match
an incoming Send completion to a transport and to a previous
ib_post_send().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
include/trace/events/rpcrdma.h
net/sunrpc/xprtrdma/verbs.c
net/sunrpc/xprtrdma/xprt_rdma.h

index 1c91c8e721e71373f07ed0d802ecc1c8f721bbac..ab239f4f924e8facc3d3ead5f704c8861f951b4f 100644 (file)
@@ -735,8 +735,8 @@ TRACE_EVENT(xprtrdma_post_send,
        TP_ARGS(req),
 
        TP_STRUCT__entry(
-               __field(const void *, req)
-               __field(const void *, sc)
+               __field(u32, cq_id)
+               __field(int, completion_id)
                __field(unsigned int, task_id)
                __field(unsigned int, client_id)
                __field(int, num_sge)
@@ -745,20 +745,21 @@ TRACE_EVENT(xprtrdma_post_send,
 
        TP_fast_assign(
                const struct rpc_rqst *rqst = &req->rl_slot;
+               const struct rpcrdma_sendctx *sc = req->rl_sendctx;
 
+               __entry->cq_id = sc->sc_cid.ci_queue_id;
+               __entry->completion_id = sc->sc_cid.ci_completion_id;
                __entry->task_id = rqst->rq_task->tk_pid;
                __entry->client_id = rqst->rq_task->tk_client ?
                                     rqst->rq_task->tk_client->cl_clid : -1;
-               __entry->req = req;
-               __entry->sc = req->rl_sendctx;
                __entry->num_sge = req->rl_wr.num_sge;
                __entry->signaled = req->rl_wr.send_flags & IB_SEND_SIGNALED;
        ),
 
-       TP_printk("task:%u@%u req=%p sc=%p (%d SGE%s) %s",
+       TP_printk("task:%u@%u cq.id=%u cid=%d (%d SGE%s) %s",
                __entry->task_id, __entry->client_id,
-               __entry->req, __entry->sc, __entry->num_sge,
-               (__entry->num_sge == 1 ? "" : "s"),
+               __entry->cq_id, __entry->completion_id,
+               __entry->num_sge, (__entry->num_sge == 1 ? "" : "s"),
                (__entry->signaled ? "signaled" : "")
        )
 );
@@ -848,37 +849,7 @@ TRACE_EVENT(xprtrdma_post_linv,
  **/
 
 DEFINE_COMPLETION_EVENT(xprtrdma_wc_receive);
-
-TRACE_EVENT(xprtrdma_wc_send,
-       TP_PROTO(
-               const struct rpcrdma_sendctx *sc,
-               const struct ib_wc *wc
-       ),
-
-       TP_ARGS(sc, wc),
-
-       TP_STRUCT__entry(
-               __field(const void *, req)
-               __field(const void *, sc)
-               __field(unsigned int, unmap_count)
-               __field(unsigned int, status)
-               __field(unsigned int, vendor_err)
-       ),
-
-       TP_fast_assign(
-               __entry->req = sc->sc_req;
-               __entry->sc = sc;
-               __entry->unmap_count = sc->sc_unmap_count;
-               __entry->status = wc->status;
-               __entry->vendor_err = __entry->status ? wc->vendor_err : 0;
-       ),
-
-       TP_printk("req=%p sc=%p unmapped=%u: %s (%u/0x%x)",
-               __entry->req, __entry->sc, __entry->unmap_count,
-               rdma_show_wc_status(__entry->status),
-               __entry->status, __entry->vendor_err
-       )
-);
+DEFINE_COMPLETION_EVENT(xprtrdma_wc_send);
 
 DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
 DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
index 2c8d2801ec4f25e5ae067e14f573927591b79bb5..63837b5d14e5867c6d4d3592f5660982eeab7a37 100644 (file)
@@ -167,7 +167,7 @@ static void rpcrdma_wc_send(struct ib_cq *cq, struct ib_wc *wc)
        struct rpcrdma_xprt *r_xprt = cq->cq_context;
 
        /* WARNING: Only wr_cqe and status are reliable at this point */
-       trace_xprtrdma_wc_send(sc, wc);
+       trace_xprtrdma_wc_send(wc, &sc->sc_cid);
        rpcrdma_sendctx_put_locked(r_xprt, sc);
        rpcrdma_flush_disconnect(r_xprt, wc);
 }
@@ -643,6 +643,9 @@ static struct rpcrdma_sendctx *rpcrdma_sendctx_create(struct rpcrdma_ep *ep)
                return NULL;
 
        sc->sc_cqe.done = rpcrdma_wc_send;
+       sc->sc_cid.ci_queue_id = ep->re_attr.send_cq->res.id;
+       sc->sc_cid.ci_completion_id =
+               atomic_inc_return(&ep->re_completion_ids);
        return sc;
 }
 
index b94940bc67aa03d9b6a85406f230eccbd93cc658..4eb8e32b9f4a482dd118b76d9452994126daaa1e 100644 (file)
@@ -216,6 +216,7 @@ enum {
 struct rpcrdma_req;
 struct rpcrdma_sendctx {
        struct ib_cqe           sc_cqe;
+       struct rpc_rdma_cid     sc_cid;
        struct rpcrdma_req      *sc_req;
        unsigned int            sc_unmap_count;
        struct ib_sge           sc_sges[];