mirror of https://gitee.com/openkylin/linux.git
xprtrdma: Introduce Send completion IDs
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>
This commit is contained in:
parent
af5865d278
commit
b2e7467f26
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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[];
|
||||
|
|
Loading…
Reference in New Issue