Commit c16762b7 authored by Santosh Pradhan's avatar Santosh Pradhan Committed by Leon Romanovsky
Browse files

RDMA/rtrs-srv: Add event tracing support

Add event tracing mechanism for following routines:
- send_io_resp_imm()

How to use:
1. Load the rtrs_server module
2. cd /sys/kernel/debug/tracing
3. If all the events need to be enabled:
        echo 1 > events/rtrs_srv/enable
4. OR only speific routine/event needs to be enabled e.g.
        echo 1 > events/rtrs_srv/send_io_resp_imm/enable
5. cat trace
6. Run some I/O workload which can trigger send_io_resp_imm()

Link: https://lore.kernel.org/r/20220818105240.110234-3-haris.iqbal@ionos.com


Signed-off-by: default avatarSantosh Pradhan <santosh.pradhan@ionos.com>
Signed-off-by: default avatarJack Wang <jinpu.wang@ionos.com>
Signed-off-by: default avatarMd Haris Iqbal <haris.iqbal@ionos.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
parent 5a93929d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -7,9 +7,12 @@ rtrs-client-y := rtrs-clt.o \
		  rtrs-clt-sysfs.o \
		  rtrs-clt-trace.o

CFLAGS_rtrs-srv-trace.o = -I$(src)

rtrs-server-y := rtrs-srv.o \
		  rtrs-srv-stats.o \
		  rtrs-srv-sysfs.o
		  rtrs-srv-sysfs.o \
		  rtrs-srv-trace.o

rtrs-core-y := rtrs.o

+16 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0+
/*
 * RDMA Network Block Driver
 *
 * Copyright (c) 2022 1&1 IONOS SE. All rights reserved.
 */
#include "rtrs.h"
#include "rtrs-pri.h"
#include "rtrs-srv.h"

/*
 * We include this last to have the helpers above available for the trace
 * event implementations.
 */
#define CREATE_TRACE_POINTS
#include "rtrs-srv-trace.h"
+88 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * RDMA Network Block Driver
 *
 * Copyright (c) 2022 1&1 IONOS SE. All rights reserved.
 */
#undef TRACE_SYSTEM
#define TRACE_SYSTEM rtrs_srv

#if !defined(_TRACE_RTRS_SRV_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_RTRS_SRV_H

#include <linux/tracepoint.h>

struct rtrs_srv_op;
struct rtrs_srv_con;
struct rtrs_srv_path;

TRACE_DEFINE_ENUM(RTRS_SRV_CONNECTING);
TRACE_DEFINE_ENUM(RTRS_SRV_CONNECTED);
TRACE_DEFINE_ENUM(RTRS_SRV_CLOSING);
TRACE_DEFINE_ENUM(RTRS_SRV_CLOSED);

#define show_rtrs_srv_state(x) \
	__print_symbolic(x, \
		{ RTRS_SRV_CONNECTING,	"CONNECTING" }, \
		{ RTRS_SRV_CONNECTED,	"CONNECTED" }, \
		{ RTRS_SRV_CLOSING,	"CLOSING" }, \
		{ RTRS_SRV_CLOSED,	"CLOSED" })

TRACE_EVENT(send_io_resp_imm,
	TP_PROTO(struct rtrs_srv_op *id,
		 bool need_inval,
		 bool always_invalidate,
		 int errno),

	TP_ARGS(id, need_inval, always_invalidate, errno),

	TP_STRUCT__entry(
		__field(u8, dir)
		__field(bool, need_inval)
		__field(bool, always_invalidate)
		__field(u32, msg_id)
		__field(int, wr_cnt)
		__field(u32, signal_interval)
		__field(int, state)
		__field(int, errno)
		__array(char, sessname, NAME_MAX)
	),

	TP_fast_assign(
		struct rtrs_srv_con *con = id->con;
		struct rtrs_path *s = con->c.path;
		struct rtrs_srv_path *srv_path = to_srv_path(s);

		__entry->dir = id->dir;
		__entry->state = srv_path->state;
		__entry->errno = errno;
		__entry->need_inval = need_inval;
		__entry->always_invalidate = always_invalidate;
		__entry->msg_id = id->msg_id;
		__entry->wr_cnt = atomic_read(&con->c.wr_cnt);
		__entry->signal_interval = s->signal_interval;
		memcpy(__entry->sessname, kobject_name(&srv_path->kobj), NAME_MAX);
	),

	TP_printk("sess='%s' state='%s' dir=%s err='%d' inval='%d' glob-inval='%d' msgid='%u' wrcnt='%d' sig-interval='%u'",
		   __entry->sessname,
		   show_rtrs_srv_state(__entry->state),
		   __print_symbolic(__entry->dir,
			 { READ,  "READ" },
			 { WRITE, "WRITE" }),
		   __entry->errno,
		   __entry->need_inval,
		   __entry->always_invalidate,
		   __entry->msg_id,
		   __entry->wr_cnt,
		   __entry->signal_interval
	)
);

#endif /* _TRACE_RTRS_SRV_H */

#undef TRACE_INCLUDE_PATH
#define TRACE_INCLUDE_PATH .
#define TRACE_INCLUDE_FILE rtrs-srv-trace
#include <trace/define_trace.h>
+3 −5
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include "rtrs-log.h"
#include <rdma/ib_cm.h>
#include <rdma/ib_verbs.h>
#include "rtrs-srv-trace.h"

MODULE_DESCRIPTION("RDMA Transport Server");
MODULE_LICENSE("GPL");
@@ -57,11 +58,6 @@ static inline struct rtrs_srv_con *to_srv_con(struct rtrs_con *c)
	return container_of(c, struct rtrs_srv_con, c);
}

static inline struct rtrs_srv_path *to_srv_path(struct rtrs_path *s)
{
	return container_of(s, struct rtrs_srv_path, s);
}

static bool rtrs_srv_change_state(struct rtrs_srv_path *srv_path,
				  enum rtrs_srv_state new_state)
{
@@ -375,6 +371,8 @@ static int send_io_resp_imm(struct rtrs_srv_con *con, struct rtrs_srv_op *id,
		}
	}

	trace_send_io_resp_imm(id, need_inval, always_invalidate, errno);

	if (need_inval && always_invalidate) {
		wr = &inv_wr;
		inv_wr.next = &rwr.wr;
+5 −0
Original line number Diff line number Diff line
@@ -91,6 +91,11 @@ struct rtrs_srv_path {
	struct rtrs_srv_stats	*stats;
};

static inline struct rtrs_srv_path *to_srv_path(struct rtrs_path *s)
{
	return container_of(s, struct rtrs_srv_path, s);
}

struct rtrs_srv_sess {
	struct list_head	paths_list;
	int			paths_up;