* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).