1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #undef TRACE_SYSTEM 3 #define TRACE_SYSTEM block 4 5 #if !defined(_TRACE_BLOCK_H) || defined(TRACE_HEADER_MULTI_READ) 6 #define _TRACE_BLOCK_H 7 8 #include <linux/blktrace_api.h> 9 #include <linux/blkdev.h> 10 #include <linux/buffer_head.h> 11 #include <linux/tracepoint.h> 12 13 #define RWBS_LEN 8 14 15 DECLARE_EVENT_CLASS(block_buffer, 16 17 TP_PROTO(struct buffer_head *bh), 18 19 TP_ARGS(bh), 20 21 TP_STRUCT__entry ( 22 __field( dev_t, dev ) 23 __field( sector_t, sector ) 24 __field( size_t, size ) 25 ), 26 27 TP_fast_assign( 28 __entry->dev = bh->b_bdev->bd_dev; 29 __entry->sector = bh->b_blocknr; 30 __entry->size = bh->b_size; 31 ), 32 33 TP_printk("%d,%d sector=%llu size=%zu", 34 MAJOR(__entry->dev), MINOR(__entry->dev), 35 (unsigned long long)__entry->sector, __entry->size 36 ) 37 ); 38 39 /** 40 * block_touch_buffer - mark a buffer accessed 41 * @bh: buffer_head being touched 42 * 43 * Called from touch_buffer(). 44 */ 45 DEFINE_EVENT(block_buffer, block_touch_buffer, 46 47 TP_PROTO(struct buffer_head *bh), 48 49 TP_ARGS(bh) 50 ); 51 52 /** 53 * block_dirty_buffer - mark a buffer dirty 54 * @bh: buffer_head being dirtied 55 * 56 * Called from mark_buffer_dirty(). 57 */ 58 DEFINE_EVENT(block_buffer, block_dirty_buffer, 59 60 TP_PROTO(struct buffer_head *bh), 61 62 TP_ARGS(bh) 63 ); 64 65 /** 66 * block_rq_requeue - place block IO request back on a queue 67 * @q: queue holding operation 68 * @rq: block IO operation request 69 * 70 * The block operation request @rq is being placed back into queue 71 * @q. For some reason the request was not completed and needs to be 72 * put back in the queue. 73 */ 74 TRACE_EVENT(block_rq_requeue, 75 76 TP_PROTO(struct request_queue *q, struct request *rq), 77 78 TP_ARGS(q, rq), 79 80 TP_STRUCT__entry( 81 __field( dev_t, dev ) 82 __field( sector_t, sector ) 83 __field( unsigned int, nr_sector ) 84 __array( char, rwbs, RWBS_LEN ) 85 __dynamic_array( char, cmd, 1 ) 86 ), 87 88 TP_fast_assign( 89 __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 90 __entry->sector = blk_rq_trace_sector(rq); 91 __entry->nr_sector = blk_rq_trace_nr_sectors(rq); 92 93 blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 94 __get_str(cmd)[0] = '\0'; 95 ), 96 97 TP_printk("%d,%d %s (%s) %llu + %u [%d]", 98 MAJOR(__entry->dev), MINOR(__entry->dev), 99 __entry->rwbs, __get_str(cmd), 100 (unsigned long long)__entry->sector, 101 __entry->nr_sector, 0) 102 ); 103 104 /** 105 * block_rq_complete - block IO operation completed by device driver 106 * @rq: block operations request 107 * @error: status code 108 * @nr_bytes: number of completed bytes 109 * 110 * The block_rq_complete tracepoint event indicates that some portion 111 * of operation request has been completed by the device driver. If 112 * the @rq->bio is %NULL, then there is absolutely no additional work to 113 * do for the request. If @rq->bio is non-NULL then there is 114 * additional work required to complete the request. 115 */ 116 TRACE_EVENT(block_rq_complete, 117 118 TP_PROTO(struct request *rq, int error, unsigned int nr_bytes), 119 120 TP_ARGS(rq, error, nr_bytes), 121 122 TP_STRUCT__entry( 123 __field( dev_t, dev ) 124 __field( sector_t, sector ) 125 __field( unsigned int, nr_sector ) 126 __field( int, error ) 127 __array( char, rwbs, RWBS_LEN ) 128 __dynamic_array( char, cmd, 1 ) 129 ), 130 131 TP_fast_assign( 132 __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 133 __entry->sector = blk_rq_pos(rq); 134 __entry->nr_sector = nr_bytes >> 9; 135 __entry->error = error; 136 137 blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); 138 __get_str(cmd)[0] = '\0'; 139 ), 140 141 TP_printk("%d,%d %s (%s) %llu + %u [%d]", 142 MAJOR(__entry->dev), MINOR(__entry->dev), 143 __entry->rwbs, __get_str(cmd), 144 (unsigned long long)__entry->sector, 145 __entry->nr_sector, __entry->error) 146 ); 147 148 DECLARE_EVENT_CLASS(block_rq, 149 150 TP_PROTO(struct request_queue *q, struct request *rq), 151 152 TP_ARGS(q, rq), 153 154 TP_STRUCT__entry( 155 __field( dev_t, dev ) 156 __field( sector_t, sector ) 157 __field( unsigned int, nr_sector ) 158 __field( unsigned int, bytes ) 159 __array( char, rwbs, RWBS_LEN ) 160 __array( char, comm, TASK_COMM_LEN ) 161 __dynamic_array( char, cmd, 1 ) 162 ), 163 164 TP_fast_assign( 165 __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 166 __entry->sector = blk_rq_trace_sector(rq); 167 __entry->nr_sector = blk_rq_trace_nr_sectors(rq); 168 __entry->bytes = blk_rq_bytes(rq); 169 170 blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 171 __get_str(cmd)[0] = '\0'; 172 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 173 ), 174 175 TP_printk("%d,%d %s %u (%s) %llu + %u [%s]", 176 MAJOR(__entry->dev), MINOR(__entry->dev), 177 __entry->rwbs, __entry->bytes, __get_str(cmd), 178 (unsigned long long)__entry->sector, 179 __entry->nr_sector, __entry->comm) 180 ); 181 182 /** 183 * block_rq_insert - insert block operation request into queue 184 * @q: target queue 185 * @rq: block IO operation request 186 * 187 * Called immediately before block operation request @rq is inserted 188 * into queue @q. The fields in the operation request @rq struct can 189 * be examined to determine which device and sectors the pending 190 * operation would access. 191 */ 192 DEFINE_EVENT(block_rq, block_rq_insert, 193 194 TP_PROTO(struct request_queue *q, struct request *rq), 195 196 TP_ARGS(q, rq) 197 ); 198 199 /** 200 * block_rq_issue - issue pending block IO request operation to device driver 201 * @q: queue holding operation 202 * @rq: block IO operation operation request 203 * 204 * Called when block operation request @rq from queue @q is sent to a 205 * device driver for processing. 206 */ 207 DEFINE_EVENT(block_rq, block_rq_issue, 208 209 TP_PROTO(struct request_queue *q, struct request *rq), 210 211 TP_ARGS(q, rq) 212 ); 213 214 /** 215 * block_rq_merge - merge request with another one in the elevator 216 * @q: queue holding operation 217 * @rq: block IO operation operation request 218 * 219 * Called when block operation request @rq from queue @q is merged to another 220 * request queued in the elevator. 221 */ 222 DEFINE_EVENT(block_rq, block_rq_merge, 223 224 TP_PROTO(struct request_queue *q, struct request *rq), 225 226 TP_ARGS(q, rq) 227 ); 228 229 /** 230 * block_bio_bounce - used bounce buffer when processing block operation 231 * @q: queue holding the block operation 232 * @bio: block operation 233 * 234 * A bounce buffer was used to handle the block operation @bio in @q. 235 * This occurs when hardware limitations prevent a direct transfer of 236 * data between the @bio data memory area and the IO device. Use of a 237 * bounce buffer requires extra copying of data and decreases 238 * performance. 239 */ 240 TRACE_EVENT(block_bio_bounce, 241 242 TP_PROTO(struct request_queue *q, struct bio *bio), 243 244 TP_ARGS(q, bio), 245 246 TP_STRUCT__entry( 247 __field( dev_t, dev ) 248 __field( sector_t, sector ) 249 __field( unsigned int, nr_sector ) 250 __array( char, rwbs, RWBS_LEN ) 251 __array( char, comm, TASK_COMM_LEN ) 252 ), 253 254 TP_fast_assign( 255 __entry->dev = bio_dev(bio); 256 __entry->sector = bio->bi_iter.bi_sector; 257 __entry->nr_sector = bio_sectors(bio); 258 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 259 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 260 ), 261 262 TP_printk("%d,%d %s %llu + %u [%s]", 263 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 264 (unsigned long long)__entry->sector, 265 __entry->nr_sector, __entry->comm) 266 ); 267 268 /** 269 * block_bio_complete - completed all work on the block operation 270 * @q: queue holding the block operation 271 * @bio: block operation completed 272 * 273 * This tracepoint indicates there is no further work to do on this 274 * block IO operation @bio. 275 */ 276 TRACE_EVENT(block_bio_complete, 277 278 TP_PROTO(struct request_queue *q, struct bio *bio), 279 280 TP_ARGS(q, bio), 281 282 TP_STRUCT__entry( 283 __field( dev_t, dev ) 284 __field( sector_t, sector ) 285 __field( unsigned, nr_sector ) 286 __field( int, error ) 287 __array( char, rwbs, RWBS_LEN) 288 ), 289 290 TP_fast_assign( 291 __entry->dev = bio_dev(bio); 292 __entry->sector = bio->bi_iter.bi_sector; 293 __entry->nr_sector = bio_sectors(bio); 294 __entry->error = blk_status_to_errno(bio->bi_status); 295 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 296 ), 297 298 TP_printk("%d,%d %s %llu + %u [%d]", 299 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 300 (unsigned long long)__entry->sector, 301 __entry->nr_sector, __entry->error) 302 ); 303 304 DECLARE_EVENT_CLASS(block_bio_merge, 305 306 TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 307 308 TP_ARGS(q, rq, bio), 309 310 TP_STRUCT__entry( 311 __field( dev_t, dev ) 312 __field( sector_t, sector ) 313 __field( unsigned int, nr_sector ) 314 __array( char, rwbs, RWBS_LEN ) 315 __array( char, comm, TASK_COMM_LEN ) 316 ), 317 318 TP_fast_assign( 319 __entry->dev = bio_dev(bio); 320 __entry->sector = bio->bi_iter.bi_sector; 321 __entry->nr_sector = bio_sectors(bio); 322 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 323 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 324 ), 325 326 TP_printk("%d,%d %s %llu + %u [%s]", 327 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 328 (unsigned long long)__entry->sector, 329 __entry->nr_sector, __entry->comm) 330 ); 331 332 /** 333 * block_bio_backmerge - merging block operation to the end of an existing operation 334 * @q: queue holding operation 335 * @rq: request bio is being merged into 336 * @bio: new block operation to merge 337 * 338 * Merging block request @bio to the end of an existing block request 339 * in queue @q. 340 */ 341 DEFINE_EVENT(block_bio_merge, block_bio_backmerge, 342 343 TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 344 345 TP_ARGS(q, rq, bio) 346 ); 347 348 /** 349 * block_bio_frontmerge - merging block operation to the beginning of an existing operation 350 * @q: queue holding operation 351 * @rq: request bio is being merged into 352 * @bio: new block operation to merge 353 * 354 * Merging block IO operation @bio to the beginning of an existing block 355 * operation in queue @q. 356 */ 357 DEFINE_EVENT(block_bio_merge, block_bio_frontmerge, 358 359 TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 360 361 TP_ARGS(q, rq, bio) 362 ); 363 364 /** 365 * block_bio_queue - putting new block IO operation in queue 366 * @q: queue holding operation 367 * @bio: new block operation 368 * 369 * About to place the block IO operation @bio into queue @q. 370 */ 371 TRACE_EVENT(block_bio_queue, 372 373 TP_PROTO(struct request_queue *q, struct bio *bio), 374 375 TP_ARGS(q, bio), 376 377 TP_STRUCT__entry( 378 __field( dev_t, dev ) 379 __field( sector_t, sector ) 380 __field( unsigned int, nr_sector ) 381 __array( char, rwbs, RWBS_LEN ) 382 __array( char, comm, TASK_COMM_LEN ) 383 ), 384 385 TP_fast_assign( 386 __entry->dev = bio_dev(bio); 387 __entry->sector = bio->bi_iter.bi_sector; 388 __entry->nr_sector = bio_sectors(bio); 389 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 390 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 391 ), 392 393 TP_printk("%d,%d %s %llu + %u [%s]", 394 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 395 (unsigned long long)__entry->sector, 396 __entry->nr_sector, __entry->comm) 397 ); 398 399 DECLARE_EVENT_CLASS(block_get_rq, 400 401 TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 402 403 TP_ARGS(q, bio, rw), 404 405 TP_STRUCT__entry( 406 __field( dev_t, dev ) 407 __field( sector_t, sector ) 408 __field( unsigned int, nr_sector ) 409 __array( char, rwbs, RWBS_LEN ) 410 __array( char, comm, TASK_COMM_LEN ) 411 ), 412 413 TP_fast_assign( 414 __entry->dev = bio ? bio_dev(bio) : 0; 415 __entry->sector = bio ? bio->bi_iter.bi_sector : 0; 416 __entry->nr_sector = bio ? bio_sectors(bio) : 0; 417 blk_fill_rwbs(__entry->rwbs, 418 bio ? bio->bi_opf : 0, __entry->nr_sector); 419 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 420 ), 421 422 TP_printk("%d,%d %s %llu + %u [%s]", 423 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 424 (unsigned long long)__entry->sector, 425 __entry->nr_sector, __entry->comm) 426 ); 427 428 /** 429 * block_getrq - get a free request entry in queue for block IO operations 430 * @q: queue for operations 431 * @bio: pending block IO operation (can be %NULL) 432 * @rw: low bit indicates a read (%0) or a write (%1) 433 * 434 * A request struct for queue @q has been allocated to handle the 435 * block IO operation @bio. 436 */ 437 DEFINE_EVENT(block_get_rq, block_getrq, 438 439 TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 440 441 TP_ARGS(q, bio, rw) 442 ); 443 444 /** 445 * block_sleeprq - waiting to get a free request entry in queue for block IO operation 446 * @q: queue for operation 447 * @bio: pending block IO operation (can be %NULL) 448 * @rw: low bit indicates a read (%0) or a write (%1) 449 * 450 * In the case where a request struct cannot be provided for queue @q 451 * the process needs to wait for an request struct to become 452 * available. This tracepoint event is generated each time the 453 * process goes to sleep waiting for request struct become available. 454 */ 455 DEFINE_EVENT(block_get_rq, block_sleeprq, 456 457 TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 458 459 TP_ARGS(q, bio, rw) 460 ); 461 462 /** 463 * block_plug - keep operations requests in request queue 464 * @q: request queue to plug 465 * 466 * Plug the request queue @q. Do not allow block operation requests 467 * to be sent to the device driver. Instead, accumulate requests in 468 * the queue to improve throughput performance of the block device. 469 */ 470 TRACE_EVENT(block_plug, 471 472 TP_PROTO(struct request_queue *q), 473 474 TP_ARGS(q), 475 476 TP_STRUCT__entry( 477 __array( char, comm, TASK_COMM_LEN ) 478 ), 479 480 TP_fast_assign( 481 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 482 ), 483 484 TP_printk("[%s]", __entry->comm) 485 ); 486 487 DECLARE_EVENT_CLASS(block_unplug, 488 489 TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit), 490 491 TP_ARGS(q, depth, explicit), 492 493 TP_STRUCT__entry( 494 __field( int, nr_rq ) 495 __array( char, comm, TASK_COMM_LEN ) 496 ), 497 498 TP_fast_assign( 499 __entry->nr_rq = depth; 500 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 501 ), 502 503 TP_printk("[%s] %d", __entry->comm, __entry->nr_rq) 504 ); 505 506 /** 507 * block_unplug - release of operations requests in request queue 508 * @q: request queue to unplug 509 * @depth: number of requests just added to the queue 510 * @explicit: whether this was an explicit unplug, or one from schedule() 511 * 512 * Unplug request queue @q because device driver is scheduled to work 513 * on elements in the request queue. 514 */ 515 DEFINE_EVENT(block_unplug, block_unplug, 516 517 TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit), 518 519 TP_ARGS(q, depth, explicit) 520 ); 521 522 /** 523 * block_split - split a single bio struct into two bio structs 524 * @q: queue containing the bio 525 * @bio: block operation being split 526 * @new_sector: The starting sector for the new bio 527 * 528 * The bio request @bio in request queue @q needs to be split into two 529 * bio requests. The newly created @bio request starts at 530 * @new_sector. This split may be required due to hardware limitation 531 * such as operation crossing device boundaries in a RAID system. 532 */ 533 TRACE_EVENT(block_split, 534 535 TP_PROTO(struct request_queue *q, struct bio *bio, 536 unsigned int new_sector), 537 538 TP_ARGS(q, bio, new_sector), 539 540 TP_STRUCT__entry( 541 __field( dev_t, dev ) 542 __field( sector_t, sector ) 543 __field( sector_t, new_sector ) 544 __array( char, rwbs, RWBS_LEN ) 545 __array( char, comm, TASK_COMM_LEN ) 546 ), 547 548 TP_fast_assign( 549 __entry->dev = bio_dev(bio); 550 __entry->sector = bio->bi_iter.bi_sector; 551 __entry->new_sector = new_sector; 552 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 553 memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 554 ), 555 556 TP_printk("%d,%d %s %llu / %llu [%s]", 557 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 558 (unsigned long long)__entry->sector, 559 (unsigned long long)__entry->new_sector, 560 __entry->comm) 561 ); 562 563 /** 564 * block_bio_remap - map request for a logical device to the raw device 565 * @q: queue holding the operation 566 * @bio: revised operation 567 * @dev: device for the operation 568 * @from: original sector for the operation 569 * 570 * An operation for a logical device has been mapped to the 571 * raw block device. 572 */ 573 TRACE_EVENT(block_bio_remap, 574 575 TP_PROTO(struct request_queue *q, struct bio *bio, dev_t dev, 576 sector_t from), 577 578 TP_ARGS(q, bio, dev, from), 579 580 TP_STRUCT__entry( 581 __field( dev_t, dev ) 582 __field( sector_t, sector ) 583 __field( unsigned int, nr_sector ) 584 __field( dev_t, old_dev ) 585 __field( sector_t, old_sector ) 586 __array( char, rwbs, RWBS_LEN) 587 ), 588 589 TP_fast_assign( 590 __entry->dev = bio_dev(bio); 591 __entry->sector = bio->bi_iter.bi_sector; 592 __entry->nr_sector = bio_sectors(bio); 593 __entry->old_dev = dev; 594 __entry->old_sector = from; 595 blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 596 ), 597 598 TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", 599 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 600 (unsigned long long)__entry->sector, 601 __entry->nr_sector, 602 MAJOR(__entry->old_dev), MINOR(__entry->old_dev), 603 (unsigned long long)__entry->old_sector) 604 ); 605 606 /** 607 * block_rq_remap - map request for a block operation request 608 * @q: queue holding the operation 609 * @rq: block IO operation request 610 * @dev: device for the operation 611 * @from: original sector for the operation 612 * 613 * The block operation request @rq in @q has been remapped. The block 614 * operation request @rq holds the current information and @from hold 615 * the original sector. 616 */ 617 TRACE_EVENT(block_rq_remap, 618 619 TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev, 620 sector_t from), 621 622 TP_ARGS(q, rq, dev, from), 623 624 TP_STRUCT__entry( 625 __field( dev_t, dev ) 626 __field( sector_t, sector ) 627 __field( unsigned int, nr_sector ) 628 __field( dev_t, old_dev ) 629 __field( sector_t, old_sector ) 630 __field( unsigned int, nr_bios ) 631 __array( char, rwbs, RWBS_LEN) 632 ), 633 634 TP_fast_assign( 635 __entry->dev = disk_devt(rq->rq_disk); 636 __entry->sector = blk_rq_pos(rq); 637 __entry->nr_sector = blk_rq_sectors(rq); 638 __entry->old_dev = dev; 639 __entry->old_sector = from; 640 __entry->nr_bios = blk_rq_count_bios(rq); 641 blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 642 ), 643 644 TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u", 645 MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 646 (unsigned long long)__entry->sector, 647 __entry->nr_sector, 648 MAJOR(__entry->old_dev), MINOR(__entry->old_dev), 649 (unsigned long long)__entry->old_sector, __entry->nr_bios) 650 ); 651 652 #endif /* _TRACE_BLOCK_H */ 653 654 /* This part must be outside protection */ 655 #include <trace/define_trace.h> 656 657