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

Configure Feed

Select the types of activity you want to include in your feed.

blktrace: trace zone write plugging operations

Trace zone write plugging operations on block devices.

As tracing of zoned block commands needs the upper 32bit of the widened
64bit action, only add traces to blktrace if user-space has requested
version 2 of the blktrace protocol.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Johannes Thumshirn and committed by
Jens Axboe
3f672281 1c164fcc

+44
+5
include/uapi/linux/blktrace_api.h
··· 62 62 __BLK_TA_REMAP, /* bio was remapped */ 63 63 __BLK_TA_ABORT, /* request aborted */ 64 64 __BLK_TA_DRV_DATA, /* driver-specific binary data */ 65 + __BLK_TA_ZONE_PLUG, /* zone write plug was plugged */ 66 + __BLK_TA_ZONE_UNPLUG, /* zone write plug was unplugged */ 65 67 __BLK_TA_CGROUP = 1 << 8, /* from a cgroup*/ 66 68 }; 67 69 ··· 101 99 102 100 #define BLK_TA_ZONE_APPEND (__BLK_TA_COMPLETE |\ 103 101 BLK_TC_ACT(BLK_TC_ZONE_APPEND)) 102 + #define BLK_TA_ZONE_PLUG (__BLK_TA_ZONE_PLUG | BLK_TC_ACT(BLK_TC_QUEUE)) 103 + #define BLK_TA_ZONE_UNPLUG (__BLK_TA_ZONE_UNPLUG |\ 104 + BLK_TC_ACT(BLK_TC_QUEUE)) 104 105 105 106 #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) 106 107 #define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
+39
kernel/trace/blktrace.c
··· 1084 1084 rcu_read_unlock(); 1085 1085 } 1086 1086 1087 + static void blk_add_trace_zone_plug(void *ignore, struct request_queue *q, 1088 + unsigned int zno, sector_t sector, 1089 + unsigned int sectors) 1090 + { 1091 + struct blk_trace *bt; 1092 + 1093 + rcu_read_lock(); 1094 + bt = rcu_dereference(q->blk_trace); 1095 + if (bt && bt->version >= 2) 1096 + __blk_add_trace(bt, sector, sectors << SECTOR_SHIFT, 0, 1097 + BLK_TA_ZONE_PLUG, 0, 0, NULL, 0); 1098 + rcu_read_unlock(); 1099 + 1100 + return; 1101 + } 1102 + 1103 + static void blk_add_trace_zone_unplug(void *ignore, struct request_queue *q, 1104 + unsigned int zno, sector_t sector, 1105 + unsigned int sectors) 1106 + { 1107 + struct blk_trace *bt; 1108 + 1109 + rcu_read_lock(); 1110 + bt = rcu_dereference(q->blk_trace); 1111 + if (bt && bt->version >= 2) 1112 + __blk_add_trace(bt, sector, sectors << SECTOR_SHIFT, 0, 1113 + BLK_TA_ZONE_UNPLUG, 0, 0, NULL, 0); 1114 + rcu_read_unlock(); 1115 + return; 1116 + } 1117 + 1087 1118 static void blk_add_trace_split(void *ignore, struct bio *bio, unsigned int pdu) 1088 1119 { 1089 1120 struct request_queue *q = bio->bi_bdev->bd_disk->queue; ··· 1258 1227 ret = register_trace_blk_zone_append_update_request_bio( 1259 1228 blk_add_trace_zone_update_request, NULL); 1260 1229 WARN_ON(ret); 1230 + ret = register_trace_disk_zone_wplug_add_bio(blk_add_trace_zone_plug, 1231 + NULL); 1232 + WARN_ON(ret); 1233 + ret = register_trace_blk_zone_wplug_bio(blk_add_trace_zone_unplug, 1234 + NULL); 1235 + WARN_ON(ret); 1261 1236 ret = register_trace_block_plug(blk_add_trace_plug, NULL); 1262 1237 WARN_ON(ret); 1263 1238 ret = register_trace_block_unplug(blk_add_trace_unplug, NULL); ··· 1283 1246 unregister_trace_block_split(blk_add_trace_split, NULL); 1284 1247 unregister_trace_block_unplug(blk_add_trace_unplug, NULL); 1285 1248 unregister_trace_block_plug(blk_add_trace_plug, NULL); 1249 + unregister_trace_blk_zone_wplug_bio(blk_add_trace_zone_unplug, NULL); 1250 + unregister_trace_disk_zone_wplug_add_bio(blk_add_trace_zone_plug, NULL); 1286 1251 unregister_trace_blk_zone_append_update_request_bio( 1287 1252 blk_add_trace_zone_update_request, NULL); 1288 1253 unregister_trace_block_getrq(blk_add_trace_getrq, NULL);