All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V4 0/5] block: improve print_req_error
@ 2019-06-19 17:12 Chaitanya Kulkarni
  2019-06-19 17:12 ` [PATCH V4 1/5] " Chaitanya Kulkarni
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:12 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

Hi,

This patch-series is based on the initial patch posted by
Christoph Hellwig <hch@lst.de>. While debugging the driver and block
layer this print message is very meaningful. Also, we centralize the
REQ_OP_XXX to the string conversion in the blk-core.c so that other
dependent subsystems can use this helper without having to duplicate
the code e.g. f2fs, blk-mq-debugfs.c.

Please consider this for 5.3.

In case someone is interested please find the test log for print_err_req
with null_blk, f2fs tracing and blk-mq-debugfs->blk_mq_debugfs_rq_show()
at the end of this patch.

Regards,
Chaitanya

Changes from V3:-

1. Use unsigned int for op parameter in the blk_op_str(). (Bart)
2. Keep Christoph's signed-off first in the first patch in the series.
   (Bart).
3. Merge patch 5-6. (Bart, Chao)
4. Just modify the show_bio_op() macro and with call to blk_op_str().
   (Chao).

Chaitanya Kulkarni (4):
  block: add centralize REQ_OP_XXX to string helper
  block: use blk_op_str() in blk-mq-debugfs.c
  block: update print_req_error()
  f2fs: use block layer helper for show_bio_op macro

Christoph Hellwig (1):
  block: improve print_req_error

 block/blk-core.c            | 55 ++++++++++++++++++++++++++++++++-----
 block/blk-mq-debugfs.c      | 24 +++-------------
 include/linux/blkdev.h      |  3 ++
 include/trace/events/f2fs.h | 11 +-------
 4 files changed, 56 insertions(+), 37 deletions(-)

A. Following is the sample error message with forced REQ_OP_WRITE,
   REQ_OP_WRITE_ZEROES and REQ_OP_DISCARD failure from modified
   null_blk for testing :-
------------------------------------------------------------------

[  489.013530] blk_update_request: I/O error, dev nullb0, sector 0 op 0x1:(WRITE) flags 0x8800 phys_seg 1 prio class 0
[  510.569833] blk_update_request: I/O error, dev nullb0, sector 0 op 0x9:(WRITE_ZEROES) flags 0x400800 phys_seg 0 prio class 0
[  557.009194] blk_update_request: I/O error, dev nullb0, sector 0 op 0x3:(DISCARD) flags 0x800 phys_seg 1 prio class 0

B. F2FS Tracing with this patch-series :-
-----------------------------------------
# 1. Format and mount device with f2fs :-
linux-block (for-next) # mkfs.f2fs -f  /dev/nvme0n1

	F2FS-tools: mkfs.f2fs Ver: 1.12.0 (2018-11-12)
        <snip>
	Info: format successful
linux-block (for-next) # mount /dev/nvme0n1 /mnt/nvme0n1

# 2.  Enable f2fs traces which are associated with the bio:-
linux-block (for-next) # cat /sys/kernel/debug/tracing/events/f2fs/f2fs_prepare_read_bio/enable
1
linux-block (for-next) # cat /sys/kernel/debug/tracing/events/f2fs/f2fs_prepare_write_bio/enable
1
linux-block (for-next) # cat /sys/kernel/debug/tracing/events/f2fs/f2fs_submit_page_bio/enable
1
linux-block (for-next) # cat /sys/kernel/debug/tracing/events/f2fs/f2fs_submit_read_bio/enable
1
linux-block (for-next) # cat /sys/kernel/debug/tracing/events/f2fs/f2fs_submit_write_bio/enable
1
# 3.  Issue I/O using dd(1) :-
linux-block (for-next) # dd of=/mnt/nvme0n1/data if=/dev/zero bs=4k count=100
100+0 records in
100+0 records out
409600 bytes (410 kB) copied, 0.00315802 s, 130 MB/s
linux-block (for-next) #
linux-block (for-next) #
# 4, Collect the trace
linux-block (for-next) # cat /sys/kernel/debug/tracing/trace_pipe
# 5. Following is the trimmed trace where we get rid of first few columns :-
f2fs_trace_pid: 103:  0 1af2 dd
f2fs_trace_ios: 103:  0    0 ----------------  3     0  2000         1600    1
f2fs_trace_pid: 103:  0  1e8 kworker/u24:5
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), DATA, sector = 53256, size = 4096
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), DATA, sector = 53256, size = 4096
f2fs_trace_ios: 103:  0 1ace ----------------  1     1   800         1a01    1
f2fs_trace_ios: 103:  0  1e8 ----------------  2     1   800         1401    1
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), NODE, sector = 40968, size = 4096
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), NODE, sector = 40968, size = 4096
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), NODE, sector = 45056, size = 4096
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(S), NODE, sector = 45056, size = 4096
f2fs_trace_ios: 103:  0 1ace ----------------  2     1   800         1600    1
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(S|M|P), META, sector = 8192, size = 8192
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(S|M|P), META, sector = 8192, size = 8192
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(S|M|P|PF|FUA), META_FLUSH, sector = 8208, size = 4096
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(S|M|P|PF|FUA), META_FLUSH, sector = 8208, size = 4096
f2fs_trace_ios: 103:  0  1e8 ----------------  3     1  3800          400    3
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(), DATA, sector = 53264, size = 40960
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(), DATA, sector = 53264, size = 40960
f2fs_trace_pid: 103:  0 1b16 dd
f2fs_trace_ios: 103:  0 1af2 ----------------  0     1 100000         1a02    a
f2fs_prepare_write_bio: dev = (259,0)/(259,0), rw = WRITE(), DATA, sector = 1064960, size = 409600
f2fs_submit_write_bio: dev = (259,0)/(259,0), rw = WRITE(), DATA, sector = 1064960, size = 409600

C. blk-mq-debugfs.c tests for __blk_mq_debugfs_rq_show() :-
-----------------------------------------------------------

# 1. Issue write-zeroes, disacrd and write operation on the null_blk
     with modified null_blk 

@@ -1180,6 +1207,20 @@ static blk_status_t null_handle_cmd(struct nullb_cmd *cmd)
                }
        }
+       /* just discard for write zeroes for now */
+       switch (req_op(cmd->rq)) {
+       case REQ_OP_DISCARD:
+               /* fall through */
+       case REQ_OP_WRITE_ZEROES:
+               mdelay(10000);
+               break;
+       case REQ_OP_WRITE:
+               mdelay(10000);
+       }
+
linux-block (for-next) # blkdiscard -z  -o 0 -l 40960 /dev/nullb0 
linux-block (for-next) # blkdiscard -o 0 -l 40960 /dev/nullb0 
linux-block (for-next) # dd if=/dev/zero of=/dev/nullb0 bs=4k count=1 oflag=direct

#2. Read the hctx busy file every second, each type of request should
    be block for 10 seconds and must appear in the hctx->busy file in
    the debugfs. This will lead to from block/blk-mq-debugfs.c : 
	{"busy", 0400, hctx_busy_show}
		hctx_show_busy_rq()
			__blk_mq_debugfs_rq_show()
				blk_op_str()

linux-block (for-next) # while [ 1 ]; do cat /sys/kernel/debug/block/nullb0/hctx0/busy ; sleep 1; done

0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000095104d0a {.op=WRITE_ZEROES, .cmd_flags=SYNC|NOUNMAP, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=48, .internal_tag=96}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000051de04b0 {.op=DISCARD, .cmd_flags=SYNC, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=47}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}
0000000037e18909 {.op=WRITE, .cmd_flags=SYNC|IDLE, .rq_flags=STARTED|ELVPRIV|IO_STAT|STATS, .state=in_flight, .tag=49, .internal_tag=97}


-- 
2.19.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH V4 1/5] block: improve print_req_error
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
@ 2019-06-19 17:12 ` Chaitanya Kulkarni
  2019-06-19 17:48   ` Bart Van Assche
  2019-06-19 17:12 ` [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper Chaitanya Kulkarni
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:12 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

From: Christoph Hellwig <hch@lst.de>

Print the calling function instead of print_req_error as a prefix, and
print the operation and op_flags separately instead of the whole field.

Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
---
 block/blk-core.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index 8340f69670d8..6753231b529b 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -167,18 +167,20 @@ int blk_status_to_errno(blk_status_t status)
 }
 EXPORT_SYMBOL_GPL(blk_status_to_errno);
 
