xref: /openbmc/linux/include/trace/events/block.h (revision af5040da01ef980670b3741b3e10733ee3e33566)
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 
6477ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_rq_with_error,
6555782138SLi Zefan 
6655782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
6755782138SLi Zefan 
6855782138SLi Zefan 	TP_ARGS(q, rq),
6955782138SLi Zefan 
7055782138SLi Zefan 	TP_STRUCT__entry(
7155782138SLi Zefan 		__field(  dev_t,	dev			)
7255782138SLi Zefan 		__field(  sector_t,	sector			)
7355782138SLi Zefan 		__field(  unsigned int,	nr_sector		)
7455782138SLi Zefan 		__field(  int,		errors			)
75c09c47caSNamhyung Kim 		__array(  char,		rwbs,	RWBS_LEN	)
7655782138SLi Zefan 		__dynamic_array( char,	cmd,	blk_cmd_buf_len(rq)	)
7755782138SLi Zefan 	),
7855782138SLi Zefan 
7955782138SLi Zefan 	TP_fast_assign(
8055782138SLi Zefan 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
8133659ebbSChristoph Hellwig 		__entry->sector    = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
8233659ebbSChristoph Hellwig 					0 : blk_rq_pos(rq);
8333659ebbSChristoph Hellwig 		__entry->nr_sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
8433659ebbSChristoph Hellwig 					0 : blk_rq_sectors(rq);
8555782138SLi Zefan 		__entry->errors    = rq->errors;
8655782138SLi Zefan 
872d3a8497STao Ma 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
8855782138SLi Zefan 		blk_dump_cmd(__get_str(cmd), rq);
8955782138SLi Zefan 	),
9055782138SLi Zefan 
9155782138SLi Zefan 	TP_printk("%d,%d %s (%s) %llu + %u [%d]",
9255782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev),
9355782138SLi Zefan 		  __entry->rwbs, __get_str(cmd),
946556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
956556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->errors)
9655782138SLi Zefan );
9755782138SLi Zefan 
98881245dcSWilliam Cohen /**
99881245dcSWilliam Cohen  * block_rq_abort - abort block operation request
100881245dcSWilliam Cohen  * @q: queue containing the block operation request
101881245dcSWilliam Cohen  * @rq: block IO operation request
102881245dcSWilliam Cohen  *
103881245dcSWilliam Cohen  * Called immediately after pending block IO operation request @rq in
104881245dcSWilliam Cohen  * queue @q is aborted. The fields in the operation request @rq
105881245dcSWilliam Cohen  * can be examined to determine which device and sectors the pending
106881245dcSWilliam Cohen  * operation would access.
107881245dcSWilliam Cohen  */
10877ca1e02SLi Zefan DEFINE_EVENT(block_rq_with_error, block_rq_abort,
10977ca1e02SLi Zefan 
11077ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
11177ca1e02SLi Zefan 
11277ca1e02SLi Zefan 	TP_ARGS(q, rq)
11377ca1e02SLi Zefan );
11477ca1e02SLi Zefan 
115881245dcSWilliam Cohen /**
116881245dcSWilliam Cohen  * block_rq_requeue - place block IO request back on a queue
117881245dcSWilliam Cohen  * @q: queue holding operation
118881245dcSWilliam Cohen  * @rq: block IO operation request
119881245dcSWilliam Cohen  *
120881245dcSWilliam Cohen  * The block operation request @rq is being placed back into queue
121881245dcSWilliam Cohen  * @q.  For some reason the request was not completed and needs to be
122881245dcSWilliam Cohen  * put back in the queue.
123881245dcSWilliam Cohen  */
12477ca1e02SLi Zefan DEFINE_EVENT(block_rq_with_error, block_rq_requeue,
12577ca1e02SLi Zefan 
12677ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
12777ca1e02SLi Zefan 
12877ca1e02SLi Zefan 	TP_ARGS(q, rq)
12977ca1e02SLi Zefan );
13077ca1e02SLi Zefan 
131881245dcSWilliam Cohen /**
132881245dcSWilliam Cohen  * block_rq_complete - block IO operation completed by device driver
133881245dcSWilliam Cohen  * @q: queue containing the block operation request
134881245dcSWilliam Cohen  * @rq: block operations request
135*af5040daSRoman Pen  * @nr_bytes: number of completed bytes
136881245dcSWilliam Cohen  *
137881245dcSWilliam Cohen  * The block_rq_complete tracepoint event indicates that some portion
138881245dcSWilliam Cohen  * of operation request has been completed by the device driver.  If
139881245dcSWilliam Cohen  * the @rq->bio is %NULL, then there is absolutely no additional work to
140881245dcSWilliam Cohen  * do for the request. If @rq->bio is non-NULL then there is
141881245dcSWilliam Cohen  * additional work required to complete the request.
142881245dcSWilliam Cohen  */
143*af5040daSRoman Pen TRACE_EVENT(block_rq_complete,
14477ca1e02SLi Zefan 
145*af5040daSRoman Pen 	TP_PROTO(struct request_queue *q, struct request *rq,
146*af5040daSRoman Pen 		 unsigned int nr_bytes),
14777ca1e02SLi Zefan 
148*af5040daSRoman Pen 	TP_ARGS(q, rq, nr_bytes),
149*af5040daSRoman Pen 
150*af5040daSRoman Pen 	TP_STRUCT__entry(
151*af5040daSRoman Pen 		__field(  dev_t,	dev			)
152*af5040daSRoman Pen 		__field(  sector_t,	sector			)
153*af5040daSRoman Pen 		__field(  unsigned int,	nr_sector		)
154*af5040daSRoman Pen 		__field(  int,		errors			)
155*af5040daSRoman Pen 		__array(  char,		rwbs,	RWBS_LEN	)
156*af5040daSRoman Pen 		__dynamic_array( char,	cmd,	blk_cmd_buf_len(rq)	)
157*af5040daSRoman Pen 	),
158*af5040daSRoman Pen 
159*af5040daSRoman Pen 	TP_fast_assign(
160*af5040daSRoman Pen 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
161*af5040daSRoman Pen 		__entry->sector    = blk_rq_pos(rq);
162*af5040daSRoman Pen 		__entry->nr_sector = nr_bytes >> 9;
163*af5040daSRoman Pen 		__entry->errors    = rq->errors;
164*af5040daSRoman Pen 
165*af5040daSRoman Pen 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes);
166*af5040daSRoman Pen 		blk_dump_cmd(__get_str(cmd), rq);
167*af5040daSRoman Pen 	),
168*af5040daSRoman Pen 
169*af5040daSRoman Pen 	TP_printk("%d,%d %s (%s) %llu + %u [%d]",
170*af5040daSRoman Pen 		  MAJOR(__entry->dev), MINOR(__entry->dev),
171*af5040daSRoman Pen 		  __entry->rwbs, __get_str(cmd),
172*af5040daSRoman Pen 		  (unsigned long long)__entry->sector,
173*af5040daSRoman Pen 		  __entry->nr_sector, __entry->errors)
17477ca1e02SLi Zefan );
17577ca1e02SLi Zefan 
17677ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_rq,
17755782138SLi Zefan 
17855782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
17955782138SLi Zefan 
18055782138SLi Zefan 	TP_ARGS(q, rq),
18155782138SLi Zefan 
18255782138SLi Zefan 	TP_STRUCT__entry(
18355782138SLi Zefan 		__field(  dev_t,	dev			)
18455782138SLi Zefan 		__field(  sector_t,	sector			)
18555782138SLi Zefan 		__field(  unsigned int,	nr_sector		)
18655782138SLi Zefan 		__field(  unsigned int,	bytes			)
187c09c47caSNamhyung Kim 		__array(  char,		rwbs,	RWBS_LEN	)
18855782138SLi Zefan 		__array(  char,         comm,   TASK_COMM_LEN   )
18955782138SLi Zefan 		__dynamic_array( char,	cmd,	blk_cmd_buf_len(rq)	)
19055782138SLi Zefan 	),
19155782138SLi Zefan 
19255782138SLi Zefan 	TP_fast_assign(
19355782138SLi Zefan 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
19433659ebbSChristoph Hellwig 		__entry->sector    = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
19533659ebbSChristoph Hellwig 					0 : blk_rq_pos(rq);
19633659ebbSChristoph Hellwig 		__entry->nr_sector = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
19733659ebbSChristoph Hellwig 					0 : blk_rq_sectors(rq);
19833659ebbSChristoph Hellwig 		__entry->bytes     = (rq->cmd_type == REQ_TYPE_BLOCK_PC) ?
19933659ebbSChristoph Hellwig 					blk_rq_bytes(rq) : 0;
20055782138SLi Zefan 
2012d3a8497STao Ma 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
20255782138SLi Zefan 		blk_dump_cmd(__get_str(cmd), rq);
20355782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
20455782138SLi Zefan 	),
20555782138SLi Zefan 
20655782138SLi Zefan 	TP_printk("%d,%d %s %u (%s) %llu + %u [%s]",
20755782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev),
20855782138SLi Zefan 		  __entry->rwbs, __entry->bytes, __get_str(cmd),
2096556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
2106556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
21155782138SLi Zefan );
21255782138SLi Zefan 
213881245dcSWilliam Cohen /**
214881245dcSWilliam Cohen  * block_rq_insert - insert block operation request into queue
215881245dcSWilliam Cohen  * @q: target queue
216881245dcSWilliam Cohen  * @rq: block IO operation request
217881245dcSWilliam Cohen  *
218881245dcSWilliam Cohen  * Called immediately before block operation request @rq is inserted
219881245dcSWilliam Cohen  * into queue @q.  The fields in the operation request @rq struct can
220881245dcSWilliam Cohen  * be examined to determine which device and sectors the pending
221881245dcSWilliam Cohen  * operation would access.
222881245dcSWilliam Cohen  */
22377ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_insert,
22455782138SLi Zefan 
22555782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
22655782138SLi Zefan 
22777ca1e02SLi Zefan 	TP_ARGS(q, rq)
22855782138SLi Zefan );
22955782138SLi Zefan 
230881245dcSWilliam Cohen /**
231881245dcSWilliam Cohen  * block_rq_issue - issue pending block IO request operation to device driver
232881245dcSWilliam Cohen  * @q: queue holding operation
233881245dcSWilliam Cohen  * @rq: block IO operation operation request
234881245dcSWilliam Cohen  *
235881245dcSWilliam Cohen  * Called when block operation request @rq from queue @q is sent to a
236881245dcSWilliam Cohen  * device driver for processing.
237881245dcSWilliam Cohen  */
23877ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_issue,
23955782138SLi Zefan 
24055782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
24155782138SLi Zefan 
24277ca1e02SLi Zefan 	TP_ARGS(q, rq)
24355782138SLi Zefan );
244fe63b94aSCarsten Emde 
245881245dcSWilliam Cohen /**
246881245dcSWilliam Cohen  * block_bio_bounce - used bounce buffer when processing block operation
247881245dcSWilliam Cohen  * @q: queue holding the block operation
248881245dcSWilliam Cohen  * @bio: block operation
249881245dcSWilliam Cohen  *
250881245dcSWilliam Cohen  * A bounce buffer was used to handle the block operation @bio in @q.
251881245dcSWilliam Cohen  * This occurs when hardware limitations prevent a direct transfer of
252881245dcSWilliam Cohen  * data between the @bio data memory area and the IO device.  Use of a
253881245dcSWilliam Cohen  * bounce buffer requires extra copying of data and decreases
254881245dcSWilliam Cohen  * performance.
255881245dcSWilliam Cohen  */
25655782138SLi Zefan TRACE_EVENT(block_bio_bounce,
25755782138SLi Zefan 
25855782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio),
25955782138SLi Zefan 
26055782138SLi Zefan 	TP_ARGS(q, bio),
26155782138SLi Zefan 
26255782138SLi Zefan 	TP_STRUCT__entry(
26355782138SLi Zefan 		__field( dev_t,		dev			)
26455782138SLi Zefan 		__field( sector_t,	sector			)
26555782138SLi Zefan 		__field( unsigned int,	nr_sector		)
266c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
26755782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
26855782138SLi Zefan 	),
26955782138SLi Zefan 
27055782138SLi Zefan 	TP_fast_assign(
271fe63b94aSCarsten Emde 		__entry->dev		= bio->bi_bdev ?
272fe63b94aSCarsten Emde 					  bio->bi_bdev->bd_dev : 0;
2734f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
274aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
2754f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
27655782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
27755782138SLi Zefan 	),
27855782138SLi Zefan 
27955782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
28055782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
2816556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
2826556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
28355782138SLi Zefan );
28455782138SLi Zefan 
285881245dcSWilliam Cohen /**
286881245dcSWilliam Cohen  * block_bio_complete - completed all work on the block operation
2870a82a8d1SLinus Torvalds  * @q: queue holding the block operation
288881245dcSWilliam Cohen  * @bio: block operation completed
289b7908c10SJeff Moyer  * @error: io error value
290881245dcSWilliam Cohen  *
291881245dcSWilliam Cohen  * This tracepoint indicates there is no further work to do on this
292881245dcSWilliam Cohen  * block IO operation @bio.
293881245dcSWilliam Cohen  */
29455782138SLi Zefan TRACE_EVENT(block_bio_complete,
29555782138SLi Zefan 
2960a82a8d1SLinus Torvalds 	TP_PROTO(struct request_queue *q, struct bio *bio, int error),
29755782138SLi Zefan 
2980a82a8d1SLinus Torvalds 	TP_ARGS(q, bio, error),
29955782138SLi Zefan 
30055782138SLi Zefan 	TP_STRUCT__entry(
30155782138SLi Zefan 		__field( dev_t,		dev		)
30255782138SLi Zefan 		__field( sector_t,	sector		)
30355782138SLi Zefan 		__field( unsigned,	nr_sector	)
30455782138SLi Zefan 		__field( int,		error		)
305c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
30655782138SLi Zefan 	),
30755782138SLi Zefan 
30855782138SLi Zefan 	TP_fast_assign(
3090a82a8d1SLinus Torvalds 		__entry->dev		= bio->bi_bdev->bd_dev;
3104f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
311aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
312b7908c10SJeff Moyer 		__entry->error		= error;
3134f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
31455782138SLi Zefan 	),
31555782138SLi Zefan 
31655782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%d]",
31755782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
3186556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
3196556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->error)
32055782138SLi Zefan );
32155782138SLi Zefan 
3228c1cf6bbSTejun Heo DECLARE_EVENT_CLASS(block_bio_merge,
32355782138SLi Zefan 
3248c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
32555782138SLi Zefan 
3268c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio),
32755782138SLi Zefan 
32855782138SLi Zefan 	TP_STRUCT__entry(
32955782138SLi Zefan 		__field( dev_t,		dev			)
33055782138SLi Zefan 		__field( sector_t,	sector			)
33155782138SLi Zefan 		__field( unsigned int,	nr_sector		)
332c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
33355782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
33455782138SLi Zefan 	),
33555782138SLi Zefan 
33655782138SLi Zefan 	TP_fast_assign(
33755782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
3384f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
339aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
3404f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
34155782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
34255782138SLi Zefan 	),
34355782138SLi Zefan 
34455782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
34555782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
3466556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
3476556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
34855782138SLi Zefan );
34955782138SLi Zefan 
350881245dcSWilliam Cohen /**
351881245dcSWilliam Cohen  * block_bio_backmerge - merging block operation to the end of an existing operation
352881245dcSWilliam Cohen  * @q: queue holding operation
3538c1cf6bbSTejun Heo  * @rq: request bio is being merged into
354881245dcSWilliam Cohen  * @bio: new block operation to merge
355881245dcSWilliam Cohen  *
356881245dcSWilliam Cohen  * Merging block request @bio to the end of an existing block request
357881245dcSWilliam Cohen  * in queue @q.
358881245dcSWilliam Cohen  */
3598c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_backmerge,
36055782138SLi Zefan 
3618c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
36255782138SLi Zefan 
3638c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio)
36455782138SLi Zefan );
36555782138SLi Zefan 
366881245dcSWilliam Cohen /**
367881245dcSWilliam Cohen  * block_bio_frontmerge - merging block operation to the beginning of an existing operation
368881245dcSWilliam Cohen  * @q: queue holding operation
3698c1cf6bbSTejun Heo  * @rq: request bio is being merged into
370881245dcSWilliam Cohen  * @bio: new block operation to merge
371881245dcSWilliam Cohen  *
372881245dcSWilliam Cohen  * Merging block IO operation @bio to the beginning of an existing block
373881245dcSWilliam Cohen  * operation in queue @q.
374881245dcSWilliam Cohen  */
3758c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_frontmerge,
37655782138SLi Zefan 
3778c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
37855782138SLi Zefan 
3798c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio)
38055782138SLi Zefan );
38155782138SLi Zefan 
382881245dcSWilliam Cohen /**
383881245dcSWilliam Cohen  * block_bio_queue - putting new block IO operation in queue
384881245dcSWilliam Cohen  * @q: queue holding operation
385881245dcSWilliam Cohen  * @bio: new block operation
386881245dcSWilliam Cohen  *
387881245dcSWilliam Cohen  * About to place the block IO operation @bio into queue @q.
388881245dcSWilliam Cohen  */
3898c1cf6bbSTejun Heo TRACE_EVENT(block_bio_queue,
39077ca1e02SLi Zefan 
39177ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio),
39277ca1e02SLi Zefan 
3938c1cf6bbSTejun Heo 	TP_ARGS(q, bio),
3948c1cf6bbSTejun Heo 
3958c1cf6bbSTejun Heo 	TP_STRUCT__entry(
3968c1cf6bbSTejun Heo 		__field( dev_t,		dev			)
3978c1cf6bbSTejun Heo 		__field( sector_t,	sector			)
3988c1cf6bbSTejun Heo 		__field( unsigned int,	nr_sector		)
3998c1cf6bbSTejun Heo 		__array( char,		rwbs,	RWBS_LEN	)
4008c1cf6bbSTejun Heo 		__array( char,		comm,	TASK_COMM_LEN	)
4018c1cf6bbSTejun Heo 	),
4028c1cf6bbSTejun Heo 
4038c1cf6bbSTejun Heo 	TP_fast_assign(
4048c1cf6bbSTejun Heo 		__entry->dev		= bio->bi_bdev->bd_dev;
4054f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
406aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
4074f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
4088c1cf6bbSTejun Heo 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
4098c1cf6bbSTejun Heo 	),
4108c1cf6bbSTejun Heo 
4118c1cf6bbSTejun Heo 	TP_printk("%d,%d %s %llu + %u [%s]",
4128c1cf6bbSTejun Heo 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
4138c1cf6bbSTejun Heo 		  (unsigned long long)__entry->sector,
4148c1cf6bbSTejun Heo 		  __entry->nr_sector, __entry->comm)
41577ca1e02SLi Zefan );
41677ca1e02SLi Zefan 
41777ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_get_rq,
41855782138SLi Zefan 
41955782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
42055782138SLi Zefan 
42155782138SLi Zefan 	TP_ARGS(q, bio, rw),
42255782138SLi Zefan 
42355782138SLi Zefan 	TP_STRUCT__entry(
42455782138SLi Zefan 		__field( dev_t,		dev			)
42555782138SLi Zefan 		__field( sector_t,	sector			)
42655782138SLi Zefan 		__field( unsigned int,	nr_sector		)
427c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
42855782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
42955782138SLi Zefan         ),
43055782138SLi Zefan 
43155782138SLi Zefan 	TP_fast_assign(
43255782138SLi Zefan 		__entry->dev		= bio ? bio->bi_bdev->bd_dev : 0;
4334f024f37SKent Overstreet 		__entry->sector		= bio ? bio->bi_iter.bi_sector : 0;
434aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio ? bio_sectors(bio) : 0;
43555782138SLi Zefan 		blk_fill_rwbs(__entry->rwbs,
43655782138SLi Zefan 			      bio ? bio->bi_rw : 0, __entry->nr_sector);
43755782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
43855782138SLi Zefan         ),
43955782138SLi Zefan 
44055782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
44155782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
4426556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
4436556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
44455782138SLi Zefan );
44555782138SLi Zefan 
446881245dcSWilliam Cohen /**
447881245dcSWilliam Cohen  * block_getrq - get a free request entry in queue for block IO operations
448881245dcSWilliam Cohen  * @q: queue for operations
449881245dcSWilliam Cohen  * @bio: pending block IO operation
450881245dcSWilliam Cohen  * @rw: low bit indicates a read (%0) or a write (%1)
451881245dcSWilliam Cohen  *
452881245dcSWilliam Cohen  * A request struct for queue @q has been allocated to handle the
453881245dcSWilliam Cohen  * block IO operation @bio.
454881245dcSWilliam Cohen  */
45577ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_getrq,
45655782138SLi Zefan 
45755782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
45855782138SLi Zefan 
45977ca1e02SLi Zefan 	TP_ARGS(q, bio, rw)
46077ca1e02SLi Zefan );
46155782138SLi Zefan 
462881245dcSWilliam Cohen /**
463881245dcSWilliam Cohen  * block_sleeprq - waiting to get a free request entry in queue for block IO operation
464881245dcSWilliam Cohen  * @q: queue for operation
465881245dcSWilliam Cohen  * @bio: pending block IO operation
466881245dcSWilliam Cohen  * @rw: low bit indicates a read (%0) or a write (%1)
467881245dcSWilliam Cohen  *
468881245dcSWilliam Cohen  * In the case where a request struct cannot be provided for queue @q
469881245dcSWilliam Cohen  * the process needs to wait for an request struct to become
470881245dcSWilliam Cohen  * available.  This tracepoint event is generated each time the
471881245dcSWilliam Cohen  * process goes to sleep waiting for request struct become available.
472881245dcSWilliam Cohen  */
47377ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_sleeprq,
47455782138SLi Zefan 
47577ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
47655782138SLi Zefan 
47777ca1e02SLi Zefan 	TP_ARGS(q, bio, rw)
47855782138SLi Zefan );
47955782138SLi Zefan 
480881245dcSWilliam Cohen /**
481881245dcSWilliam Cohen  * block_plug - keep operations requests in request queue
482881245dcSWilliam Cohen  * @q: request queue to plug
483881245dcSWilliam Cohen  *
484881245dcSWilliam Cohen  * Plug the request queue @q.  Do not allow block operation requests
485881245dcSWilliam Cohen  * to be sent to the device driver. Instead, accumulate requests in
486881245dcSWilliam Cohen  * the queue to improve throughput performance of the block device.
487881245dcSWilliam Cohen  */
48855782138SLi Zefan TRACE_EVENT(block_plug,
48955782138SLi Zefan 
49055782138SLi Zefan 	TP_PROTO(struct request_queue *q),
49155782138SLi Zefan 
49255782138SLi Zefan 	TP_ARGS(q),
49355782138SLi Zefan 
49455782138SLi Zefan 	TP_STRUCT__entry(
49555782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
49655782138SLi Zefan 	),
49755782138SLi Zefan 
49855782138SLi Zefan 	TP_fast_assign(
49955782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
50055782138SLi Zefan 	),
50155782138SLi Zefan 
50255782138SLi Zefan 	TP_printk("[%s]", __entry->comm)
50355782138SLi Zefan );
50455782138SLi Zefan 
50577ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_unplug,
50655782138SLi Zefan 
50749cac01eSJens Axboe 	TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit),
50855782138SLi Zefan 
50949cac01eSJens Axboe 	TP_ARGS(q, depth, explicit),
51055782138SLi Zefan 
51155782138SLi Zefan 	TP_STRUCT__entry(
51255782138SLi Zefan 		__field( int,		nr_rq			)
51355782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
51455782138SLi Zefan 	),
51555782138SLi Zefan 
51655782138SLi Zefan 	TP_fast_assign(
51794b5eb28SJens Axboe 		__entry->nr_rq = depth;
51855782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
51955782138SLi Zefan 	),
52055782138SLi Zefan 
52155782138SLi Zefan 	TP_printk("[%s] %d", __entry->comm, __entry->nr_rq)
52255782138SLi Zefan );
52355782138SLi Zefan 
524881245dcSWilliam Cohen /**
52549cac01eSJens Axboe  * block_unplug - release of operations requests in request queue
526881245dcSWilliam Cohen  * @q: request queue to unplug
52794b5eb28SJens Axboe  * @depth: number of requests just added to the queue
52849cac01eSJens Axboe  * @explicit: whether this was an explicit unplug, or one from schedule()
529881245dcSWilliam Cohen  *
530881245dcSWilliam Cohen  * Unplug request queue @q because device driver is scheduled to work
531881245dcSWilliam Cohen  * on elements in the request queue.
532881245dcSWilliam Cohen  */
53349cac01eSJens Axboe DEFINE_EVENT(block_unplug, block_unplug,
53455782138SLi Zefan 
53549cac01eSJens Axboe 	TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit),
53655782138SLi Zefan 
53749cac01eSJens Axboe 	TP_ARGS(q, depth, explicit)
53855782138SLi Zefan );
53955782138SLi Zefan 
540881245dcSWilliam Cohen /**
541881245dcSWilliam Cohen  * block_split - split a single bio struct into two bio structs
542881245dcSWilliam Cohen  * @q: queue containing the bio
543881245dcSWilliam Cohen  * @bio: block operation being split
544881245dcSWilliam Cohen  * @new_sector: The starting sector for the new bio
545881245dcSWilliam Cohen  *
546881245dcSWilliam Cohen  * The bio request @bio in request queue @q needs to be split into two
547881245dcSWilliam Cohen  * bio requests. The newly created @bio request starts at
548881245dcSWilliam Cohen  * @new_sector. This split may be required due to hardware limitation
549881245dcSWilliam Cohen  * such as operation crossing device boundaries in a RAID system.
550881245dcSWilliam Cohen  */
55155782138SLi Zefan TRACE_EVENT(block_split,
55255782138SLi Zefan 
55355782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio,
55455782138SLi Zefan 		 unsigned int new_sector),
55555782138SLi Zefan 
55655782138SLi Zefan 	TP_ARGS(q, bio, new_sector),
55755782138SLi Zefan 
55855782138SLi Zefan 	TP_STRUCT__entry(
55955782138SLi Zefan 		__field( dev_t,		dev				)
56055782138SLi Zefan 		__field( sector_t,	sector				)
56155782138SLi Zefan 		__field( sector_t,	new_sector			)
562c09c47caSNamhyung Kim 		__array( char,		rwbs,		RWBS_LEN	)
56355782138SLi Zefan 		__array( char,		comm,		TASK_COMM_LEN	)
56455782138SLi Zefan 	),
56555782138SLi Zefan 
56655782138SLi Zefan 	TP_fast_assign(
56755782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
5684f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
56955782138SLi Zefan 		__entry->new_sector	= new_sector;
5704f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
57155782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
57255782138SLi Zefan 	),
57355782138SLi Zefan 
57455782138SLi Zefan 	TP_printk("%d,%d %s %llu / %llu [%s]",
57555782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
5766556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
5776556d1dfSSteven Rostedt 		  (unsigned long long)__entry->new_sector,
5786556d1dfSSteven Rostedt 		  __entry->comm)
57955782138SLi Zefan );
58055782138SLi Zefan 
581881245dcSWilliam Cohen /**
582d07335e5SMike Snitzer  * block_bio_remap - map request for a logical device to the raw device
583881245dcSWilliam Cohen  * @q: queue holding the operation
584881245dcSWilliam Cohen  * @bio: revised operation
585881245dcSWilliam Cohen  * @dev: device for the operation
586881245dcSWilliam Cohen  * @from: original sector for the operation
587881245dcSWilliam Cohen  *
588d07335e5SMike Snitzer  * An operation for a logical device has been mapped to the
589881245dcSWilliam Cohen  * raw block device.
590881245dcSWilliam Cohen  */
591d07335e5SMike Snitzer TRACE_EVENT(block_bio_remap,
59255782138SLi Zefan 
59355782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, dev_t dev,
59455782138SLi Zefan 		 sector_t from),
59555782138SLi Zefan 
59655782138SLi Zefan 	TP_ARGS(q, bio, dev, from),
59755782138SLi Zefan 
59855782138SLi Zefan 	TP_STRUCT__entry(
59955782138SLi Zefan 		__field( dev_t,		dev		)
60055782138SLi Zefan 		__field( sector_t,	sector		)
60155782138SLi Zefan 		__field( unsigned int,	nr_sector	)
60255782138SLi Zefan 		__field( dev_t,		old_dev		)
60355782138SLi Zefan 		__field( sector_t,	old_sector	)
604c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
60555782138SLi Zefan 	),
60655782138SLi Zefan 
60755782138SLi Zefan 	TP_fast_assign(
60855782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
6094f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
610aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
61155782138SLi Zefan 		__entry->old_dev	= dev;
61255782138SLi Zefan 		__entry->old_sector	= from;
6134f024f37SKent Overstreet 		blk_fill_rwbs(__entry->rwbs, bio->bi_rw, bio->bi_iter.bi_size);
61455782138SLi Zefan 	),
61555782138SLi Zefan 
61655782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu",
61755782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
6186556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
6196556d1dfSSteven Rostedt 		  __entry->nr_sector,
62055782138SLi Zefan 		  MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
6216556d1dfSSteven Rostedt 		  (unsigned long long)__entry->old_sector)
62255782138SLi Zefan );
62355782138SLi Zefan 
624881245dcSWilliam Cohen /**
625881245dcSWilliam Cohen  * block_rq_remap - map request for a block operation request
626881245dcSWilliam Cohen  * @q: queue holding the operation
627881245dcSWilliam Cohen  * @rq: block IO operation request
628881245dcSWilliam Cohen  * @dev: device for the operation
629881245dcSWilliam Cohen  * @from: original sector for the operation
630881245dcSWilliam Cohen  *
631881245dcSWilliam Cohen  * The block operation request @rq in @q has been remapped.  The block
632881245dcSWilliam Cohen  * operation request @rq holds the current information and @from hold
633881245dcSWilliam Cohen  * the original sector.
634881245dcSWilliam Cohen  */
635b0da3f0dSJun'ichi Nomura TRACE_EVENT(block_rq_remap,
636b0da3f0dSJun'ichi Nomura 
637b0da3f0dSJun'ichi Nomura 	TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev,
638b0da3f0dSJun'ichi Nomura 		 sector_t from),
639b0da3f0dSJun'ichi Nomura 
640b0da3f0dSJun'ichi Nomura 	TP_ARGS(q, rq, dev, from),
641b0da3f0dSJun'ichi Nomura 
642b0da3f0dSJun'ichi Nomura 	TP_STRUCT__entry(
643b0da3f0dSJun'ichi Nomura 		__field( dev_t,		dev		)
644b0da3f0dSJun'ichi Nomura 		__field( sector_t,	sector		)
645b0da3f0dSJun'ichi Nomura 		__field( unsigned int,	nr_sector	)
646b0da3f0dSJun'ichi Nomura 		__field( dev_t,		old_dev		)
647b0da3f0dSJun'ichi Nomura 		__field( sector_t,	old_sector	)
64875afb352SJun'ichi Nomura 		__field( unsigned int,	nr_bios		)
649c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
650b0da3f0dSJun'ichi Nomura 	),
651b0da3f0dSJun'ichi Nomura 
652b0da3f0dSJun'ichi Nomura 	TP_fast_assign(
653b0da3f0dSJun'ichi Nomura 		__entry->dev		= disk_devt(rq->rq_disk);
654b0da3f0dSJun'ichi Nomura 		__entry->sector		= blk_rq_pos(rq);
655b0da3f0dSJun'ichi Nomura 		__entry->nr_sector	= blk_rq_sectors(rq);
656b0da3f0dSJun'ichi Nomura 		__entry->old_dev	= dev;
657b0da3f0dSJun'ichi Nomura 		__entry->old_sector	= from;
65875afb352SJun'ichi Nomura 		__entry->nr_bios	= blk_rq_count_bios(rq);
6592d3a8497STao Ma 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
660b0da3f0dSJun'ichi Nomura 	),
661b0da3f0dSJun'ichi Nomura 
66275afb352SJun'ichi Nomura 	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u",
663b0da3f0dSJun'ichi Nomura 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
664b0da3f0dSJun'ichi Nomura 		  (unsigned long long)__entry->sector,
665b0da3f0dSJun'ichi Nomura 		  __entry->nr_sector,
666b0da3f0dSJun'ichi Nomura 		  MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
66775afb352SJun'ichi Nomura 		  (unsigned long long)__entry->old_sector, __entry->nr_bios)
668b0da3f0dSJun'ichi Nomura );
669b0da3f0dSJun'ichi Nomura 
67055782138SLi Zefan #endif /* _TRACE_BLOCK_H */
67155782138SLi Zefan 
67255782138SLi Zefan /* This part must be outside protection */
67355782138SLi Zefan #include <trace/define_trace.h>
67455782138SLi Zefan 
675