svcrdma: Introduce infrastructure to support completion IDs

The goal is to replace CQE kernel memory addresses in completion-
related tracepoints.

Each completion ID matches an incoming Send or Receive completion
to a Completion Queue and to a previous ib_post_*(). The ID can
then be displayed in an error message or recorded in a trace
record.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Chuck Lever 2020-05-19 09:30:32 -04:00
parent 379c3bc6b4
commit f7bd657b55
2 changed files with 67 additions and 0 deletions

View File

@ -0,0 +1,24 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* * Copyright (c) 2020, Oracle and/or its affiliates.
*/
#ifndef RPC_RDMA_CID_H
#define RPC_RDMA_CID_H
/*
* The rpc_rdma_cid struct records completion ID information. A
* completion ID matches an incoming Send or Receive completion
* to a Completion Queue and to a previous ib_post_*(). The ID
* can then be displayed in an error message or recorded in a
* trace record.
*
* This struct is shared between the server and client RPC/RDMA
* transport implementations.
*/
struct rpc_rdma_cid {
u32 ci_queue_id;
int ci_completion_id;
};
#endif /* RPC_RDMA_CID_H */

View File

@ -11,6 +11,7 @@
#define _TRACE_RPCRDMA_H
#include <linux/scatterlist.h>
#include <linux/sunrpc/rpc_rdma_cid.h>
#include <linux/tracepoint.h>
#include <trace/events/rdma.h>
@ -18,6 +19,48 @@
** Event classes
**/
DECLARE_EVENT_CLASS(rpcrdma_completion_class,
TP_PROTO(
const struct ib_wc *wc,
const struct rpc_rdma_cid *cid
),
TP_ARGS(wc, cid),
TP_STRUCT__entry(
__field(u32, cq_id)
__field(int, completion_id)
__field(unsigned long, status)
__field(unsigned int, vendor_err)
),
TP_fast_assign(
__entry->cq_id = cid->ci_queue_id;
__entry->completion_id = cid->ci_completion_id;
__entry->status = wc->status;
if (wc->status)
__entry->vendor_err = wc->vendor_err;
else
__entry->vendor_err = 0;
),
TP_printk("cq.id=%u cid=%d status=%s (%lu/0x%x)",
__entry->cq_id, __entry->completion_id,
rdma_show_wc_status(__entry->status),
__entry->status, __entry->vendor_err
)
);
#define DEFINE_COMPLETION_EVENT(name) \
DEFINE_EVENT(rpcrdma_completion_class, name, \
TP_PROTO( \
const struct ib_wc *wc, \
const struct rpc_rdma_cid *cid \
), \
TP_ARGS(wc, cid))
DEFINE_COMPLETION_EVENT(dummy);
DECLARE_EVENT_CLASS(xprtrdma_reply_event,
TP_PROTO(
const struct rpcrdma_rep *rep