-static void print_req_error(struct request *req, blk_status_t status)
+static void print_req_error(struct request *req, blk_status_t status,
+		const char *caller)
 {
 	int idx = (__force int)status;
 
 	if (WARN_ON_ONCE(idx >= ARRAY_SIZE(blk_errors)))
 		return;
 
-	printk_ratelimited(KERN_ERR "%s: %s error, dev %s, sector %llu flags %x\n",
-				__func__, blk_errors[idx].name,
-				req->rq_disk ?  req->rq_disk->disk_name : "?",
-				(unsigned long long)blk_rq_pos(req),
-				req->cmd_flags);
+	printk_ratelimited(KERN_ERR
+		"%s: %s error, dev %s, sector %llu op 0x%x flags 0x%x\n",
+		caller, blk_errors[idx].name,
+		req->rq_disk ?  req->rq_disk->disk_name : "?",
+		blk_rq_pos(req), req_op(req),
+		req->cmd_flags & ~REQ_OP_MASK);
 }
 
 static void req_bio_endio(struct request *rq, struct bio *bio,
@@ -1373,7 +1375,7 @@ bool blk_update_request(struct request *req, blk_status_t error,
 
 	if (unlikely(error && !blk_rq_is_passthrough(req) &&
 		     !(req->rq_flags & RQF_QUIET)))
-		print_req_error(req, error);
+		print_req_error(req, error, __func__);
 
 	blk_account_io_completion(req, nr_bytes);
 
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
  2019-06-19 17:12 ` [PATCH V4 1/5] " Chaitanya Kulkarni
@ 2019-06-19 17:12 ` Chaitanya Kulkarni
  2019-06-19 17:49   ` Bart Van Assche
  2019-06-19 17:13 ` [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c Chaitanya Kulkarni
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:12 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

In order to centralize the REQ_OP_XXX to string conversion which can be
used in the block layer and different places in the kernel like f2fs,
this patch adds a new helper function along with an array similar to the
one present in the blk-mq-debugfs.c.

We keep this helper functionality centralize under blk-core.c instead of
blk-mq-debugfs.c since blk-core.c is configured using CONFIG_BLOCK and
it will not be dependent on blk-mq-debugfs.c which is configured using
CONFIG_BLK_DEBUG_FS.

Next patch adjusts the code in the blk-mq-debugfs.c with newly
introduced helper.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
---
 block/blk-core.c       | 36 ++++++++++++++++++++++++++++++++++++
 include/linux/blkdev.h |  3 +++
 2 files changed, 39 insertions(+)

diff --git a/block/blk-core.c b/block/blk-core.c
index 6753231b529b..c92b5a16a27a 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -120,6 +120,42 @@ void blk_rq_init(struct request_queue *q, struct request *rq)
 }
 EXPORT_SYMBOL(blk_rq_init);
 
+#define REQ_OP_NAME(name) [REQ_OP_##name] = #name
+static const char *const blk_op_name[] = {
+	REQ_OP_NAME(READ),
+	REQ_OP_NAME(WRITE),
+	REQ_OP_NAME(FLUSH),
+	REQ_OP_NAME(DISCARD),
+	REQ_OP_NAME(SECURE_ERASE),
+	REQ_OP_NAME(ZONE_RESET),
+	REQ_OP_NAME(WRITE_SAME),
+	REQ_OP_NAME(WRITE_ZEROES),
+	REQ_OP_NAME(SCSI_IN),
+	REQ_OP_NAME(SCSI_OUT),
+	REQ_OP_NAME(DRV_IN),
+	REQ_OP_NAME(DRV_OUT),
+};
+#undef REQ_OP_NAME
+
+/**
+ * blk_op_str - Return string XXX in the REQ_OP_XXX.
+ * @op: REQ_OP_XXX.
+ *
+ * Description: Centralize block layer function to convert REQ_OP_XXX into
+ * string format. Useful in the debugging and tracing bio or request. For
+ * invalid REQ_OP_XXX it returns string "UNKNOWN".
+ */
+inline const char *blk_op_str(unsigned int op)
+{
+	const char *op_str = "UNKNOWN";
+
+	if (op < ARRAY_SIZE(blk_op_name) && blk_op_name[op])
+		op_str = blk_op_name[op];
+
+	return op_str;
+}
+EXPORT_SYMBOL_GPL(blk_op_str);
+
 static const struct {
 	int		errno;
 	const char	*name;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 592669bcc536..077a77a4a91c 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -867,6 +867,9 @@ extern void blk_execute_rq(struct request_queue *, struct gendisk *,
 extern void blk_execute_rq_nowait(struct request_queue *, struct gendisk *,
 				  struct request *, int, rq_end_io_fn *);
 
+/* Helper to convert REQ_OP_XXX to its string format XXX */
+extern const char *blk_op_str(unsigned int op);
+
 int blk_status_to_errno(blk_status_t status);
 blk_status_t errno_to_blk_status(int errno);
 
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
  2019-06-19 17:12 ` [PATCH V4 1/5] " Chaitanya Kulkarni
  2019-06-19 17:12 ` [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper Chaitanya Kulkarni
@ 2019-06-19 17:13 ` Chaitanya Kulkarni
  2019-06-19 17:50   ` Bart Van Assche
  2019-06-19 17:13 ` [PATCH V4 4/5] block: update print_req_error() Chaitanya Kulkarni
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:13 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

Now that we've a helper function blk_op_str() to convert the
REQ_OP_XXX to string XXX, adjust the code to use that. Get rid of
the duplicate array op_name which is now present in the blk-core.c
which we renamed it to "blk_op_name" and open coding in the
blk-mq-debugfs.c.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
---
 block/blk-mq-debugfs.c | 24 ++++--------------------
 1 file changed, 4 insertions(+), 20 deletions(-)

diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c
index f0550be60824..68b602d4d1b8 100644
--- a/block/blk-mq-debugfs.c
+++ b/block/blk-mq-debugfs.c
@@ -261,23 +261,6 @@ static int hctx_flags_show(void *data, struct seq_file *m)
 	return 0;
 }
 
-#define REQ_OP_NAME(name) [REQ_OP_##name] = #name
-static const char *const op_name[] = {
-	REQ_OP_NAME(READ),
-	REQ_OP_NAME(WRITE),
-	REQ_OP_NAME(FLUSH),
-	REQ_OP_NAME(DISCARD),
-	REQ_OP_NAME(SECURE_ERASE),
-	REQ_OP_NAME(ZONE_RESET),
-	REQ_OP_NAME(WRITE_SAME),
-	REQ_OP_NAME(WRITE_ZEROES),
-	REQ_OP_NAME(SCSI_IN),
-	REQ_OP_NAME(SCSI_OUT),
-	REQ_OP_NAME(DRV_IN),
-	REQ_OP_NAME(DRV_OUT),
-};
-#undef REQ_OP_NAME
-
 #define CMD_FLAG_NAME(name) [__REQ_##name] = #name
 static const char *const cmd_flag_name[] = {
 	CMD_FLAG_NAME(FAILFAST_DEV),
@@ -342,12 +325,13 @@ int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq)
 {
 	const struct blk_mq_ops *const mq_ops = rq->q->mq_ops;
 	const unsigned int op = rq->cmd_flags & REQ_OP_MASK;
+	const char *op_str = blk_op_str(op);
 
 	seq_printf(m, "%p {.op=", rq);
-	if (op < ARRAY_SIZE(op_name) && op_name[op])
-		seq_printf(m, "%s", op_name[op]);
-	else
+	if (strcmp(op_str, "UNKNOWN") == 0)
 		seq_printf(m, "%d", op);
+	else
+		seq_printf(m, "%s", op_str);
 	seq_puts(m, ", .cmd_flags=");
 	blk_flags_show(m, rq->cmd_flags & ~REQ_OP_MASK, cmd_flag_name,
 		       ARRAY_SIZE(cmd_flag_name));
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 4/5] block: update print_req_error()
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
                   ` (2 preceding siblings ...)
  2019-06-19 17:13 ` [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c Chaitanya Kulkarni
@ 2019-06-19 17:13 ` Chaitanya Kulkarni
  2019-06-20  5:07   ` Chaitanya Kulkarni
  2019-06-19 17:13 ` [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro Chaitanya Kulkarni
  2019-06-20  7:35 ` [PATCH V4 0/5] block: improve print_req_error Jens Axboe
  5 siblings, 1 reply; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:13 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

Improve the print_req_error with additional request fields which are
helpful for debugging. Use newly introduced blk_op_str() to print the
REQ_OP_XXX in the string format.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
---
 block/blk-core.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index c92b5a16a27a..88a716c3dc56 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -212,11 +212,14 @@ static void print_req_error(struct request *req, blk_status_t status,
 		return;
 
 	printk_ratelimited(KERN_ERR
-		"%s: %s error, dev %s, sector %llu op 0x%x flags 0x%x\n",
+		"%s: %s error, dev %s, sector %llu op 0x%x:(%s) flags 0x%x "
+		"phys_seg %u prio class %u\n",
 		caller, blk_errors[idx].name,
-		req->rq_disk ?  req->rq_disk->disk_name : "?",
-		blk_rq_pos(req), req_op(req),
-		req->cmd_flags & ~REQ_OP_MASK);
+		req->rq_disk ? req->rq_disk->disk_name : "?",
+		blk_rq_pos(req), req_op(req), blk_op_str(req_op(req)),
+		req->cmd_flags & ~REQ_OP_MASK,
+		req->nr_phys_segments,
+		IOPRIO_PRIO_CLASS(req->ioprio));
 }
 
 static void req_bio_endio(struct request *rq, struct bio *bio,
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
                   ` (3 preceding siblings ...)
  2019-06-19 17:13 ` [PATCH V4 4/5] block: update print_req_error() Chaitanya Kulkarni
@ 2019-06-19 17:13 ` Chaitanya Kulkarni
  2019-06-20  1:54   ` Chao Yu
  2019-06-20  7:35 ` [PATCH V4 0/5] block: improve print_req_error Jens Axboe
  5 siblings, 1 reply; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-19 17:13 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche, Chaitanya Kulkarni

Adjust the f2fs tracing code to use newly introduced block layer
function blk_op_str() which converts the REQ_OP_XXX into the string
XXX.

Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
---
 include/trace/events/f2fs.h | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 53b96f12300c..e3dc031af7f5 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -76,16 +76,7 @@ TRACE_DEFINE_ENUM(CP_TRIMMED);
 #define show_bio_type(op,op_flags)	show_bio_op(op),		\
 						show_bio_op_flags(op_flags)
 
-#define show_bio_op(op)							\
-	__print_symbolic(op,						\
-		{ REQ_OP_READ,			"READ" },		\
-		{ REQ_OP_WRITE,			"WRITE" },		\
-		{ REQ_OP_FLUSH,			"FLUSH" },		\
-		{ REQ_OP_DISCARD,		"DISCARD" },		\
-		{ REQ_OP_SECURE_ERASE,		"SECURE_ERASE" },	\
-		{ REQ_OP_ZONE_RESET,		"ZONE_RESET" },		\
-		{ REQ_OP_WRITE_SAME,		"WRITE_SAME" },		\
-		{ REQ_OP_WRITE_ZEROES,		"WRITE_ZEROES" })
+#define show_bio_op(op)		blk_op_str(op)
 
 #define show_bio_op_flags(flags)					\
 	__print_flags(F2FS_BIO_FLAG_MASK(flags), "|",			\
-- 
2.19.1


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 1/5] block: improve print_req_error
  2019-06-19 17:12 ` [PATCH V4 1/5] " Chaitanya Kulkarni
@ 2019-06-19 17:48   ` Bart Van Assche
  0 siblings, 0 replies; 13+ messages in thread
From: Bart Van Assche @ 2019-06-19 17:48 UTC (permalink / raw)
  To: Chaitanya Kulkarni, linux-block; +Cc: jaegeuk, yuchao0

On 6/19/19 10:12 AM, Chaitanya Kulkarni wrote:
> From: Christoph Hellwig <hch@lst.de>
> 
> Print the calling function instead of print_req_error as a prefix, and
> print the operation and op_flags separately instead of the whole field.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper
  2019-06-19 17:12 ` [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper Chaitanya Kulkarni
@ 2019-06-19 17:49   ` Bart Van Assche
  0 siblings, 0 replies; 13+ messages in thread
From: Bart Van Assche @ 2019-06-19 17:49 UTC (permalink / raw)
  To: Chaitanya Kulkarni, linux-block; +Cc: jaegeuk, yuchao0

On 6/19/19 10:12 AM, Chaitanya Kulkarni wrote:
> In order to centralize the REQ_OP_XXX to string conversion which can be
> used in the block layer and different places in the kernel like f2fs,
> this patch adds a new helper function along with an array similar to the
> one present in the blk-mq-debugfs.c.
> 
> We keep this helper functionality centralize under blk-core.c instead of
> blk-mq-debugfs.c since blk-core.c is configured using CONFIG_BLOCK and
> it will not be dependent on blk-mq-debugfs.c which is configured using
> CONFIG_BLK_DEBUG_FS.
> 
> Next patch adjusts the code in the blk-mq-debugfs.c with newly
> introduced helper.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c
  2019-06-19 17:13 ` [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c Chaitanya Kulkarni
@ 2019-06-19 17:50   ` Bart Van Assche
  0 siblings, 0 replies; 13+ messages in thread
From: Bart Van Assche @ 2019-06-19 17:50 UTC (permalink / raw)
  To: Chaitanya Kulkarni, linux-block; +Cc: jaegeuk, yuchao0

On 6/19/19 10:13 AM, Chaitanya Kulkarni wrote:
> Now that we've a helper function blk_op_str() to convert the
> REQ_OP_XXX to string XXX, adjust the code to use that. Get rid of
> the duplicate array op_name which is now present in the blk-core.c
> which we renamed it to "blk_op_name" and open coding in the
> blk-mq-debugfs.c.
> 
> Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> ---
>   block/blk-mq-debugfs.c | 24 ++++--------------------
>   1 file changed, 4 insertions(+), 20 deletions(-)
> 
> diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c
> index f0550be60824..68b602d4d1b8 100644
> --- a/block/blk-mq-debugfs.c
> +++ b/block/blk-mq-debugfs.c
> @@ -261,23 +261,6 @@ static int hctx_flags_show(void *data, struct seq_file *m)
>   	return 0;
>   }
>   
> -#define REQ_OP_NAME(name) [REQ_OP_##name] = #name
> -static const char *const op_name[] = {
> -	REQ_OP_NAME(READ),
> -	REQ_OP_NAME(WRITE),
> -	REQ_OP_NAME(FLUSH),
> -	REQ_OP_NAME(DISCARD),
> -	REQ_OP_NAME(SECURE_ERASE),
> -	REQ_OP_NAME(ZONE_RESET),
> -	REQ_OP_NAME(WRITE_SAME),
> -	REQ_OP_NAME(WRITE_ZEROES),
> -	REQ_OP_NAME(SCSI_IN),
> -	REQ_OP_NAME(SCSI_OUT),
> -	REQ_OP_NAME(DRV_IN),
> -	REQ_OP_NAME(DRV_OUT),
> -};
> -#undef REQ_OP_NAME
> -
>   #define CMD_FLAG_NAME(name) [__REQ_##name] = #name
>   static const char *const cmd_flag_name[] = {
>   	CMD_FLAG_NAME(FAILFAST_DEV),
> @@ -342,12 +325,13 @@ int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq)
>   {
>   	const struct blk_mq_ops *const mq_ops = rq->q->mq_ops;
>   	const unsigned int op = rq->cmd_flags & REQ_OP_MASK;
> +	const char *op_str = blk_op_str(op);
>   
>   	seq_printf(m, "%p {.op=", rq);
> -	if (op < ARRAY_SIZE(op_name) && op_name[op])
> -		seq_printf(m, "%s", op_name[op]);
> -	else
> +	if (strcmp(op_str, "UNKNOWN") == 0)
>   		seq_printf(m, "%d", op);
> +	else
> +		seq_printf(m, "%s", op_str);
>   	seq_puts(m, ", .cmd_flags=");
>   	blk_flags_show(m, rq->cmd_flags & ~REQ_OP_MASK, cmd_flag_name,
>   		       ARRAY_SIZE(cmd_flag_name));

Although I'm still not enthusiast about the strcmp(..., "UNKNOWN"):

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro
  2019-06-19 17:13 ` [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro Chaitanya Kulkarni
@ 2019-06-20  1:54   ` Chao Yu
  0 siblings, 0 replies; 13+ messages in thread
From: Chao Yu @ 2019-06-20  1:54 UTC (permalink / raw)
  To: Chaitanya Kulkarni, linux-block; +Cc: jaegeuk, bvanassche

On 2019/6/20 1:13, Chaitanya Kulkarni wrote:
> Adjust the f2fs tracing code to use newly introduced block layer
> function blk_op_str() which converts the REQ_OP_XXX into the string
> XXX.
> 
> Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>

Reviewed-by: Chao Yu <yuchao0@huawei.com>

Thanks,

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 4/5] block: update print_req_error()
  2019-06-19 17:13 ` [PATCH V4 4/5] block: update print_req_error() Chaitanya Kulkarni
@ 2019-06-20  5:07   ` Chaitanya Kulkarni
  0 siblings, 0 replies; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-20  5:07 UTC (permalink / raw)
  To: linux-block; +Cc: jaegeuk, yuchao0, bvanassche

Rest of the patches in this series are reviewed by Bart and Chao.

Can someone please take a look at this patch and provide some feedback ?
On 6/19/19 10:14 AM, Chaitanya Kulkarni wrote:
> Improve the print_req_error with additional request fields which are
> helpful for debugging. Use newly introduced blk_op_str() to print the
> REQ_OP_XXX in the string format.
> 
> Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> ---
>   block/blk-core.c | 11 +++++++----
>   1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/block/blk-core.c b/block/blk-core.c
> index c92b5a16a27a..88a716c3dc56 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -212,11 +212,14 @@ static void print_req_error(struct request *req, blk_status_t status,
>   		return;
>   
>   	printk_ratelimited(KERN_ERR
> -		"%s: %s error, dev %s, sector %llu op 0x%x flags 0x%x\n",
> +		"%s: %s error, dev %s, sector %llu op 0x%x:(%s) flags 0x%x "
> +		"phys_seg %u prio class %u\n",
>   		caller, blk_errors[idx].name,
> -		req->rq_disk ?  req->rq_disk->disk_name : "?",
> -		blk_rq_pos(req), req_op(req),
> -		req->cmd_flags & ~REQ_OP_MASK);
> +		req->rq_disk ? req->rq_disk->disk_name : "?",
> +		blk_rq_pos(req), req_op(req), blk_op_str(req_op(req)),
> +		req->cmd_flags & ~REQ_OP_MASK,
> +		req->nr_phys_segments,
> +		IOPRIO_PRIO_CLASS(req->ioprio));
>   }
>   
>   static void req_bio_endio(struct request *rq, struct bio *bio,
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 0/5] block: improve print_req_error
  2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
                   ` (4 preceding siblings ...)
  2019-06-19 17:13 ` [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro Chaitanya Kulkarni
@ 2019-06-20  7:35 ` Jens Axboe
  2019-06-20 18:01   ` Chaitanya Kulkarni
  5 siblings, 1 reply; 13+ messages in thread
From: Jens Axboe @ 2019-06-20  7:35 UTC (permalink / raw)
  To: Chaitanya Kulkarni, linux-block; +Cc: jaegeuk, yuchao0, bvanassche

On 6/19/19 11:12 AM, Chaitanya Kulkarni wrote:
> Hi,
> 
> This patch-series is based on the initial patch posted by
> Christoph Hellwig <hch@lst.de>. While debugging the driver and block
> layer this print message is very meaningful. Also, we centralize the
> REQ_OP_XXX to the string conversion in the blk-core.c so that other
> dependent subsystems can use this helper without having to duplicate
> the code e.g. f2fs, blk-mq-debugfs.c.
> 
> Please consider this for 5.3.

Something is wonky here. For 5.2, I just merged:

commit f9bc64a0f0f884036d76d71edeaafb994c5ceddf (origin/for-5.3/block)
Author: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Date:   Thu Jun 13 07:14:21 2019 -0700

    block: use req_op() to maintain consistency

and then you go and do something different for 5.3?

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH V4 0/5] block: improve print_req_error
  2019-06-20  7:35 ` [PATCH V4 0/5] block: improve print_req_error Jens Axboe
@ 2019-06-20 18:01   ` Chaitanya Kulkarni
  0 siblings, 0 replies; 13+ messages in thread
From: Chaitanya Kulkarni @ 2019-06-20 18:01 UTC (permalink / raw)
  To: Jens Axboe, linux-block; +Cc: jaegeuk, yuchao0, bvanassche

On 06/20/2019 12:35 AM, Jens Axboe wrote:
> On 6/19/19 11:12 AM, Chaitanya Kulkarni wrote:
>> Hi,
>>
>> This patch-series is based on the initial patch posted by
>> Christoph Hellwig <hch@lst.de>. While debugging the driver and block
>> layer this print message is very meaningful. Also, we centralize the
>> REQ_OP_XXX to the string conversion in the blk-core.c so that other
>> dependent subsystems can use this helper without having to duplicate
>> the code e.g. f2fs, blk-mq-debugfs.c.
>>
>> Please consider this for 5.3.
>
> Something is wonky here. For 5.2, I just merged:
>
> commit f9bc64a0f0f884036d76d71edeaafb994c5ceddf (origin/for-5.3/block)
> Author: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
> Date:   Thu Jun 13 07:14:21 2019 -0700
>
>      block: use req_op() to maintain consistency
>
> and then you go and do something different for 5.3?

I miss something. I just sent a V5 with latest for-next:-

https://www.spinics.net/lists/linux-block/msg41848.html

Please let me know if issue still exists.
>


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-06-20 18:01 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-19 17:12 [PATCH V4 0/5] block: improve print_req_error Chaitanya Kulkarni
2019-06-19 17:12 ` [PATCH V4 1/5] " Chaitanya Kulkarni
2019-06-19 17:48   ` Bart Van Assche
2019-06-19 17:12 ` [PATCH V4 2/5] block: add centralize REQ_OP_XXX to string helper Chaitanya Kulkarni
2019-06-19 17:49   ` Bart Van Assche
2019-06-19 17:13 ` [PATCH V4 3/5] block: use blk_op_str() in blk-mq-debugfs.c Chaitanya Kulkarni
2019-06-19 17:50   ` Bart Van Assche
2019-06-19 17:13 ` [PATCH V4 4/5] block: update print_req_error() Chaitanya Kulkarni
2019-06-20  5:07   ` Chaitanya Kulkarni
2019-06-19 17:13 ` [PATCH V4 5/5] f2fs: use block layer helper for show_bio_op macro Chaitanya Kulkarni
2019-06-20  1:54   ` Chao Yu
2019-06-20  7:35 ` [PATCH V4 0/5] block: improve print_req_error Jens Axboe
2019-06-20 18:01   ` Chaitanya Kulkarni

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.