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

blktrace: add support for REQ_OP_WRITE_ZEROES tracing

Currently, REQ_OP_WRITE_ZEROES operations are not handled in the
blktrace infrastructure, resulting in incorrect or missing operation
labels in ftrace blktrace output. This manifests as write-zeroes
operations appearing with incorrect labels like "N" instead of a
proper "WZ" designation.

This patch adds complete support for REQ_OP_WRITE_ZEROES across the
blktrace infrastructure:

Add BLK_TC_WRITE_ZEROES trace category in blktrace_api.h and update
BLK_TC_END_V2 marker accordingly
Map REQ_OP_WRITE_ZEROES to BLK_TC_WRITE_ZEROES in __blk_add_trace()
to ensure proper trace event categorization
Update fill_rwbs() to generate "WZ" label for write-zeroes operations
in ftrace output, making them easily identifiable
Add "write-zeroes" string mapping in act_to_str array for debugfs
filter interface
Update blk_fill_rwbs() to handle REQ_OP_WRITE_ZEROES for block layer
event tracing

With this fix, write-zeroes operations are now correctly traced and
displayed.

===========================================================
BEFORE THIS PATCH
===========================================================
blkdiscard -z -o 0 -l 40960 /dev/nvme0n1
blkdiscard-3809 [030] ..... 1212.253701: block_bio_queue: 259,0 NS 0 + 80 [blkdiscard]
blkdiscard-3809 [030] ..... 1212.253703: block_getrq: 259,0 NS 0 + 80 [blkdiscard]
blkdiscard-3809 [030] ..... 1212.253704: block_io_start: 259,0 NS 40960 () 0 + 80 be,0,4 [blkdiscard]
blkdiscard-3809 [030] ..... 1212.253704: block_plug: [blkdiscard]
blkdiscard-3809 [030] ..... 1212.253706: block_unplug: [blkdiscard] 1
blkdiscard-3809 [030] ..... 1212.253706: block_rq_insert: 259,0 NS 40960 () 0 + 80 be,0,4 [blkdiscard]
kworker/30:1H-566 [030] ..... 1212.253726: block_rq_issue: 259,0 NS 40960 () 0 + 80 be,0,4 [kworker/30:1H]
<idle>-0 [030] d.h1. 1212.253957: block_rq_complete: 259,0 NS () 0 + 80 be,0,4 [0]
<idle>-0 [030] dNh1. 1212.253960: block_io_done: 259,0 NS 0 () 0 + 0 none,0,0 [swapper/30]

Trace Event Breakdown:
Event | Device | Op | Sector | Sectors | Byte Size | Calculation

block_bio_queue | 259,0 | NS | 0 | 80 | - | 80 × 512 = 40,960
block_getrq | 259,0 | NS | 0 | 80 | - | 80 × 512 = 40,960
block_io_start | 259,0 | NS | 0 | 80 | 40960 | Direct from trace
block_rq_insert | 259,0 | NS | 0 | 80 | 40960 | Direct from trace
block_rq_issue | 259,0 | NS | 0 | 80 | 40960 | Direct from trace
block_rq_complete | 259,0 | NS | 0 | 80 | - | 80 × 512 = 40,960
block_io_done | 259,0 | NS | 0 | 0 | 0 | Completion (no data)

Total Bytes Transferred: Sectors: 80 Bytes: 80 × 512 = 40,960 bytes

===========================================================
AFTER THIS PATCH
===========================================================
blkdiscard -z -o 0 -l 40960 /dev/nvme0n1

blkdiscard-2477 [020] ..... 960.989131: block_bio_queue: 259,0 WZS 0 + 80 [blkdiscard]
blkdiscard-2477 [020] ..... 960.989134: block_getrq: 259,0 WZS 0 + 80 [blkdiscard]
blkdiscard-2477 [020] ..... 960.989135: block_io_start: 259,0 WZS 40960 () 0 + 80 be,0,4 [blkdiscard]
blkdiscard-2477 [020] ..... 960.989138: block_plug: [blkdiscard]
blkdiscard-2477 [020] ..... 960.989140: block_unplug: [blkdiscard] 1
blkdiscard-2477 [020] ..... 960.989141: block_rq_insert: 259,0 WZS 40960 () 0 + 80 be,0,4 [blkdiscard]
kworker/20:1H-736 [020] ..... 960.989166: block_rq_issue: 259,0 WZS 40960 () 0 + 80 be,0,4 [kworker/20:1H]
<idle>-0 [020] d.h1. 960.989476: block_rq_complete: 259,0 WZS () 0 + 80 be,0,4 [0]
<idle>-0 [020] dNh1. 960.989482: block_io_done: 259,0 WZS 0 () 0 + 0 none,0,0 [swapper/20]

