diff mbox series

[V3,2/3] null_blk: add tracepoint helpers for zoned mode

Message ID 20200325021629.15103-3-chaitanya.kulkarni@wdc.com (mailing list archive)
State New, archived
Headers show
Series null_blk: add tracepoints for zoned mode | expand

Commit Message

Chaitanya Kulkarni March 25, 2020, 2:16 a.m. UTC
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@wdc.com>
---
 drivers/block/Makefile         |  6 +++
 drivers/block/null_blk_trace.c | 21 +++++++++
 drivers/block/null_blk_trace.h | 79 ++++++++++++++++++++++++++++++++++
 3 files changed, 106 insertions(+)
 create mode 100644 drivers/block/null_blk_trace.c
 create mode 100644 drivers/block/null_blk_trace.h

Comments

Damien Le Moal March 25, 2020, 3:28 a.m. UTC | #1
On 2020/03/25 12:21, 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@wdc.com>

Looks good to me.

Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>


> ---
>  drivers/block/Makefile         |  6 +++
>  drivers/block/null_blk_trace.c | 21 +++++++++
>  drivers/block/null_blk_trace.h | 79 ++++++++++++++++++++++++++++++++++
>  3 files changed, 106 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..795facd8cf19 100644
> --- a/drivers/block/Makefile
> +++ b/drivers/block/Makefile
> @@ -6,6 +6,9 @@
>  # Rewritten to use lists instead of if-statements.
>  # 
>  
> +# needed for trace events
> +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 +42,9 @@ obj-$(CONFIG_ZRAM) += zram/
>  
>  obj-$(CONFIG_BLK_DEV_NULL_BLK)	+= null_blk.o
>  null_blk-objs	:= null_blk_main.o
> +ifeq ($(CONFIG_BLK_DEV_ZONED), y)
> +null_blk-$(CONFIG_TRACING) += null_blk_trace.o
> +endif
>  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..f246e7bff698
> --- /dev/null
> +++ b/drivers/block/null_blk_trace.c
> @@ -0,0 +1,21 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * null_blk trace related helpers.
> + *
> + * Copyright (C) 2020 Western Digital Corporation or its affiliates.
> + */
> +#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..4f83032eb544
> --- /dev/null
> +++ b/drivers/block/null_blk_trace.h
> @@ -0,0 +1,79 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * null_blk device driver tracepoints.
> + *
> + * Copyright (C) 2020 Western Digital Corporation or its affiliates.
> + */
> +
> +#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>
>
diff mbox series

Patch

diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index a53cc1e3a2d3..795facd8cf19 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -6,6 +6,9 @@ 
 # Rewritten to use lists instead of if-statements.
 # 
 
+# needed for trace events
+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 +42,9 @@  obj-$(CONFIG_ZRAM) += zram/
 
 obj-$(CONFIG_BLK_DEV_NULL_BLK)	+= null_blk.o
 null_blk-objs	:= null_blk_main.o
+ifeq ($(CONFIG_BLK_DEV_ZONED), y)
+null_blk-$(CONFIG_TRACING) += null_blk_trace.o
+endif
 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..f246e7bff698
--- /dev/null
+++ b/drivers/block/null_blk_trace.c
@@ -0,0 +1,21 @@ 
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * null_blk trace related helpers.
+ *
+ * Copyright (C) 2020 Western Digital Corporation or its affiliates.
+ */
+#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..4f83032eb544
--- /dev/null
+++ b/drivers/block/null_blk_trace.h
@@ -0,0 +1,79 @@ 
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * null_blk device driver tracepoints.
+ *
+ * Copyright (C) 2020 Western Digital Corporation or its affiliates.
+ */
+
+#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>