Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

block/rnbd-srv: Add event tracing support

Add event tracing mechanism for following routines:
- create_sess()
- destroy_sess()
- process_rdma()
- process_msg_sess_info()
- process_msg_open()
- process_msg_close()

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

Signed-off-by: Santosh Pradhan <santosh.pradhan@ionos.com>
Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
Signed-off-by: Md Haris Iqbal <haris.iqbal@ionos.com>
Link: https://lore.kernel.org/r/20220818105551.110490-2-haris.iqbal@ionos.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Santosh Pradhan and committed by
Jens Axboe
74e237b6 c6ea7060

+241 -7
+4 -1
drivers/block/rnbd/Makefile
··· 6 6 rnbd-clt-sysfs.o \ 7 7 rnbd-common.o 8 8 9 + CFLAGS_rnbd-srv-trace.o = -I$(src) 10 + 9 11 rnbd-server-y := rnbd-common.o \ 10 12 rnbd-srv.o \ 11 13 rnbd-srv-dev.o \ 12 - rnbd-srv-sysfs.o 14 + rnbd-srv-sysfs.o \ 15 + rnbd-srv-trace.o 13 16 14 17 obj-$(CONFIG_BLK_DEV_RNBD_CLIENT) += rnbd-client.o 15 18 obj-$(CONFIG_BLK_DEV_RNBD_SERVER) += rnbd-server.o
+17
drivers/block/rnbd/rnbd-srv-trace.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #include "rtrs.h" 8 + #include "rtrs-srv.h" 9 + #include "rnbd-srv.h" 10 + #include "rnbd-proto.h" 11 + 12 + /* 13 + * We include this last to have the helpers above available for the trace 14 + * event implementations. 15 + */ 16 + #define CREATE_TRACE_POINTS 17 + #include "rnbd-srv-trace.h"
+207
drivers/block/rnbd/rnbd-srv-trace.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * RDMA Network Block Driver 4 + * 5 + * Copyright (c) 2022 1&1 IONOS SE. All rights reserved. 6 + */ 7 + #undef TRACE_SYSTEM 8 + #define TRACE_SYSTEM rnbd_srv 9 + 10 + #if !defined(_TRACE_RNBD_SRV_H) || defined(TRACE_HEADER_MULTI_READ) 11 + #define _TRACE_RNBD_SRV_H 12 + 13 + #include <linux/tracepoint.h> 14 + 15 + struct rnbd_srv_session; 16 + struct rtrs_srv_op; 17 + 18 + DECLARE_EVENT_CLASS(rnbd_srv_link_class, 19 + TP_PROTO(struct rnbd_srv_session *srv), 20 + 21 + TP_ARGS(srv), 22 + 23 + TP_STRUCT__entry( 24 + __field(int, qdepth) 25 + __string(sessname, srv->sessname) 26 + ), 27 + 28 + TP_fast_assign( 29 + __entry->qdepth = srv->queue_depth; 30 + __assign_str(sessname, srv->sessname); 31 + ), 32 + 33 + TP_printk("sessname: %s qdepth: %d", 34 + __get_str(sessname), 35 + __entry->qdepth 36 + ) 37 + ); 38 + 39 + #define DEFINE_LINK_EVENT(name) \ 40 + DEFINE_EVENT(rnbd_srv_link_class, name, \ 41 + TP_PROTO(struct rnbd_srv_session *srv), \ 42 + TP_ARGS(srv)) 43 + 44 + DEFINE_LINK_EVENT(create_sess); 45 + DEFINE_LINK_EVENT(destroy_sess); 46 + 47 + TRACE_DEFINE_ENUM(RNBD_OP_READ); 48 + TRACE_DEFINE_ENUM(RNBD_OP_WRITE); 49 + TRACE_DEFINE_ENUM(RNBD_OP_FLUSH); 50 + TRACE_DEFINE_ENUM(RNBD_OP_DISCARD); 51 + TRACE_DEFINE_ENUM(RNBD_OP_SECURE_ERASE); 52 + TRACE_DEFINE_ENUM(RNBD_F_SYNC); 53 + TRACE_DEFINE_ENUM(RNBD_F_FUA); 54 + 55 + #define show_rnbd_rw_flags(x) \ 56 + __print_flags(x, "|", \ 57 + { RNBD_OP_READ, "READ" }, \ 58 + { RNBD_OP_WRITE, "WRITE" }, \ 59 + { RNBD_OP_FLUSH, "FLUSH" }, \ 60 + { RNBD_OP_DISCARD, "DISCARD" }, \ 61 + { RNBD_OP_SECURE_ERASE, "SECURE_ERASE" }, \ 62 + { RNBD_F_SYNC, "SYNC" }, \ 63 + { RNBD_F_FUA, "FUA" }) 64 + 65 + TRACE_EVENT(process_rdma, 66 + TP_PROTO(struct rnbd_srv_session *srv, 67 + const struct rnbd_msg_io *msg, 68 + struct rtrs_srv_op *id, 69 + u32 datalen, 70 + size_t usrlen), 71 + 72 + TP_ARGS(srv, msg, id, datalen, usrlen), 73 + 74 + TP_STRUCT__entry( 75 + __string(sessname, srv->sessname) 76 + __field(u8, dir) 77 + __field(u8, ver) 78 + __field(u32, device_id) 79 + __field(u64, sector) 80 + __field(u32, flags) 81 + __field(u32, bi_size) 82 + __field(u16, ioprio) 83 + __field(u32, datalen) 84 + __field(size_t, usrlen) 85 + ), 86 + 87 + TP_fast_assign( 88 + __assign_str(sessname, srv->sessname); 89 + __entry->dir = id->dir; 90 + __entry->ver = srv->ver; 91 + __entry->device_id = le32_to_cpu(msg->device_id); 92 + __entry->sector = le64_to_cpu(msg->sector); 93 + __entry->bi_size = le32_to_cpu(msg->bi_size); 94 + __entry->flags = le32_to_cpu(msg->rw); 95 + __entry->ioprio = le16_to_cpu(msg->prio); 96 + __entry->datalen = datalen; 97 + __entry->usrlen = usrlen; 98 + ), 99 + 100 + TP_printk("I/O req: sess: %s, type: %s, ver: %d, devid: %u, sector: %llu, bsize: %u, flags: %s, ioprio: %d, datalen: %u, usrlen: %zu", 101 + __get_str(sessname), 102 + __print_symbolic(__entry->dir, 103 + { READ, "READ" }, 104 + { WRITE, "WRITE" }), 105 + __entry->ver, 106 + __entry->device_id, 107 + __entry->sector, 108 + __entry->bi_size, 109 + show_rnbd_rw_flags(__entry->flags), 110 + __entry->ioprio, 111 + __entry->datalen, 112 + __entry->usrlen 113 + ) 114 + ); 115 + 116 + TRACE_EVENT(process_msg_sess_info, 117 + TP_PROTO(struct rnbd_srv_session *srv, 118 + const struct rnbd_msg_sess_info *msg), 119 + 120 + TP_ARGS(srv, msg), 121 + 122 + TP_STRUCT__entry( 123 + __field(u8, proto_ver) 124 + __field(u8, clt_ver) 125 + __field(u8, srv_ver) 126 + __string(sessname, srv->sessname) 127 + ), 128 + 129 + TP_fast_assign( 130 + __entry->proto_ver = srv->ver; 131 + __entry->clt_ver = msg->ver; 132 + __entry->srv_ver = RNBD_PROTO_VER_MAJOR; 133 + __assign_str(sessname, srv->sessname); 134 + ), 135 + 136 + TP_printk("Session %s using proto-ver %d (clt-ver: %d, srv-ver: %d)", 137 + __get_str(sessname), 138 + __entry->proto_ver, 139 + __entry->clt_ver, 140 + __entry->srv_ver 141 + ) 142 + ); 143 + 144 + TRACE_DEFINE_ENUM(RNBD_ACCESS_RO); 145 + TRACE_DEFINE_ENUM(RNBD_ACCESS_RW); 146 + TRACE_DEFINE_ENUM(RNBD_ACCESS_MIGRATION); 147 + 148 + #define show_rnbd_access_mode(x) \ 149 + __print_symbolic(x, \ 150 + { RNBD_ACCESS_RO, "RO" }, \ 151 + { RNBD_ACCESS_RW, "RW" }, \ 152 + { RNBD_ACCESS_MIGRATION, "MIGRATION" }) 153 + 154 + TRACE_EVENT(process_msg_open, 155 + TP_PROTO(struct rnbd_srv_session *srv, 156 + const struct rnbd_msg_open *msg), 157 + 158 + TP_ARGS(srv, msg), 159 + 160 + TP_STRUCT__entry( 161 + __field(u8, access_mode) 162 + __string(sessname, srv->sessname) 163 + __string(dev_name, msg->dev_name) 164 + ), 165 + 166 + TP_fast_assign( 167 + __entry->access_mode = msg->access_mode; 168 + __assign_str(sessname, srv->sessname); 169 + __assign_str(dev_name, msg->dev_name); 170 + ), 171 + 172 + TP_printk("Open message received: session='%s' path='%s' access_mode=%s", 173 + __get_str(sessname), 174 + __get_str(dev_name), 175 + show_rnbd_access_mode(__entry->access_mode) 176 + ) 177 + ); 178 + 179 + TRACE_EVENT(process_msg_close, 180 + TP_PROTO(struct rnbd_srv_session *srv, 181 + const struct rnbd_msg_close *msg), 182 + 183 + TP_ARGS(srv, msg), 184 + 185 + TP_STRUCT__entry( 186 + __field(u32, device_id) 187 + __string(sessname, srv->sessname) 188 + ), 189 + 190 + TP_fast_assign( 191 + __entry->device_id = le32_to_cpu(msg->device_id); 192 + __assign_str(sessname, srv->sessname); 193 + ), 194 + 195 + TP_printk("Close message received: session='%s' device id='%d'", 196 + __get_str(sessname), 197 + __entry->device_id 198 + ) 199 + ); 200 + 201 + #endif /* _TRACE_RNBD_SRV_H */ 202 + 203 + #undef TRACE_INCLUDE_PATH 204 + #define TRACE_INCLUDE_PATH . 205 + #define TRACE_INCLUDE_FILE rnbd-srv-trace 206 + #include <trace/define_trace.h> 207 +
+13 -6
drivers/block/rnbd/rnbd-srv.c
··· 14 14 15 15 #include "rnbd-srv.h" 16 16 #include "rnbd-srv-dev.h" 17 + #include "rnbd-srv-trace.h" 17 18 18 19 MODULE_DESCRIPTION("RDMA Network Block Device Server"); 19 20 MODULE_LICENSE("GPL"); ··· 133 132 struct bio *bio; 134 133 short prio; 135 134 135 + trace_process_rdma(srv_sess, msg, id, datalen, usrlen); 136 + 136 137 priv = kmalloc(sizeof(*priv), GFP_KERNEL); 137 138 if (!priv) 138 139 return -ENOMEM; ··· 247 244 if (xa_empty(&srv_sess->index_idr)) 248 245 goto out; 249 246 247 + trace_destroy_sess(srv_sess); 248 + 250 249 mutex_lock(&srv_sess->lock); 251 250 xa_for_each(&srv_sess->index_idr, index, sess_dev) 252 251 rnbd_srv_destroy_dev_session_sysfs(sess_dev); ··· 294 289 strscpy(srv_sess->sessname, pathname, sizeof(srv_sess->sessname)); 295 290 296 291 rtrs_srv_set_sess_priv(rtrs, srv_sess); 292 + 293 + trace_create_sess(srv_sess); 297 294 298 295 return 0; 299 296 } ··· 345 338 { 346 339 const struct rnbd_msg_close *close_msg = usr; 347 340 struct rnbd_srv_sess_dev *sess_dev; 341 + 342 + trace_process_msg_close(srv_sess, close_msg); 348 343 349 344 sess_dev = rnbd_get_sess_dev(le32_to_cpu(close_msg->device_id), 350 345 srv_sess); ··· 652 643 struct rnbd_msg_sess_info_rsp *rsp = data; 653 644 654 645 srv_sess->ver = min_t(u8, sess_info_msg->ver, RNBD_PROTO_VER_MAJOR); 655 - pr_debug("Session %s using protocol version %d (client version: %d, server version: %d)\n", 656 - srv_sess->sessname, srv_sess->ver, 657 - sess_info_msg->ver, RNBD_PROTO_VER_MAJOR); 646 + 647 + trace_process_msg_sess_info(srv_sess, sess_info_msg); 658 648 659 649 rsp->hdr.type = cpu_to_le16(RNBD_MSG_SESS_INFO_RSP); 660 650 rsp->ver = srv_sess->ver; ··· 698 690 struct rnbd_dev *rnbd_dev; 699 691 struct rnbd_msg_open_rsp *rsp = data; 700 692 701 - pr_debug("Open message received: session='%s' path='%s' access_mode=%d\n", 702 - srv_sess->sessname, open_msg->dev_name, 703 - open_msg->access_mode); 693 + trace_process_msg_open(srv_sess, open_msg); 694 + 704 695 open_flags = FMODE_READ; 705 696 if (open_msg->access_mode != RNBD_ACCESS_RO) 706 697 open_flags |= FMODE_WRITE;