Commit f7bd657b authored by Chuck Lever's avatar Chuck Lever
Browse files

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: default avatarChuck Lever <chuck.lever@oracle.com>
parent 379c3bc6
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
/* 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 */
+43 −0
Original line number Diff line number Diff line
@@ -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