On 2020/02/15 9:58, Chaitanya Kulkarni wrote: > This patch adds two new tracpoints for null_blk_zoned.c that allows us > to trace report-zones, zone-mgmt-op and zone-write operations which has > direct effect on the zone condition state machine. > > Also, we update drivers/block/Makefile so that new null_blk related > tracefiles can be compiled. > > Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@xxxxxxx> > --- > drivers/block/Makefile | 3 ++ > drivers/block/null_blk_trace.c | 20 +++++++++ > drivers/block/null_blk_trace.h | 78 ++++++++++++++++++++++++++++++++++ > 3 files changed, 101 insertions(+) > create mode 100644 drivers/block/null_blk_trace.c > create mode 100644 drivers/block/null_blk_trace.h > > diff --git a/drivers/block/Makefile b/drivers/block/Makefile > index a53cc1e3a2d3..b05aa413f7c0 100644 > --- a/drivers/block/Makefile > +++ b/drivers/block/Makefile > @@ -6,6 +6,8 @@ > # Rewritten to use lists instead of if-statements. > # > > +ccflags-y += -I$(src) > + > obj-$(CONFIG_MAC_FLOPPY) += swim3.o > obj-$(CONFIG_BLK_DEV_SWIM) += swim_mod.o > obj-$(CONFIG_BLK_DEV_FD) += floppy.o > @@ -39,6 +41,7 @@ obj-$(CONFIG_ZRAM) += zram/ > > obj-$(CONFIG_BLK_DEV_NULL_BLK) += null_blk.o > null_blk-objs := null_blk_main.o > +null_blk-$(CONFIG_TRACING) += null_blk_trace.o Since the traces are for zoned operations only, why compile this if CONFIG_BLK_DEV_ZONED is not enabled ? > null_blk-$(CONFIG_BLK_DEV_ZONED) += null_blk_zoned.o > > skd-y := skd_main.o > diff --git a/drivers/block/null_blk_trace.c b/drivers/block/null_blk_trace.c > new file mode 100644 > index 000000000000..bd066130ff39 > --- /dev/null > +++ b/drivers/block/null_blk_trace.c > @@ -0,0 +1,20 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +/* > + * All trace related helpers for null_blk goes here. > + */ > +#include "null_blk_trace.h" > + > +/* > + * Helper to use for all null_blk traces to extract disk name. > + */ > +const char *nullb_trace_disk_name(struct trace_seq *p, char *name) > +{ > + const char *ret = trace_seq_buffer_ptr(p); > + > + if (name && *name) > + trace_seq_printf(p, "disk=%s, ", name); > + trace_seq_putc(p, 0); > + > + return ret; > +} > diff --git a/drivers/block/null_blk_trace.h b/drivers/block/null_blk_trace.h > new file mode 100644 > index 000000000000..8171bc26f6d1 > --- /dev/null > +++ b/drivers/block/null_blk_trace.h > @@ -0,0 +1,78 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * null_blk device driver tracepoints. > + */ > + > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM nullb > + > +#if !defined(_TRACE_NULLB_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_NULLB_H > + > +#include <linux/tracepoint.h> > +#include <linux/trace_seq.h> > + > +#include "null_blk.h" > + > +const char *nullb_trace_disk_name(struct trace_seq *p, char *name); > + > +#define __print_disk_name(name) \ > + nullb_trace_disk_name(p, name) > + > +#ifndef TRACE_HEADER_MULTI_READ > +static inline void __assign_disk_name(char *name, struct gendisk *disk) > +{ > + if (disk) > + memcpy(name, disk->disk_name, DISK_NAME_LEN); > + else > + memset(name, 0, DISK_NAME_LEN); > +} > +#endif > + > +TRACE_EVENT(nullb_zone_op, > + TP_PROTO(struct nullb_cmd *cmd, unsigned int zone_no, > + unsigned int zone_cond), > + TP_ARGS(cmd, zone_no, zone_cond), > + TP_STRUCT__entry( > + __array(char, disk, DISK_NAME_LEN) > + __field(enum req_opf, op) > + __field(unsigned int, zone_no) > + __field(unsigned int, zone_cond) > + ), > + TP_fast_assign( > + __entry->op = req_op(cmd->rq); > + __entry->zone_no = zone_no; > + __entry->zone_cond = zone_cond; > + __assign_disk_name(__entry->disk, cmd->rq->rq_disk); > + ), > + TP_printk("%s req=%-15s zone_no=%u zone_cond=%-10s", > + __print_disk_name(__entry->disk), > + blk_op_str(__entry->op), > + __entry->zone_no, > + blk_zone_cond_str(__entry->zone_cond)) > +); > + > +TRACE_EVENT(nullb_report_zones, > + TP_PROTO(struct nullb *nullb, unsigned int nr_zones), > + TP_ARGS(nullb, nr_zones), > + TP_STRUCT__entry( > + __array(char, disk, DISK_NAME_LEN) > + __field(unsigned int, nr_zones) > + ), > + TP_fast_assign( > + __entry->nr_zones = nr_zones; > + __assign_disk_name(__entry->disk, nullb->disk); > + ), > + TP_printk("%s nr_zones=%u", > + __print_disk_name(__entry->disk), __entry->nr_zones) > +); > + > +#endif /* _TRACE_NULLB_H */ > + > +#undef TRACE_INCLUDE_PATH > +#define TRACE_INCLUDE_PATH . > +#undef TRACE_INCLUDE_FILE > +#define TRACE_INCLUDE_FILE null_blk_trace > + > +/* This part must be outside protection */ > +#include <trace/define_trace.h> > -- Damien Le Moal Western Digital Research