1d0b6e04aSLi Zefan #undef TRACE_SYSTEM 2d0b6e04aSLi Zefan #define TRACE_SYSTEM block 3d0b6e04aSLi Zefan 455782138SLi Zefan #if !defined(_TRACE_BLOCK_H) || defined(TRACE_HEADER_MULTI_READ) 555782138SLi Zefan #define _TRACE_BLOCK_H 655782138SLi Zefan 755782138SLi Zefan #include <linux/blktrace_api.h> 855782138SLi Zefan #include <linux/blkdev.h> 95305cb83STejun Heo #include <linux/buffer_head.h> 1055782138SLi Zefan #include <linux/tracepoint.h> 1155782138SLi Zefan 12c09c47caSNamhyung Kim #define RWBS_LEN 8 13c09c47caSNamhyung Kim 145305cb83STejun Heo DECLARE_EVENT_CLASS(block_buffer, 155305cb83STejun Heo 165305cb83STejun Heo TP_PROTO(struct buffer_head *bh), 175305cb83STejun Heo 185305cb83STejun Heo TP_ARGS(bh), 195305cb83STejun Heo 205305cb83STejun Heo TP_STRUCT__entry ( 215305cb83STejun Heo __field( dev_t, dev ) 225305cb83STejun Heo __field( sector_t, sector ) 235305cb83STejun Heo __field( size_t, size ) 245305cb83STejun Heo ), 255305cb83STejun Heo 265305cb83STejun Heo TP_fast_assign( 275305cb83STejun Heo __entry->dev = bh->b_bdev->bd_dev; 285305cb83STejun Heo __entry->sector = bh->b_blocknr; 295305cb83STejun Heo __entry->size = bh->b_size; 305305cb83STejun Heo ), 315305cb83STejun Heo 325305cb83STejun Heo TP_printk("%d,%d sector=%llu size=%zu", 335305cb83STejun Heo MAJOR(__entry->dev), MINOR(__entry->dev), 345305cb83STejun Heo (unsigned long long)__entry->sector, __entry->size 355305cb83STejun Heo ) 365305cb83STejun Heo ); 375305cb83STejun Heo 385305cb83STejun Heo /** 395305cb83STejun Heo * block_touch_buffer - mark a buffer accessed 405305cb83STejun Heo * @bh: buffer_head being touched 415305cb83STejun Heo * 425305cb83STejun Heo * Called from touch_buffer(). 435305cb83STejun Heo */ 445305cb83STejun Heo DEFINE_EVENT(block_buffer, block_touch_buffer, 455305cb83STejun Heo 465305cb83STejun Heo TP_PROTO(struct buffer_head *bh), 475305cb83STejun Heo 485305cb83STejun Heo TP_ARGS(bh) 495305cb83STejun Heo ); 505305cb83STejun Heo 515305cb83STejun Heo /** 525305cb83STejun Heo * block_dirty_buffer - mark a buffer dirty 535305cb83STejun Heo * @bh: buffer_head being dirtied 545305cb83STejun Heo * 555305cb83STejun Heo * Called from mark_buffer_dirty(). 565305cb83STejun Heo */ 575305cb83STejun Heo DEFINE_EVENT(block_buffer, block_dirty_buffer, 585305cb83STejun Heo 595305cb83STejun Heo TP_PROTO(struct buffer_head *bh), 605305cb83STejun Heo 615305cb83STejun Heo TP_ARGS(bh) 625305cb83STejun Heo ); 635305cb83STejun Heo 64*cee4b7ceSChristoph Hellwig /** 65*cee4b7ceSChristoph Hellwig * block_rq_requeue - place block IO request back on a queue 66*cee4b7ceSChristoph Hellwig * @q: queue holding operation 67*cee4b7ceSChristoph Hellwig * @rq: block IO operation request 68*cee4b7ceSChristoph Hellwig * 69*cee4b7ceSChristoph Hellwig * The block operation request @rq is being placed back into queue 70*cee4b7ceSChristoph Hellwig * @q. For some reason the request was not completed and needs to be 71*cee4b7ceSChristoph Hellwig * put back in the queue. 72*cee4b7ceSChristoph Hellwig */ 73*cee4b7ceSChristoph Hellwig TRACE_EVENT(block_rq_requeue, 7455782138SLi Zefan 7555782138SLi Zefan TP_PROTO(struct request_queue *q, struct request *rq), 7655782138SLi Zefan 7755782138SLi Zefan TP_ARGS(q, rq), 7855782138SLi Zefan 7955782138SLi Zefan TP_STRUCT__entry( 8055782138SLi Zefan __field( dev_t, dev ) 8155782138SLi Zefan __field( sector_t, sector ) 8255782138SLi Zefan __field( unsigned int, nr_sector ) 8355782138SLi Zefan __field( int, errors ) 84c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 8548b77ad6SChristoph Hellwig __dynamic_array( char, cmd, 1 ) 8655782138SLi Zefan ), 8755782138SLi Zefan 8855782138SLi Zefan TP_fast_assign( 8955782138SLi Zefan __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 9048b77ad6SChristoph Hellwig __entry->sector = blk_rq_trace_sector(rq); 9148b77ad6SChristoph Hellwig __entry->nr_sector = blk_rq_trace_nr_sectors(rq); 9255782138SLi Zefan __entry->errors = rq->errors; 9355782138SLi Zefan 94ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 9548b77ad6SChristoph Hellwig __get_str(cmd)[0] = '\0'; 9655782138SLi Zefan ), 9755782138SLi Zefan 9855782138SLi Zefan TP_printk("%d,%d %s (%s) %llu + %u [%d]", 9955782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), 10055782138SLi Zefan __entry->rwbs, __get_str(cmd), 1016556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 1026556d1dfSSteven Rostedt __entry->nr_sector, __entry->errors) 10355782138SLi Zefan ); 10455782138SLi Zefan 105881245dcSWilliam Cohen /** 106881245dcSWilliam Cohen * block_rq_complete - block IO operation completed by device driver 107881245dcSWilliam Cohen * @q: queue containing the block operation request 108881245dcSWilliam Cohen * @rq: block operations request 109af5040daSRoman Pen * @nr_bytes: number of completed bytes 110881245dcSWilliam Cohen * 111881245dcSWilliam Cohen * The block_rq_complete tracepoint event indicates that some portion 112881245dcSWilliam Cohen * of operation request has been completed by the device driver. If 113881245dcSWilliam Cohen * the @rq->bio is %NULL, then there is absolutely no additional work to 114881245dcSWilliam Cohen * do for the request. If @rq->bio is non-NULL then there is 115881245dcSWilliam Cohen * additional work required to complete the request. 116881245dcSWilliam Cohen */ 117af5040daSRoman Pen TRACE_EVENT(block_rq_complete, 11877ca1e02SLi Zefan 119af5040daSRoman Pen TP_PROTO(struct request_queue *q, struct request *rq, 120af5040daSRoman Pen unsigned int nr_bytes), 12177ca1e02SLi Zefan 122af5040daSRoman Pen TP_ARGS(q, rq, nr_bytes), 123af5040daSRoman Pen 124af5040daSRoman Pen TP_STRUCT__entry( 125af5040daSRoman Pen __field( dev_t, dev ) 126af5040daSRoman Pen __field( sector_t, sector ) 127af5040daSRoman Pen __field( unsigned int, nr_sector ) 128af5040daSRoman Pen __field( int, errors ) 129af5040daSRoman Pen __array( char, rwbs, RWBS_LEN ) 13048b77ad6SChristoph Hellwig __dynamic_array( char, cmd, 1 ) 131af5040daSRoman Pen ), 132af5040daSRoman Pen 133af5040daSRoman Pen TP_fast_assign( 134af5040daSRoman Pen __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 135af5040daSRoman Pen __entry->sector = blk_rq_pos(rq); 136af5040daSRoman Pen __entry->nr_sector = nr_bytes >> 9; 137af5040daSRoman Pen __entry->errors = rq->errors; 138af5040daSRoman Pen 139ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes); 14048b77ad6SChristoph Hellwig __get_str(cmd)[0] = '\0'; 141af5040daSRoman Pen ), 142af5040daSRoman Pen 143af5040daSRoman Pen TP_printk("%d,%d %s (%s) %llu + %u [%d]", 144af5040daSRoman Pen MAJOR(__entry->dev), MINOR(__entry->dev), 145af5040daSRoman Pen __entry->rwbs, __get_str(cmd), 146af5040daSRoman Pen (unsigned long long)__entry->sector, 147af5040daSRoman Pen __entry->nr_sector, __entry->errors) 14877ca1e02SLi Zefan ); 14977ca1e02SLi Zefan 15077ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_rq, 15155782138SLi Zefan 15255782138SLi Zefan TP_PROTO(struct request_queue *q, struct request *rq), 15355782138SLi Zefan 15455782138SLi Zefan TP_ARGS(q, rq), 15555782138SLi Zefan 15655782138SLi Zefan TP_STRUCT__entry( 15755782138SLi Zefan __field( dev_t, dev ) 15855782138SLi Zefan __field( sector_t, sector ) 15955782138SLi Zefan __field( unsigned int, nr_sector ) 16055782138SLi Zefan __field( unsigned int, bytes ) 161c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 16255782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 16348b77ad6SChristoph Hellwig __dynamic_array( char, cmd, 1 ) 16455782138SLi Zefan ), 16555782138SLi Zefan 16655782138SLi Zefan TP_fast_assign( 16755782138SLi Zefan __entry->dev = rq->rq_disk ? disk_devt(rq->rq_disk) : 0; 16848b77ad6SChristoph Hellwig __entry->sector = blk_rq_trace_sector(rq); 16948b77ad6SChristoph Hellwig __entry->nr_sector = blk_rq_trace_nr_sectors(rq); 17048b77ad6SChristoph Hellwig __entry->bytes = blk_rq_bytes(rq); 17155782138SLi Zefan 172ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 17348b77ad6SChristoph Hellwig __get_str(cmd)[0] = '\0'; 17455782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 17555782138SLi Zefan ), 17655782138SLi Zefan 17755782138SLi Zefan TP_printk("%d,%d %s %u (%s) %llu + %u [%s]", 17855782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), 17955782138SLi Zefan __entry->rwbs, __entry->bytes, __get_str(cmd), 1806556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 1816556d1dfSSteven Rostedt __entry->nr_sector, __entry->comm) 18255782138SLi Zefan ); 18355782138SLi Zefan 184881245dcSWilliam Cohen /** 185881245dcSWilliam Cohen * block_rq_insert - insert block operation request into queue 186881245dcSWilliam Cohen * @q: target queue 187881245dcSWilliam Cohen * @rq: block IO operation request 188881245dcSWilliam Cohen * 189881245dcSWilliam Cohen * Called immediately before block operation request @rq is inserted 190881245dcSWilliam Cohen * into queue @q. The fields in the operation request @rq struct can 191881245dcSWilliam Cohen * be examined to determine which device and sectors the pending 192881245dcSWilliam Cohen * operation would access. 193881245dcSWilliam Cohen */ 19477ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_insert, 19555782138SLi Zefan 19655782138SLi Zefan TP_PROTO(struct request_queue *q, struct request *rq), 19755782138SLi Zefan 19877ca1e02SLi Zefan TP_ARGS(q, rq) 19955782138SLi Zefan ); 20055782138SLi Zefan 201881245dcSWilliam Cohen /** 202881245dcSWilliam Cohen * block_rq_issue - issue pending block IO request operation to device driver 203881245dcSWilliam Cohen * @q: queue holding operation 204881245dcSWilliam Cohen * @rq: block IO operation operation request 205881245dcSWilliam Cohen * 206881245dcSWilliam Cohen * Called when block operation request @rq from queue @q is sent to a 207881245dcSWilliam Cohen * device driver for processing. 208881245dcSWilliam Cohen */ 20977ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_issue, 21055782138SLi Zefan 21155782138SLi Zefan TP_PROTO(struct request_queue *q, struct request *rq), 21255782138SLi Zefan 21377ca1e02SLi Zefan TP_ARGS(q, rq) 21455782138SLi Zefan ); 215fe63b94aSCarsten Emde 216881245dcSWilliam Cohen /** 217881245dcSWilliam Cohen * block_bio_bounce - used bounce buffer when processing block operation 218881245dcSWilliam Cohen * @q: queue holding the block operation 219881245dcSWilliam Cohen * @bio: block operation 220881245dcSWilliam Cohen * 221881245dcSWilliam Cohen * A bounce buffer was used to handle the block operation @bio in @q. 222881245dcSWilliam Cohen * This occurs when hardware limitations prevent a direct transfer of 223881245dcSWilliam Cohen * data between the @bio data memory area and the IO device. Use of a 224881245dcSWilliam Cohen * bounce buffer requires extra copying of data and decreases 225881245dcSWilliam Cohen * performance. 226881245dcSWilliam Cohen */ 22755782138SLi Zefan TRACE_EVENT(block_bio_bounce, 22855782138SLi Zefan 22955782138SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio), 23055782138SLi Zefan 23155782138SLi Zefan TP_ARGS(q, bio), 23255782138SLi Zefan 23355782138SLi Zefan TP_STRUCT__entry( 23455782138SLi Zefan __field( dev_t, dev ) 23555782138SLi Zefan __field( sector_t, sector ) 23655782138SLi Zefan __field( unsigned int, nr_sector ) 237c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 23855782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 23955782138SLi Zefan ), 24055782138SLi Zefan 24155782138SLi Zefan TP_fast_assign( 242fe63b94aSCarsten Emde __entry->dev = bio->bi_bdev ? 243fe63b94aSCarsten Emde bio->bi_bdev->bd_dev : 0; 2444f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 245aa8b57aaSKent Overstreet __entry->nr_sector = bio_sectors(bio); 246ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 24755782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 24855782138SLi Zefan ), 24955782138SLi Zefan 25055782138SLi Zefan TP_printk("%d,%d %s %llu + %u [%s]", 25155782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 2526556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 2536556d1dfSSteven Rostedt __entry->nr_sector, __entry->comm) 25455782138SLi Zefan ); 25555782138SLi Zefan 256881245dcSWilliam Cohen /** 257881245dcSWilliam Cohen * block_bio_complete - completed all work on the block operation 2580a82a8d1SLinus Torvalds * @q: queue holding the block operation 259881245dcSWilliam Cohen * @bio: block operation completed 260b7908c10SJeff Moyer * @error: io error value 261881245dcSWilliam Cohen * 262881245dcSWilliam Cohen * This tracepoint indicates there is no further work to do on this 263881245dcSWilliam Cohen * block IO operation @bio. 264881245dcSWilliam Cohen */ 26555782138SLi Zefan TRACE_EVENT(block_bio_complete, 26655782138SLi Zefan 2670a82a8d1SLinus Torvalds TP_PROTO(struct request_queue *q, struct bio *bio, int error), 26855782138SLi Zefan 2690a82a8d1SLinus Torvalds TP_ARGS(q, bio, error), 27055782138SLi Zefan 27155782138SLi Zefan TP_STRUCT__entry( 27255782138SLi Zefan __field( dev_t, dev ) 27355782138SLi Zefan __field( sector_t, sector ) 27455782138SLi Zefan __field( unsigned, nr_sector ) 27555782138SLi Zefan __field( int, error ) 276c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN) 27755782138SLi Zefan ), 27855782138SLi Zefan 27955782138SLi Zefan TP_fast_assign( 2800a82a8d1SLinus Torvalds __entry->dev = bio->bi_bdev->bd_dev; 2814f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 282aa8b57aaSKent Overstreet __entry->nr_sector = bio_sectors(bio); 283b7908c10SJeff Moyer __entry->error = error; 284ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 28555782138SLi Zefan ), 28655782138SLi Zefan 28755782138SLi Zefan TP_printk("%d,%d %s %llu + %u [%d]", 28855782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 2896556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 2906556d1dfSSteven Rostedt __entry->nr_sector, __entry->error) 29155782138SLi Zefan ); 29255782138SLi Zefan 2938c1cf6bbSTejun Heo DECLARE_EVENT_CLASS(block_bio_merge, 29455782138SLi Zefan 2958c1cf6bbSTejun Heo TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 29655782138SLi Zefan 2978c1cf6bbSTejun Heo TP_ARGS(q, rq, bio), 29855782138SLi Zefan 29955782138SLi Zefan TP_STRUCT__entry( 30055782138SLi Zefan __field( dev_t, dev ) 30155782138SLi Zefan __field( sector_t, sector ) 30255782138SLi Zefan __field( unsigned int, nr_sector ) 303c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 30455782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 30555782138SLi Zefan ), 30655782138SLi Zefan 30755782138SLi Zefan TP_fast_assign( 30855782138SLi Zefan __entry->dev = bio->bi_bdev->bd_dev; 3094f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 310aa8b57aaSKent Overstreet __entry->nr_sector = bio_sectors(bio); 311ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 31255782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 31355782138SLi Zefan ), 31455782138SLi Zefan 31555782138SLi Zefan TP_printk("%d,%d %s %llu + %u [%s]", 31655782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 3176556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 3186556d1dfSSteven Rostedt __entry->nr_sector, __entry->comm) 31955782138SLi Zefan ); 32055782138SLi Zefan 321881245dcSWilliam Cohen /** 322881245dcSWilliam Cohen * block_bio_backmerge - merging block operation to the end of an existing operation 323881245dcSWilliam Cohen * @q: queue holding operation 3248c1cf6bbSTejun Heo * @rq: request bio is being merged into 325881245dcSWilliam Cohen * @bio: new block operation to merge 326881245dcSWilliam Cohen * 327881245dcSWilliam Cohen * Merging block request @bio to the end of an existing block request 328881245dcSWilliam Cohen * in queue @q. 329881245dcSWilliam Cohen */ 3308c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_backmerge, 33155782138SLi Zefan 3328c1cf6bbSTejun Heo TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 33355782138SLi Zefan 3348c1cf6bbSTejun Heo TP_ARGS(q, rq, bio) 33555782138SLi Zefan ); 33655782138SLi Zefan 337881245dcSWilliam Cohen /** 338881245dcSWilliam Cohen * block_bio_frontmerge - merging block operation to the beginning of an existing operation 339881245dcSWilliam Cohen * @q: queue holding operation 3408c1cf6bbSTejun Heo * @rq: request bio is being merged into 341881245dcSWilliam Cohen * @bio: new block operation to merge 342881245dcSWilliam Cohen * 343881245dcSWilliam Cohen * Merging block IO operation @bio to the beginning of an existing block 344881245dcSWilliam Cohen * operation in queue @q. 345881245dcSWilliam Cohen */ 3468c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_frontmerge, 34755782138SLi Zefan 3488c1cf6bbSTejun Heo TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio), 34955782138SLi Zefan 3508c1cf6bbSTejun Heo TP_ARGS(q, rq, bio) 35155782138SLi Zefan ); 35255782138SLi Zefan 353881245dcSWilliam Cohen /** 354881245dcSWilliam Cohen * block_bio_queue - putting new block IO operation in queue 355881245dcSWilliam Cohen * @q: queue holding operation 356881245dcSWilliam Cohen * @bio: new block operation 357881245dcSWilliam Cohen * 358881245dcSWilliam Cohen * About to place the block IO operation @bio into queue @q. 359881245dcSWilliam Cohen */ 3608c1cf6bbSTejun Heo TRACE_EVENT(block_bio_queue, 36177ca1e02SLi Zefan 36277ca1e02SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio), 36377ca1e02SLi Zefan 3648c1cf6bbSTejun Heo TP_ARGS(q, bio), 3658c1cf6bbSTejun Heo 3668c1cf6bbSTejun Heo TP_STRUCT__entry( 3678c1cf6bbSTejun Heo __field( dev_t, dev ) 3688c1cf6bbSTejun Heo __field( sector_t, sector ) 3698c1cf6bbSTejun Heo __field( unsigned int, nr_sector ) 3708c1cf6bbSTejun Heo __array( char, rwbs, RWBS_LEN ) 3718c1cf6bbSTejun Heo __array( char, comm, TASK_COMM_LEN ) 3728c1cf6bbSTejun Heo ), 3738c1cf6bbSTejun Heo 3748c1cf6bbSTejun Heo TP_fast_assign( 3758c1cf6bbSTejun Heo __entry->dev = bio->bi_bdev->bd_dev; 3764f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 377aa8b57aaSKent Overstreet __entry->nr_sector = bio_sectors(bio); 378ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 3798c1cf6bbSTejun Heo memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 3808c1cf6bbSTejun Heo ), 3818c1cf6bbSTejun Heo 3828c1cf6bbSTejun Heo TP_printk("%d,%d %s %llu + %u [%s]", 3838c1cf6bbSTejun Heo MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 3848c1cf6bbSTejun Heo (unsigned long long)__entry->sector, 3858c1cf6bbSTejun Heo __entry->nr_sector, __entry->comm) 38677ca1e02SLi Zefan ); 38777ca1e02SLi Zefan 38877ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_get_rq, 38955782138SLi Zefan 39055782138SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 39155782138SLi Zefan 39255782138SLi Zefan TP_ARGS(q, bio, rw), 39355782138SLi Zefan 39455782138SLi Zefan TP_STRUCT__entry( 39555782138SLi Zefan __field( dev_t, dev ) 39655782138SLi Zefan __field( sector_t, sector ) 39755782138SLi Zefan __field( unsigned int, nr_sector ) 398c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 39955782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 40055782138SLi Zefan ), 40155782138SLi Zefan 40255782138SLi Zefan TP_fast_assign( 40355782138SLi Zefan __entry->dev = bio ? bio->bi_bdev->bd_dev : 0; 4044f024f37SKent Overstreet __entry->sector = bio ? bio->bi_iter.bi_sector : 0; 405aa8b57aaSKent Overstreet __entry->nr_sector = bio ? bio_sectors(bio) : 0; 406ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, 4071eff9d32SJens Axboe bio ? bio->bi_opf : 0, __entry->nr_sector); 40855782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 40955782138SLi Zefan ), 41055782138SLi Zefan 41155782138SLi Zefan TP_printk("%d,%d %s %llu + %u [%s]", 41255782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 4136556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 4146556d1dfSSteven Rostedt __entry->nr_sector, __entry->comm) 41555782138SLi Zefan ); 41655782138SLi Zefan 417881245dcSWilliam Cohen /** 418881245dcSWilliam Cohen * block_getrq - get a free request entry in queue for block IO operations 419881245dcSWilliam Cohen * @q: queue for operations 420881245dcSWilliam Cohen * @bio: pending block IO operation 421881245dcSWilliam Cohen * @rw: low bit indicates a read (%0) or a write (%1) 422881245dcSWilliam Cohen * 423881245dcSWilliam Cohen * A request struct for queue @q has been allocated to handle the 424881245dcSWilliam Cohen * block IO operation @bio. 425881245dcSWilliam Cohen */ 42677ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_getrq, 42755782138SLi Zefan 42855782138SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 42955782138SLi Zefan 43077ca1e02SLi Zefan TP_ARGS(q, bio, rw) 43177ca1e02SLi Zefan ); 43255782138SLi Zefan 433881245dcSWilliam Cohen /** 434881245dcSWilliam Cohen * block_sleeprq - waiting to get a free request entry in queue for block IO operation 435881245dcSWilliam Cohen * @q: queue for operation 436881245dcSWilliam Cohen * @bio: pending block IO operation 437881245dcSWilliam Cohen * @rw: low bit indicates a read (%0) or a write (%1) 438881245dcSWilliam Cohen * 439881245dcSWilliam Cohen * In the case where a request struct cannot be provided for queue @q 440881245dcSWilliam Cohen * the process needs to wait for an request struct to become 441881245dcSWilliam Cohen * available. This tracepoint event is generated each time the 442881245dcSWilliam Cohen * process goes to sleep waiting for request struct become available. 443881245dcSWilliam Cohen */ 44477ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_sleeprq, 44555782138SLi Zefan 44677ca1e02SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio, int rw), 44755782138SLi Zefan 44877ca1e02SLi Zefan TP_ARGS(q, bio, rw) 44955782138SLi Zefan ); 45055782138SLi Zefan 451881245dcSWilliam Cohen /** 452881245dcSWilliam Cohen * block_plug - keep operations requests in request queue 453881245dcSWilliam Cohen * @q: request queue to plug 454881245dcSWilliam Cohen * 455881245dcSWilliam Cohen * Plug the request queue @q. Do not allow block operation requests 456881245dcSWilliam Cohen * to be sent to the device driver. Instead, accumulate requests in 457881245dcSWilliam Cohen * the queue to improve throughput performance of the block device. 458881245dcSWilliam Cohen */ 45955782138SLi Zefan TRACE_EVENT(block_plug, 46055782138SLi Zefan 46155782138SLi Zefan TP_PROTO(struct request_queue *q), 46255782138SLi Zefan 46355782138SLi Zefan TP_ARGS(q), 46455782138SLi Zefan 46555782138SLi Zefan TP_STRUCT__entry( 46655782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 46755782138SLi Zefan ), 46855782138SLi Zefan 46955782138SLi Zefan TP_fast_assign( 47055782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 47155782138SLi Zefan ), 47255782138SLi Zefan 47355782138SLi Zefan TP_printk("[%s]", __entry->comm) 47455782138SLi Zefan ); 47555782138SLi Zefan 47677ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_unplug, 47755782138SLi Zefan 47849cac01eSJens Axboe TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit), 47955782138SLi Zefan 48049cac01eSJens Axboe TP_ARGS(q, depth, explicit), 48155782138SLi Zefan 48255782138SLi Zefan TP_STRUCT__entry( 48355782138SLi Zefan __field( int, nr_rq ) 48455782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 48555782138SLi Zefan ), 48655782138SLi Zefan 48755782138SLi Zefan TP_fast_assign( 48894b5eb28SJens Axboe __entry->nr_rq = depth; 48955782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 49055782138SLi Zefan ), 49155782138SLi Zefan 49255782138SLi Zefan TP_printk("[%s] %d", __entry->comm, __entry->nr_rq) 49355782138SLi Zefan ); 49455782138SLi Zefan 495881245dcSWilliam Cohen /** 49649cac01eSJens Axboe * block_unplug - release of operations requests in request queue 497881245dcSWilliam Cohen * @q: request queue to unplug 49894b5eb28SJens Axboe * @depth: number of requests just added to the queue 49949cac01eSJens Axboe * @explicit: whether this was an explicit unplug, or one from schedule() 500881245dcSWilliam Cohen * 501881245dcSWilliam Cohen * Unplug request queue @q because device driver is scheduled to work 502881245dcSWilliam Cohen * on elements in the request queue. 503881245dcSWilliam Cohen */ 50449cac01eSJens Axboe DEFINE_EVENT(block_unplug, block_unplug, 50555782138SLi Zefan 50649cac01eSJens Axboe TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit), 50755782138SLi Zefan 50849cac01eSJens Axboe TP_ARGS(q, depth, explicit) 50955782138SLi Zefan ); 51055782138SLi Zefan 511881245dcSWilliam Cohen /** 512881245dcSWilliam Cohen * block_split - split a single bio struct into two bio structs 513881245dcSWilliam Cohen * @q: queue containing the bio 514881245dcSWilliam Cohen * @bio: block operation being split 515881245dcSWilliam Cohen * @new_sector: The starting sector for the new bio 516881245dcSWilliam Cohen * 517881245dcSWilliam Cohen * The bio request @bio in request queue @q needs to be split into two 518881245dcSWilliam Cohen * bio requests. The newly created @bio request starts at 519881245dcSWilliam Cohen * @new_sector. This split may be required due to hardware limitation 520881245dcSWilliam Cohen * such as operation crossing device boundaries in a RAID system. 521881245dcSWilliam Cohen */ 52255782138SLi Zefan TRACE_EVENT(block_split, 52355782138SLi Zefan 52455782138SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio, 52555782138SLi Zefan unsigned int new_sector), 52655782138SLi Zefan 52755782138SLi Zefan TP_ARGS(q, bio, new_sector), 52855782138SLi Zefan 52955782138SLi Zefan TP_STRUCT__entry( 53055782138SLi Zefan __field( dev_t, dev ) 53155782138SLi Zefan __field( sector_t, sector ) 53255782138SLi Zefan __field( sector_t, new_sector ) 533c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN ) 53455782138SLi Zefan __array( char, comm, TASK_COMM_LEN ) 53555782138SLi Zefan ), 53655782138SLi Zefan 53755782138SLi Zefan TP_fast_assign( 53855782138SLi Zefan __entry->dev = bio->bi_bdev->bd_dev; 5394f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 54055782138SLi Zefan __entry->new_sector = new_sector; 541ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 54255782138SLi Zefan memcpy(__entry->comm, current->comm, TASK_COMM_LEN); 54355782138SLi Zefan ), 54455782138SLi Zefan 54555782138SLi Zefan TP_printk("%d,%d %s %llu / %llu [%s]", 54655782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 5476556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 5486556d1dfSSteven Rostedt (unsigned long long)__entry->new_sector, 5496556d1dfSSteven Rostedt __entry->comm) 55055782138SLi Zefan ); 55155782138SLi Zefan 552881245dcSWilliam Cohen /** 553d07335e5SMike Snitzer * block_bio_remap - map request for a logical device to the raw device 554881245dcSWilliam Cohen * @q: queue holding the operation 555881245dcSWilliam Cohen * @bio: revised operation 556881245dcSWilliam Cohen * @dev: device for the operation 557881245dcSWilliam Cohen * @from: original sector for the operation 558881245dcSWilliam Cohen * 559d07335e5SMike Snitzer * An operation for a logical device has been mapped to the 560881245dcSWilliam Cohen * raw block device. 561881245dcSWilliam Cohen */ 562d07335e5SMike Snitzer TRACE_EVENT(block_bio_remap, 56355782138SLi Zefan 56455782138SLi Zefan TP_PROTO(struct request_queue *q, struct bio *bio, dev_t dev, 56555782138SLi Zefan sector_t from), 56655782138SLi Zefan 56755782138SLi Zefan TP_ARGS(q, bio, dev, from), 56855782138SLi Zefan 56955782138SLi Zefan TP_STRUCT__entry( 57055782138SLi Zefan __field( dev_t, dev ) 57155782138SLi Zefan __field( sector_t, sector ) 57255782138SLi Zefan __field( unsigned int, nr_sector ) 57355782138SLi Zefan __field( dev_t, old_dev ) 57455782138SLi Zefan __field( sector_t, old_sector ) 575c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN) 57655782138SLi Zefan ), 57755782138SLi Zefan 57855782138SLi Zefan TP_fast_assign( 57955782138SLi Zefan __entry->dev = bio->bi_bdev->bd_dev; 5804f024f37SKent Overstreet __entry->sector = bio->bi_iter.bi_sector; 581aa8b57aaSKent Overstreet __entry->nr_sector = bio_sectors(bio); 58255782138SLi Zefan __entry->old_dev = dev; 58355782138SLi Zefan __entry->old_sector = from; 584ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size); 58555782138SLi Zefan ), 58655782138SLi Zefan 58755782138SLi Zefan TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu", 58855782138SLi Zefan MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 5896556d1dfSSteven Rostedt (unsigned long long)__entry->sector, 5906556d1dfSSteven Rostedt __entry->nr_sector, 59155782138SLi Zefan MAJOR(__entry->old_dev), MINOR(__entry->old_dev), 5926556d1dfSSteven Rostedt (unsigned long long)__entry->old_sector) 59355782138SLi Zefan ); 59455782138SLi Zefan 595881245dcSWilliam Cohen /** 596881245dcSWilliam Cohen * block_rq_remap - map request for a block operation request 597881245dcSWilliam Cohen * @q: queue holding the operation 598881245dcSWilliam Cohen * @rq: block IO operation request 599881245dcSWilliam Cohen * @dev: device for the operation 600881245dcSWilliam Cohen * @from: original sector for the operation 601881245dcSWilliam Cohen * 602881245dcSWilliam Cohen * The block operation request @rq in @q has been remapped. The block 603881245dcSWilliam Cohen * operation request @rq holds the current information and @from hold 604881245dcSWilliam Cohen * the original sector. 605881245dcSWilliam Cohen */ 606b0da3f0dSJun'ichi Nomura TRACE_EVENT(block_rq_remap, 607b0da3f0dSJun'ichi Nomura 608b0da3f0dSJun'ichi Nomura TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev, 609b0da3f0dSJun'ichi Nomura sector_t from), 610b0da3f0dSJun'ichi Nomura 611b0da3f0dSJun'ichi Nomura TP_ARGS(q, rq, dev, from), 612b0da3f0dSJun'ichi Nomura 613b0da3f0dSJun'ichi Nomura TP_STRUCT__entry( 614b0da3f0dSJun'ichi Nomura __field( dev_t, dev ) 615b0da3f0dSJun'ichi Nomura __field( sector_t, sector ) 616b0da3f0dSJun'ichi Nomura __field( unsigned int, nr_sector ) 617b0da3f0dSJun'ichi Nomura __field( dev_t, old_dev ) 618b0da3f0dSJun'ichi Nomura __field( sector_t, old_sector ) 61975afb352SJun'ichi Nomura __field( unsigned int, nr_bios ) 620c09c47caSNamhyung Kim __array( char, rwbs, RWBS_LEN) 621b0da3f0dSJun'ichi Nomura ), 622b0da3f0dSJun'ichi Nomura 623b0da3f0dSJun'ichi Nomura TP_fast_assign( 624b0da3f0dSJun'ichi Nomura __entry->dev = disk_devt(rq->rq_disk); 625b0da3f0dSJun'ichi Nomura __entry->sector = blk_rq_pos(rq); 626b0da3f0dSJun'ichi Nomura __entry->nr_sector = blk_rq_sectors(rq); 627b0da3f0dSJun'ichi Nomura __entry->old_dev = dev; 628b0da3f0dSJun'ichi Nomura __entry->old_sector = from; 62975afb352SJun'ichi Nomura __entry->nr_bios = blk_rq_count_bios(rq); 630ef295ecfSChristoph Hellwig blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq)); 631b0da3f0dSJun'ichi Nomura ), 632b0da3f0dSJun'ichi Nomura 63375afb352SJun'ichi Nomura TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u", 634b0da3f0dSJun'ichi Nomura MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs, 635b0da3f0dSJun'ichi Nomura (unsigned long long)__entry->sector, 636b0da3f0dSJun'ichi Nomura __entry->nr_sector, 637b0da3f0dSJun'ichi Nomura MAJOR(__entry->old_dev), MINOR(__entry->old_dev), 63875afb352SJun'ichi Nomura (unsigned long long)__entry->old_sector, __entry->nr_bios) 639b0da3f0dSJun'ichi Nomura ); 640b0da3f0dSJun'ichi Nomura 64155782138SLi Zefan #endif /* _TRACE_BLOCK_H */ 64255782138SLi Zefan 64355782138SLi Zefan /* This part must be outside protection */ 64455782138SLi Zefan #include <trace/define_trace.h> 64555782138SLi Zefan 646