xref: /openbmc/linux/include/trace/events/block.h (revision 48b77ad6084481ef9330a5d2bee289966da0975b)
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	)
76*48b77ad6SChristoph Hellwig 		__dynamic_array( char,	cmd,	1		)
7755782138SLi Zefan 	),
7855782138SLi Zefan 
7955782138SLi Zefan 	TP_fast_assign(
8055782138SLi Zefan 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
81*48b77ad6SChristoph Hellwig 		__entry->sector    = blk_rq_trace_sector(rq);
82*48b77ad6SChristoph Hellwig 		__entry->nr_sector = blk_rq_trace_nr_sectors(rq);
8355782138SLi Zefan 		__entry->errors    = rq->errors;
8455782138SLi Zefan 
85ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
86*48b77ad6SChristoph Hellwig 		__get_str(cmd)[0] = '\0';
8755782138SLi Zefan 	),
8855782138SLi Zefan 
8955782138SLi Zefan 	TP_printk("%d,%d %s (%s) %llu + %u [%d]",
9055782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev),
9155782138SLi Zefan 		  __entry->rwbs, __get_str(cmd),
926556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
936556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->errors)
9455782138SLi Zefan );
9555782138SLi Zefan 
96881245dcSWilliam Cohen /**
97881245dcSWilliam Cohen  * block_rq_abort - abort block operation request
98881245dcSWilliam Cohen  * @q: queue containing the block operation request
99881245dcSWilliam Cohen  * @rq: block IO operation request
100881245dcSWilliam Cohen  *
101881245dcSWilliam Cohen  * Called immediately after pending block IO operation request @rq in
102881245dcSWilliam Cohen  * queue @q is aborted. The fields in the operation request @rq
103881245dcSWilliam Cohen  * can be examined to determine which device and sectors the pending
104881245dcSWilliam Cohen  * operation would access.
105881245dcSWilliam Cohen  */
10677ca1e02SLi Zefan DEFINE_EVENT(block_rq_with_error, block_rq_abort,
10777ca1e02SLi Zefan 
10877ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
10977ca1e02SLi Zefan 
11077ca1e02SLi Zefan 	TP_ARGS(q, rq)
11177ca1e02SLi Zefan );
11277ca1e02SLi Zefan 
113881245dcSWilliam Cohen /**
114881245dcSWilliam Cohen  * block_rq_requeue - place block IO request back on a queue
115881245dcSWilliam Cohen  * @q: queue holding operation
116881245dcSWilliam Cohen  * @rq: block IO operation request
117881245dcSWilliam Cohen  *
118881245dcSWilliam Cohen  * The block operation request @rq is being placed back into queue
119881245dcSWilliam Cohen  * @q.  For some reason the request was not completed and needs to be
120881245dcSWilliam Cohen  * put back in the queue.
121881245dcSWilliam Cohen  */
12277ca1e02SLi Zefan DEFINE_EVENT(block_rq_with_error, block_rq_requeue,
12377ca1e02SLi Zefan 
12477ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
12577ca1e02SLi Zefan 
12677ca1e02SLi Zefan 	TP_ARGS(q, rq)
12777ca1e02SLi Zefan );
12877ca1e02SLi Zefan 
129881245dcSWilliam Cohen /**
130881245dcSWilliam Cohen  * block_rq_complete - block IO operation completed by device driver
131881245dcSWilliam Cohen  * @q: queue containing the block operation request
132881245dcSWilliam Cohen  * @rq: block operations request
133af5040daSRoman Pen  * @nr_bytes: number of completed bytes
134881245dcSWilliam Cohen  *
135881245dcSWilliam Cohen  * The block_rq_complete tracepoint event indicates that some portion
136881245dcSWilliam Cohen  * of operation request has been completed by the device driver.  If
137881245dcSWilliam Cohen  * the @rq->bio is %NULL, then there is absolutely no additional work to
138881245dcSWilliam Cohen  * do for the request. If @rq->bio is non-NULL then there is
139881245dcSWilliam Cohen  * additional work required to complete the request.
140881245dcSWilliam Cohen  */
141af5040daSRoman Pen TRACE_EVENT(block_rq_complete,
14277ca1e02SLi Zefan 
143af5040daSRoman Pen 	TP_PROTO(struct request_queue *q, struct request *rq,
144af5040daSRoman Pen 		 unsigned int nr_bytes),
14577ca1e02SLi Zefan 
146af5040daSRoman Pen 	TP_ARGS(q, rq, nr_bytes),
147af5040daSRoman Pen 
148af5040daSRoman Pen 	TP_STRUCT__entry(
149af5040daSRoman Pen 		__field(  dev_t,	dev			)
150af5040daSRoman Pen 		__field(  sector_t,	sector			)
151af5040daSRoman Pen 		__field(  unsigned int,	nr_sector		)
152af5040daSRoman Pen 		__field(  int,		errors			)
153af5040daSRoman Pen 		__array(  char,		rwbs,	RWBS_LEN	)
154*48b77ad6SChristoph Hellwig 		__dynamic_array( char,	cmd,	1		)
155af5040daSRoman Pen 	),
156af5040daSRoman Pen 
157af5040daSRoman Pen 	TP_fast_assign(
158af5040daSRoman Pen 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
159af5040daSRoman Pen 		__entry->sector    = blk_rq_pos(rq);
160af5040daSRoman Pen 		__entry->nr_sector = nr_bytes >> 9;
161af5040daSRoman Pen 		__entry->errors    = rq->errors;
162af5040daSRoman Pen 
163ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, nr_bytes);
164*48b77ad6SChristoph Hellwig 		__get_str(cmd)[0] = '\0';
165af5040daSRoman Pen 	),
166af5040daSRoman Pen 
167af5040daSRoman Pen 	TP_printk("%d,%d %s (%s) %llu + %u [%d]",
168af5040daSRoman Pen 		  MAJOR(__entry->dev), MINOR(__entry->dev),
169af5040daSRoman Pen 		  __entry->rwbs, __get_str(cmd),
170af5040daSRoman Pen 		  (unsigned long long)__entry->sector,
171af5040daSRoman Pen 		  __entry->nr_sector, __entry->errors)
17277ca1e02SLi Zefan );
17377ca1e02SLi Zefan 
17477ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_rq,
17555782138SLi Zefan 
17655782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
17755782138SLi Zefan 
17855782138SLi Zefan 	TP_ARGS(q, rq),
17955782138SLi Zefan 
18055782138SLi Zefan 	TP_STRUCT__entry(
18155782138SLi Zefan 		__field(  dev_t,	dev			)
18255782138SLi Zefan 		__field(  sector_t,	sector			)
18355782138SLi Zefan 		__field(  unsigned int,	nr_sector		)
18455782138SLi Zefan 		__field(  unsigned int,	bytes			)
185c09c47caSNamhyung Kim 		__array(  char,		rwbs,	RWBS_LEN	)
18655782138SLi Zefan 		__array(  char,         comm,   TASK_COMM_LEN   )
187*48b77ad6SChristoph Hellwig 		__dynamic_array( char,	cmd,	1		)
18855782138SLi Zefan 	),
18955782138SLi Zefan 
19055782138SLi Zefan 	TP_fast_assign(
19155782138SLi Zefan 		__entry->dev	   = rq->rq_disk ? disk_devt(rq->rq_disk) : 0;
192*48b77ad6SChristoph Hellwig 		__entry->sector    = blk_rq_trace_sector(rq);
193*48b77ad6SChristoph Hellwig 		__entry->nr_sector = blk_rq_trace_nr_sectors(rq);
194*48b77ad6SChristoph Hellwig 		__entry->bytes     = blk_rq_bytes(rq);
19555782138SLi Zefan 
196ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
197*48b77ad6SChristoph Hellwig 		__get_str(cmd)[0] = '\0';
19855782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
19955782138SLi Zefan 	),
20055782138SLi Zefan 
20155782138SLi Zefan 	TP_printk("%d,%d %s %u (%s) %llu + %u [%s]",
20255782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev),
20355782138SLi Zefan 		  __entry->rwbs, __entry->bytes, __get_str(cmd),
2046556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
2056556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
20655782138SLi Zefan );
20755782138SLi Zefan 
208881245dcSWilliam Cohen /**
209881245dcSWilliam Cohen  * block_rq_insert - insert block operation request into queue
210881245dcSWilliam Cohen  * @q: target queue
211881245dcSWilliam Cohen  * @rq: block IO operation request
212881245dcSWilliam Cohen  *
213881245dcSWilliam Cohen  * Called immediately before block operation request @rq is inserted
214881245dcSWilliam Cohen  * into queue @q.  The fields in the operation request @rq struct can
215881245dcSWilliam Cohen  * be examined to determine which device and sectors the pending
216881245dcSWilliam Cohen  * operation would access.
217881245dcSWilliam Cohen  */
21877ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_insert,
21955782138SLi Zefan 
22055782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
22155782138SLi Zefan 
22277ca1e02SLi Zefan 	TP_ARGS(q, rq)
22355782138SLi Zefan );
22455782138SLi Zefan 
225881245dcSWilliam Cohen /**
226881245dcSWilliam Cohen  * block_rq_issue - issue pending block IO request operation to device driver
227881245dcSWilliam Cohen  * @q: queue holding operation
228881245dcSWilliam Cohen  * @rq: block IO operation operation request
229881245dcSWilliam Cohen  *
230881245dcSWilliam Cohen  * Called when block operation request @rq from queue @q is sent to a
231881245dcSWilliam Cohen  * device driver for processing.
232881245dcSWilliam Cohen  */
23377ca1e02SLi Zefan DEFINE_EVENT(block_rq, block_rq_issue,
23455782138SLi Zefan 
23555782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct request *rq),
23655782138SLi Zefan 
23777ca1e02SLi Zefan 	TP_ARGS(q, rq)
23855782138SLi Zefan );
239fe63b94aSCarsten Emde 
240881245dcSWilliam Cohen /**
241881245dcSWilliam Cohen  * block_bio_bounce - used bounce buffer when processing block operation
242881245dcSWilliam Cohen  * @q: queue holding the block operation
243881245dcSWilliam Cohen  * @bio: block operation
244881245dcSWilliam Cohen  *
245881245dcSWilliam Cohen  * A bounce buffer was used to handle the block operation @bio in @q.
246881245dcSWilliam Cohen  * This occurs when hardware limitations prevent a direct transfer of
247881245dcSWilliam Cohen  * data between the @bio data memory area and the IO device.  Use of a
248881245dcSWilliam Cohen  * bounce buffer requires extra copying of data and decreases
249881245dcSWilliam Cohen  * performance.
250881245dcSWilliam Cohen  */
25155782138SLi Zefan TRACE_EVENT(block_bio_bounce,
25255782138SLi Zefan 
25355782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio),
25455782138SLi Zefan 
25555782138SLi Zefan 	TP_ARGS(q, bio),
25655782138SLi Zefan 
25755782138SLi Zefan 	TP_STRUCT__entry(
25855782138SLi Zefan 		__field( dev_t,		dev			)
25955782138SLi Zefan 		__field( sector_t,	sector			)
26055782138SLi Zefan 		__field( unsigned int,	nr_sector		)
261c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
26255782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
26355782138SLi Zefan 	),
26455782138SLi Zefan 
26555782138SLi Zefan 	TP_fast_assign(
266fe63b94aSCarsten Emde 		__entry->dev		= bio->bi_bdev ?
267fe63b94aSCarsten Emde 					  bio->bi_bdev->bd_dev : 0;
2684f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
269aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
270ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
27155782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
27255782138SLi Zefan 	),
27355782138SLi Zefan 
27455782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
27555782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
2766556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
2776556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
27855782138SLi Zefan );
27955782138SLi Zefan 
280881245dcSWilliam Cohen /**
281881245dcSWilliam Cohen  * block_bio_complete - completed all work on the block operation
2820a82a8d1SLinus Torvalds  * @q: queue holding the block operation
283881245dcSWilliam Cohen  * @bio: block operation completed
284b7908c10SJeff Moyer  * @error: io error value
285881245dcSWilliam Cohen  *
286881245dcSWilliam Cohen  * This tracepoint indicates there is no further work to do on this
287881245dcSWilliam Cohen  * block IO operation @bio.
288881245dcSWilliam Cohen  */
28955782138SLi Zefan TRACE_EVENT(block_bio_complete,
29055782138SLi Zefan 
2910a82a8d1SLinus Torvalds 	TP_PROTO(struct request_queue *q, struct bio *bio, int error),
29255782138SLi Zefan 
2930a82a8d1SLinus Torvalds 	TP_ARGS(q, bio, error),
29455782138SLi Zefan 
29555782138SLi Zefan 	TP_STRUCT__entry(
29655782138SLi Zefan 		__field( dev_t,		dev		)
29755782138SLi Zefan 		__field( sector_t,	sector		)
29855782138SLi Zefan 		__field( unsigned,	nr_sector	)
29955782138SLi Zefan 		__field( int,		error		)
300c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
30155782138SLi Zefan 	),
30255782138SLi Zefan 
30355782138SLi Zefan 	TP_fast_assign(
3040a82a8d1SLinus Torvalds 		__entry->dev		= bio->bi_bdev->bd_dev;
3054f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
306aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
307b7908c10SJeff Moyer 		__entry->error		= error;
308ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
30955782138SLi Zefan 	),
31055782138SLi Zefan 
31155782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%d]",
31255782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
3136556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
3146556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->error)
31555782138SLi Zefan );
31655782138SLi Zefan 
3178c1cf6bbSTejun Heo DECLARE_EVENT_CLASS(block_bio_merge,
31855782138SLi Zefan 
3198c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
32055782138SLi Zefan 
3218c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio),
32255782138SLi Zefan 
32355782138SLi Zefan 	TP_STRUCT__entry(
32455782138SLi Zefan 		__field( dev_t,		dev			)
32555782138SLi Zefan 		__field( sector_t,	sector			)
32655782138SLi Zefan 		__field( unsigned int,	nr_sector		)
327c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
32855782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
32955782138SLi Zefan 	),
33055782138SLi Zefan 
33155782138SLi Zefan 	TP_fast_assign(
33255782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
3334f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
334aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
335ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
33655782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
33755782138SLi Zefan 	),
33855782138SLi Zefan 
33955782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
34055782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
3416556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
3426556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
34355782138SLi Zefan );
34455782138SLi Zefan 
345881245dcSWilliam Cohen /**
346881245dcSWilliam Cohen  * block_bio_backmerge - merging block operation to the end of an existing operation
347881245dcSWilliam Cohen  * @q: queue holding operation
3488c1cf6bbSTejun Heo  * @rq: request bio is being merged into
349881245dcSWilliam Cohen  * @bio: new block operation to merge
350881245dcSWilliam Cohen  *
351881245dcSWilliam Cohen  * Merging block request @bio to the end of an existing block request
352881245dcSWilliam Cohen  * in queue @q.
353881245dcSWilliam Cohen  */
3548c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_backmerge,
35555782138SLi Zefan 
3568c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
35755782138SLi Zefan 
3588c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio)
35955782138SLi Zefan );
36055782138SLi Zefan 
361881245dcSWilliam Cohen /**
362881245dcSWilliam Cohen  * block_bio_frontmerge - merging block operation to the beginning of an existing operation
363881245dcSWilliam Cohen  * @q: queue holding operation
3648c1cf6bbSTejun Heo  * @rq: request bio is being merged into
365881245dcSWilliam Cohen  * @bio: new block operation to merge
366881245dcSWilliam Cohen  *
367881245dcSWilliam Cohen  * Merging block IO operation @bio to the beginning of an existing block
368881245dcSWilliam Cohen  * operation in queue @q.
369881245dcSWilliam Cohen  */
3708c1cf6bbSTejun Heo DEFINE_EVENT(block_bio_merge, block_bio_frontmerge,
37155782138SLi Zefan 
3728c1cf6bbSTejun Heo 	TP_PROTO(struct request_queue *q, struct request *rq, struct bio *bio),
37355782138SLi Zefan 
3748c1cf6bbSTejun Heo 	TP_ARGS(q, rq, bio)
37555782138SLi Zefan );
37655782138SLi Zefan 
377881245dcSWilliam Cohen /**
378881245dcSWilliam Cohen  * block_bio_queue - putting new block IO operation in queue
379881245dcSWilliam Cohen  * @q: queue holding operation
380881245dcSWilliam Cohen  * @bio: new block operation
381881245dcSWilliam Cohen  *
382881245dcSWilliam Cohen  * About to place the block IO operation @bio into queue @q.
383881245dcSWilliam Cohen  */
3848c1cf6bbSTejun Heo TRACE_EVENT(block_bio_queue,
38577ca1e02SLi Zefan 
38677ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio),
38777ca1e02SLi Zefan 
3888c1cf6bbSTejun Heo 	TP_ARGS(q, bio),
3898c1cf6bbSTejun Heo 
3908c1cf6bbSTejun Heo 	TP_STRUCT__entry(
3918c1cf6bbSTejun Heo 		__field( dev_t,		dev			)
3928c1cf6bbSTejun Heo 		__field( sector_t,	sector			)
3938c1cf6bbSTejun Heo 		__field( unsigned int,	nr_sector		)
3948c1cf6bbSTejun Heo 		__array( char,		rwbs,	RWBS_LEN	)
3958c1cf6bbSTejun Heo 		__array( char,		comm,	TASK_COMM_LEN	)
3968c1cf6bbSTejun Heo 	),
3978c1cf6bbSTejun Heo 
3988c1cf6bbSTejun Heo 	TP_fast_assign(
3998c1cf6bbSTejun Heo 		__entry->dev		= bio->bi_bdev->bd_dev;
4004f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
401aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
402ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
4038c1cf6bbSTejun Heo 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
4048c1cf6bbSTejun Heo 	),
4058c1cf6bbSTejun Heo 
4068c1cf6bbSTejun Heo 	TP_printk("%d,%d %s %llu + %u [%s]",
4078c1cf6bbSTejun Heo 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
4088c1cf6bbSTejun Heo 		  (unsigned long long)__entry->sector,
4098c1cf6bbSTejun Heo 		  __entry->nr_sector, __entry->comm)
41077ca1e02SLi Zefan );
41177ca1e02SLi Zefan 
41277ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_get_rq,
41355782138SLi Zefan 
41455782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
41555782138SLi Zefan 
41655782138SLi Zefan 	TP_ARGS(q, bio, rw),
41755782138SLi Zefan 
41855782138SLi Zefan 	TP_STRUCT__entry(
41955782138SLi Zefan 		__field( dev_t,		dev			)
42055782138SLi Zefan 		__field( sector_t,	sector			)
42155782138SLi Zefan 		__field( unsigned int,	nr_sector		)
422c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN	)
42355782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
42455782138SLi Zefan         ),
42555782138SLi Zefan 
42655782138SLi Zefan 	TP_fast_assign(
42755782138SLi Zefan 		__entry->dev		= bio ? bio->bi_bdev->bd_dev : 0;
4284f024f37SKent Overstreet 		__entry->sector		= bio ? bio->bi_iter.bi_sector : 0;
429aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio ? bio_sectors(bio) : 0;
430ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs,
4311eff9d32SJens Axboe 			      bio ? bio->bi_opf : 0, __entry->nr_sector);
43255782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
43355782138SLi Zefan         ),
43455782138SLi Zefan 
43555782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u [%s]",
43655782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
4376556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
4386556d1dfSSteven Rostedt 		  __entry->nr_sector, __entry->comm)
43955782138SLi Zefan );
44055782138SLi Zefan 
441881245dcSWilliam Cohen /**
442881245dcSWilliam Cohen  * block_getrq - get a free request entry in queue for block IO operations
443881245dcSWilliam Cohen  * @q: queue for operations
444881245dcSWilliam Cohen  * @bio: pending block IO operation
445881245dcSWilliam Cohen  * @rw: low bit indicates a read (%0) or a write (%1)
446881245dcSWilliam Cohen  *
447881245dcSWilliam Cohen  * A request struct for queue @q has been allocated to handle the
448881245dcSWilliam Cohen  * block IO operation @bio.
449881245dcSWilliam Cohen  */
45077ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_getrq,
45155782138SLi Zefan 
45255782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
45355782138SLi Zefan 
45477ca1e02SLi Zefan 	TP_ARGS(q, bio, rw)
45577ca1e02SLi Zefan );
45655782138SLi Zefan 
457881245dcSWilliam Cohen /**
458881245dcSWilliam Cohen  * block_sleeprq - waiting to get a free request entry in queue for block IO operation
459881245dcSWilliam Cohen  * @q: queue for operation
460881245dcSWilliam Cohen  * @bio: pending block IO operation
461881245dcSWilliam Cohen  * @rw: low bit indicates a read (%0) or a write (%1)
462881245dcSWilliam Cohen  *
463881245dcSWilliam Cohen  * In the case where a request struct cannot be provided for queue @q
464881245dcSWilliam Cohen  * the process needs to wait for an request struct to become
465881245dcSWilliam Cohen  * available.  This tracepoint event is generated each time the
466881245dcSWilliam Cohen  * process goes to sleep waiting for request struct become available.
467881245dcSWilliam Cohen  */
46877ca1e02SLi Zefan DEFINE_EVENT(block_get_rq, block_sleeprq,
46955782138SLi Zefan 
47077ca1e02SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, int rw),
47155782138SLi Zefan 
47277ca1e02SLi Zefan 	TP_ARGS(q, bio, rw)
47355782138SLi Zefan );
47455782138SLi Zefan 
475881245dcSWilliam Cohen /**
476881245dcSWilliam Cohen  * block_plug - keep operations requests in request queue
477881245dcSWilliam Cohen  * @q: request queue to plug
478881245dcSWilliam Cohen  *
479881245dcSWilliam Cohen  * Plug the request queue @q.  Do not allow block operation requests
480881245dcSWilliam Cohen  * to be sent to the device driver. Instead, accumulate requests in
481881245dcSWilliam Cohen  * the queue to improve throughput performance of the block device.
482881245dcSWilliam Cohen  */
48355782138SLi Zefan TRACE_EVENT(block_plug,
48455782138SLi Zefan 
48555782138SLi Zefan 	TP_PROTO(struct request_queue *q),
48655782138SLi Zefan 
48755782138SLi Zefan 	TP_ARGS(q),
48855782138SLi Zefan 
48955782138SLi Zefan 	TP_STRUCT__entry(
49055782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
49155782138SLi Zefan 	),
49255782138SLi Zefan 
49355782138SLi Zefan 	TP_fast_assign(
49455782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
49555782138SLi Zefan 	),
49655782138SLi Zefan 
49755782138SLi Zefan 	TP_printk("[%s]", __entry->comm)
49855782138SLi Zefan );
49955782138SLi Zefan 
50077ca1e02SLi Zefan DECLARE_EVENT_CLASS(block_unplug,
50155782138SLi Zefan 
50249cac01eSJens Axboe 	TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit),
50355782138SLi Zefan 
50449cac01eSJens Axboe 	TP_ARGS(q, depth, explicit),
50555782138SLi Zefan 
50655782138SLi Zefan 	TP_STRUCT__entry(
50755782138SLi Zefan 		__field( int,		nr_rq			)
50855782138SLi Zefan 		__array( char,		comm,	TASK_COMM_LEN	)
50955782138SLi Zefan 	),
51055782138SLi Zefan 
51155782138SLi Zefan 	TP_fast_assign(
51294b5eb28SJens Axboe 		__entry->nr_rq = depth;
51355782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
51455782138SLi Zefan 	),
51555782138SLi Zefan 
51655782138SLi Zefan 	TP_printk("[%s] %d", __entry->comm, __entry->nr_rq)
51755782138SLi Zefan );
51855782138SLi Zefan 
519881245dcSWilliam Cohen /**
52049cac01eSJens Axboe  * block_unplug - release of operations requests in request queue
521881245dcSWilliam Cohen  * @q: request queue to unplug
52294b5eb28SJens Axboe  * @depth: number of requests just added to the queue
52349cac01eSJens Axboe  * @explicit: whether this was an explicit unplug, or one from schedule()
524881245dcSWilliam Cohen  *
525881245dcSWilliam Cohen  * Unplug request queue @q because device driver is scheduled to work
526881245dcSWilliam Cohen  * on elements in the request queue.
527881245dcSWilliam Cohen  */
52849cac01eSJens Axboe DEFINE_EVENT(block_unplug, block_unplug,
52955782138SLi Zefan 
53049cac01eSJens Axboe 	TP_PROTO(struct request_queue *q, unsigned int depth, bool explicit),
53155782138SLi Zefan 
53249cac01eSJens Axboe 	TP_ARGS(q, depth, explicit)
53355782138SLi Zefan );
53455782138SLi Zefan 
535881245dcSWilliam Cohen /**
536881245dcSWilliam Cohen  * block_split - split a single bio struct into two bio structs
537881245dcSWilliam Cohen  * @q: queue containing the bio
538881245dcSWilliam Cohen  * @bio: block operation being split
539881245dcSWilliam Cohen  * @new_sector: The starting sector for the new bio
540881245dcSWilliam Cohen  *
541881245dcSWilliam Cohen  * The bio request @bio in request queue @q needs to be split into two
542881245dcSWilliam Cohen  * bio requests. The newly created @bio request starts at
543881245dcSWilliam Cohen  * @new_sector. This split may be required due to hardware limitation
544881245dcSWilliam Cohen  * such as operation crossing device boundaries in a RAID system.
545881245dcSWilliam Cohen  */
54655782138SLi Zefan TRACE_EVENT(block_split,
54755782138SLi Zefan 
54855782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio,
54955782138SLi Zefan 		 unsigned int new_sector),
55055782138SLi Zefan 
55155782138SLi Zefan 	TP_ARGS(q, bio, new_sector),
55255782138SLi Zefan 
55355782138SLi Zefan 	TP_STRUCT__entry(
55455782138SLi Zefan 		__field( dev_t,		dev				)
55555782138SLi Zefan 		__field( sector_t,	sector				)
55655782138SLi Zefan 		__field( sector_t,	new_sector			)
557c09c47caSNamhyung Kim 		__array( char,		rwbs,		RWBS_LEN	)
55855782138SLi Zefan 		__array( char,		comm,		TASK_COMM_LEN	)
55955782138SLi Zefan 	),
56055782138SLi Zefan 
56155782138SLi Zefan 	TP_fast_assign(
56255782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
5634f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
56455782138SLi Zefan 		__entry->new_sector	= new_sector;
565ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
56655782138SLi Zefan 		memcpy(__entry->comm, current->comm, TASK_COMM_LEN);
56755782138SLi Zefan 	),
56855782138SLi Zefan 
56955782138SLi Zefan 	TP_printk("%d,%d %s %llu / %llu [%s]",
57055782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
5716556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
5726556d1dfSSteven Rostedt 		  (unsigned long long)__entry->new_sector,
5736556d1dfSSteven Rostedt 		  __entry->comm)
57455782138SLi Zefan );
57555782138SLi Zefan 
576881245dcSWilliam Cohen /**
577d07335e5SMike Snitzer  * block_bio_remap - map request for a logical device to the raw device
578881245dcSWilliam Cohen  * @q: queue holding the operation
579881245dcSWilliam Cohen  * @bio: revised operation
580881245dcSWilliam Cohen  * @dev: device for the operation
581881245dcSWilliam Cohen  * @from: original sector for the operation
582881245dcSWilliam Cohen  *
583d07335e5SMike Snitzer  * An operation for a logical device has been mapped to the
584881245dcSWilliam Cohen  * raw block device.
585881245dcSWilliam Cohen  */
586d07335e5SMike Snitzer TRACE_EVENT(block_bio_remap,
58755782138SLi Zefan 
58855782138SLi Zefan 	TP_PROTO(struct request_queue *q, struct bio *bio, dev_t dev,
58955782138SLi Zefan 		 sector_t from),
59055782138SLi Zefan 
59155782138SLi Zefan 	TP_ARGS(q, bio, dev, from),
59255782138SLi Zefan 
59355782138SLi Zefan 	TP_STRUCT__entry(
59455782138SLi Zefan 		__field( dev_t,		dev		)
59555782138SLi Zefan 		__field( sector_t,	sector		)
59655782138SLi Zefan 		__field( unsigned int,	nr_sector	)
59755782138SLi Zefan 		__field( dev_t,		old_dev		)
59855782138SLi Zefan 		__field( sector_t,	old_sector	)
599c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
60055782138SLi Zefan 	),
60155782138SLi Zefan 
60255782138SLi Zefan 	TP_fast_assign(
60355782138SLi Zefan 		__entry->dev		= bio->bi_bdev->bd_dev;
6044f024f37SKent Overstreet 		__entry->sector		= bio->bi_iter.bi_sector;
605aa8b57aaSKent Overstreet 		__entry->nr_sector	= bio_sectors(bio);
60655782138SLi Zefan 		__entry->old_dev	= dev;
60755782138SLi Zefan 		__entry->old_sector	= from;
608ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, bio->bi_opf, bio->bi_iter.bi_size);
60955782138SLi Zefan 	),
61055782138SLi Zefan 
61155782138SLi Zefan 	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu",
61255782138SLi Zefan 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
6136556d1dfSSteven Rostedt 		  (unsigned long long)__entry->sector,
6146556d1dfSSteven Rostedt 		  __entry->nr_sector,
61555782138SLi Zefan 		  MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
6166556d1dfSSteven Rostedt 		  (unsigned long long)__entry->old_sector)
61755782138SLi Zefan );
61855782138SLi Zefan 
619881245dcSWilliam Cohen /**
620881245dcSWilliam Cohen  * block_rq_remap - map request for a block operation request
621881245dcSWilliam Cohen  * @q: queue holding the operation
622881245dcSWilliam Cohen  * @rq: block IO operation request
623881245dcSWilliam Cohen  * @dev: device for the operation
624881245dcSWilliam Cohen  * @from: original sector for the operation
625881245dcSWilliam Cohen  *
626881245dcSWilliam Cohen  * The block operation request @rq in @q has been remapped.  The block
627881245dcSWilliam Cohen  * operation request @rq holds the current information and @from hold
628881245dcSWilliam Cohen  * the original sector.
629881245dcSWilliam Cohen  */
630b0da3f0dSJun'ichi Nomura TRACE_EVENT(block_rq_remap,
631b0da3f0dSJun'ichi Nomura 
632b0da3f0dSJun'ichi Nomura 	TP_PROTO(struct request_queue *q, struct request *rq, dev_t dev,
633b0da3f0dSJun'ichi Nomura 		 sector_t from),
634b0da3f0dSJun'ichi Nomura 
635b0da3f0dSJun'ichi Nomura 	TP_ARGS(q, rq, dev, from),
636b0da3f0dSJun'ichi Nomura 
637b0da3f0dSJun'ichi Nomura 	TP_STRUCT__entry(
638b0da3f0dSJun'ichi Nomura 		__field( dev_t,		dev		)
639b0da3f0dSJun'ichi Nomura 		__field( sector_t,	sector		)
640b0da3f0dSJun'ichi Nomura 		__field( unsigned int,	nr_sector	)
641b0da3f0dSJun'ichi Nomura 		__field( dev_t,		old_dev		)
642b0da3f0dSJun'ichi Nomura 		__field( sector_t,	old_sector	)
64375afb352SJun'ichi Nomura 		__field( unsigned int,	nr_bios		)
644c09c47caSNamhyung Kim 		__array( char,		rwbs,	RWBS_LEN)
645b0da3f0dSJun'ichi Nomura 	),
646b0da3f0dSJun'ichi Nomura 
647b0da3f0dSJun'ichi Nomura 	TP_fast_assign(
648b0da3f0dSJun'ichi Nomura 		__entry->dev		= disk_devt(rq->rq_disk);
649b0da3f0dSJun'ichi Nomura 		__entry->sector		= blk_rq_pos(rq);
650b0da3f0dSJun'ichi Nomura 		__entry->nr_sector	= blk_rq_sectors(rq);
651b0da3f0dSJun'ichi Nomura 		__entry->old_dev	= dev;
652b0da3f0dSJun'ichi Nomura 		__entry->old_sector	= from;
65375afb352SJun'ichi Nomura 		__entry->nr_bios	= blk_rq_count_bios(rq);
654ef295ecfSChristoph Hellwig 		blk_fill_rwbs(__entry->rwbs, rq->cmd_flags, blk_rq_bytes(rq));
655b0da3f0dSJun'ichi Nomura 	),
656b0da3f0dSJun'ichi Nomura 
65775afb352SJun'ichi Nomura 	TP_printk("%d,%d %s %llu + %u <- (%d,%d) %llu %u",
658b0da3f0dSJun'ichi Nomura 		  MAJOR(__entry->dev), MINOR(__entry->dev), __entry->rwbs,
659b0da3f0dSJun'ichi Nomura 		  (unsigned long long)__entry->sector,
660b0da3f0dSJun'ichi Nomura 		  __entry->nr_sector,
661b0da3f0dSJun'ichi Nomura 		  MAJOR(__entry->old_dev), MINOR(__entry->old_dev),
66275afb352SJun'ichi Nomura 		  (unsigned long long)__entry->old_sector, __entry->nr_bios)
663b0da3f0dSJun'ichi Nomura );
664b0da3f0dSJun'ichi Nomura 
66555782138SLi Zefan #endif /* _TRACE_BLOCK_H */
66655782138SLi Zefan 
66755782138SLi Zefan /* This part must be outside protection */
66855782138SLi Zefan #include <trace/define_trace.h>
66955782138SLi Zefan 
670