Trace Event Breakdown:
Event | Device | Op | Sector | Sectors | Byte Size | Calculation

block_bio_queue | 259,0 | WZS | 0 | 80 | - | 80 × 512 = 40,960
block_getrq | 259,0 | WZS | 0 | 80 | - | 80 × 512 = 40,960
block_io_start | 259,0 | WZS | 0 | 80 | 40960 | Direct from trace
block_rq_insert | 259,0 | WZS | 0 | 80 | 40960 | Direct from trace
block_rq_issue | 259,0 | WZS | 0 | 80 | 40960 | Direct from trace
block_rq_complete | 259,0 | WZS | 0 | 80 | - | 80 × 512 = 40,960
block_io_done | 259,0 | WZS | 0 | 0 | 0 | Completion (no data)

Total Bytes Transferred: Sectors: 80 Bytes: 80 × 512 = 40,960 bytes

Tested with ftrace blktrace on NVMe devices using blkdiscard with
the -z (write-zeroes) flag.

Signed-off-by: Chaitanya Kulkarni <ckulkarnilinux@gmail.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Chaitanya Kulkarni and committed by
Jens Axboe
bc49af56 77220f6d

+15 -2
+3 -1
include/uapi/linux/blktrace_api.h
··· 35 35 BLK_TC_ZONE_OPEN = 1ull << 20, /* zone open */ 36 36 BLK_TC_ZONE_CLOSE = 1ull << 21, /* zone close */ 37 37 38 - BLK_TC_END_V2 = 1ull << 21, 38 + BLK_TC_WRITE_ZEROES = 1ull << 22, /* write-zeroes */ 39 + 40 + BLK_TC_END_V2 = 1ull << 22, 39 41 }; 40 42 41 43 #define BLK_TC_SHIFT (16)
+12 -1
kernel/trace/blktrace.c
··· 360 360 case REQ_OP_ZONE_CLOSE: 361 361 what |= BLK_TC_ACT(BLK_TC_ZONE_CLOSE); 362 362 break; 363 + case REQ_OP_WRITE_ZEROES: 364 + what |= BLK_TC_ACT(BLK_TC_WRITE_ZEROES); 365 + break; 363 366 default: 364 367 break; 365 368 } ··· 1411 1408 1412 1409 if (tc & BLK_TC_DISCARD) 1413 1410 rwbs[i++] = 'D'; 1414 - else if (tc & BLK_TC_WRITE) 1411 + else if (tc & BLK_TC_WRITE_ZEROES) { 1412 + rwbs[i++] = 'W'; 1413 + rwbs[i++] = 'Z'; 1414 + } else if (tc & BLK_TC_WRITE) 1415 1415 rwbs[i++] = 'W'; 1416 1416 else if (t->bytes) 1417 1417 rwbs[i++] = 'R'; ··· 1957 1951 { BLK_TC_DISCARD, "discard" }, 1958 1952 { BLK_TC_DRV_DATA, "drv_data" }, 1959 1953 { BLK_TC_FUA, "fua" }, 1954 + { BLK_TC_WRITE_ZEROES, "write-zeroes" }, 1960 1955 }; 1961 1956 1962 1957 static int blk_trace_str2mask(const char *str) ··· 2170 2163 case REQ_OP_ZONE_CLOSE: 2171 2164 rwbs[i++] = 'Z'; 2172 2165 rwbs[i++] = 'C'; 2166 + break; 2167 + case REQ_OP_WRITE_ZEROES: 2168 + rwbs[i++] = 'W'; 2169 + rwbs[i++] = 'Z'; 2173 2170 break; 2174 2171 default: 2175 2172 rwbs[i++] = 'N';