Blame view

include/linux/blktrace_api.h 7.59 KB
2056a782f   Jens Axboe   [PATCH] Block que...
1
2
  #ifndef BLKTRACE_H
  #define BLKTRACE_H
4502b80e4   Jaswinder Singh Rajput   headers_check fix...
3
  #include <linux/types.h>
c0ddffa84   Sven Schuetz   include blktrace_...
4
  #ifdef __KERNEL__
2056a782f   Jens Axboe   [PATCH] Block que...
5
6
  #include <linux/blkdev.h>
  #include <linux/relay.h>
62c2a7d96   Arnd Bergmann   block: push BKL i...
7
  #include <linux/compat.h>
c0ddffa84   Sven Schuetz   include blktrace_...
8
  #endif
2056a782f   Jens Axboe   [PATCH] Block que...
9
10
11
12
13
14
15
  
  /*
   * Trace categories
   */
  enum blktrace_cat {
  	BLK_TC_READ	= 1 << 0,	/* reads */
  	BLK_TC_WRITE	= 1 << 1,	/* writes */
c09c47cae   Namhyung Kim   blktrace: add FLU...
16
  	BLK_TC_FLUSH	= 1 << 2,	/* flush */
fc0a75ce4   Nathan Scott   [PATCH] blktrace:...
17
  	BLK_TC_SYNC	= 1 << 3,	/* sync IO */
93dbb3935   Jens Axboe   block: fix bad de...
18
  	BLK_TC_SYNCIO	= BLK_TC_SYNC,
2056a782f   Jens Axboe   [PATCH] Block que...
19
20
21
22
23
24
25
  	BLK_TC_QUEUE	= 1 << 4,	/* queueing/merging */
  	BLK_TC_REQUEUE	= 1 << 5,	/* requeueing */
  	BLK_TC_ISSUE	= 1 << 6,	/* issue */
  	BLK_TC_COMPLETE	= 1 << 7,	/* completions */
  	BLK_TC_FS	= 1 << 8,	/* fs requests */
  	BLK_TC_PC	= 1 << 9,	/* pc requests */
  	BLK_TC_NOTIFY	= 1 << 10,	/* special message */
40359ccb8   Nathan Scott   [PATCH] blktrace:...
26
  	BLK_TC_AHEAD	= 1 << 11,	/* readahead */
7457e6e2d   Jens Axboe   [PATCH] blktrace:...
27
  	BLK_TC_META	= 1 << 12,	/* metadata */
27b29e86b   David Woodhouse   blktrace: support...
28
  	BLK_TC_DISCARD	= 1 << 13,	/* discard requests */
756f82431   Stefan Raspl   blktrace: add sup...
29
  	BLK_TC_DRV_DATA	= 1 << 14,	/* binary per-driver data */
c09c47cae   Namhyung Kim   blktrace: add FLU...
30
  	BLK_TC_FUA	= 1 << 15,	/* fua requests */
2056a782f   Jens Axboe   [PATCH] Block que...
31

c09c47cae   Namhyung Kim   blktrace: add FLU...
32
  	BLK_TC_END	= 1 << 15,	/* we've run out of bits! */
2056a782f   Jens Axboe   [PATCH] Block que...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  };
  
  #define BLK_TC_SHIFT		(16)
  #define BLK_TC_ACT(act)		((act) << BLK_TC_SHIFT)
  
  /*
   * Basic trace actions
   */
  enum blktrace_act {
  	__BLK_TA_QUEUE = 1,		/* queued */
  	__BLK_TA_BACKMERGE,		/* back merged to existing rq */
  	__BLK_TA_FRONTMERGE,		/* front merge to existing rq */
  	__BLK_TA_GETRQ,			/* allocated new request */
  	__BLK_TA_SLEEPRQ,		/* sleeping on rq allocation */
  	__BLK_TA_REQUEUE,		/* request requeued */
  	__BLK_TA_ISSUE,			/* sent to driver */
  	__BLK_TA_COMPLETE,		/* completed by driver */
  	__BLK_TA_PLUG,			/* queue was plugged */
  	__BLK_TA_UNPLUG_IO,		/* queue was unplugged by io */
  	__BLK_TA_UNPLUG_TIMER,		/* queue was unplugged by timer */
  	__BLK_TA_INSERT,		/* insert request */
  	__BLK_TA_SPLIT,			/* bio was split */
  	__BLK_TA_BOUNCE,		/* bio was bounced */
  	__BLK_TA_REMAP,			/* bio was remapped */
11914a53d   Mike Anderson   block: Add interf...
57
  	__BLK_TA_ABORT,			/* request aborted */
756f82431   Stefan Raspl   blktrace: add sup...
58
  	__BLK_TA_DRV_DATA,		/* driver-specific binary data */
2056a782f   Jens Axboe   [PATCH] Block que...
59
60
61
  };
  
  /*
be1c63411   Olaf Kirch   [PATCH] blktrace:...
62
63
64
65
66
   * Notify events.
   */
  enum blktrace_notify {
  	__BLK_TN_PROCESS = 0,		/* establish pid/name mapping */
  	__BLK_TN_TIMESTAMP,		/* include system clock */
9d5f09a42   Alan D. Brunelle   Added in MESSAGE ...
67
  	__BLK_TN_MESSAGE,		/* Character string message */
be1c63411   Olaf Kirch   [PATCH] blktrace:...
68
69
70
71
  };
  
  
  /*
2056a782f   Jens Axboe   [PATCH] Block que...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
   * Trace actions in full. Additionally, read or write is masked
   */
  #define BLK_TA_QUEUE		(__BLK_TA_QUEUE | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_BACKMERGE	(__BLK_TA_BACKMERGE | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_FRONTMERGE	(__BLK_TA_FRONTMERGE | BLK_TC_ACT(BLK_TC_QUEUE))
  #define	BLK_TA_GETRQ		(__BLK_TA_GETRQ | BLK_TC_ACT(BLK_TC_QUEUE))
  #define	BLK_TA_SLEEPRQ		(__BLK_TA_SLEEPRQ | BLK_TC_ACT(BLK_TC_QUEUE))
  #define	BLK_TA_REQUEUE		(__BLK_TA_REQUEUE | BLK_TC_ACT(BLK_TC_REQUEUE))
  #define BLK_TA_ISSUE		(__BLK_TA_ISSUE | BLK_TC_ACT(BLK_TC_ISSUE))
  #define BLK_TA_COMPLETE		(__BLK_TA_COMPLETE| BLK_TC_ACT(BLK_TC_COMPLETE))
  #define BLK_TA_PLUG		(__BLK_TA_PLUG | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_UNPLUG_IO	(__BLK_TA_UNPLUG_IO | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_UNPLUG_TIMER	(__BLK_TA_UNPLUG_TIMER | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_INSERT		(__BLK_TA_INSERT | BLK_TC_ACT(BLK_TC_QUEUE))
  #define BLK_TA_SPLIT		(__BLK_TA_SPLIT)
  #define BLK_TA_BOUNCE		(__BLK_TA_BOUNCE)
  #define BLK_TA_REMAP		(__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE))
11914a53d   Mike Anderson   block: Add interf...
89
  #define BLK_TA_ABORT		(__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE))
756f82431   Stefan Raspl   blktrace: add sup...
90
  #define BLK_TA_DRV_DATA	(__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA))
2056a782f   Jens Axboe   [PATCH] Block que...
91

be1c63411   Olaf Kirch   [PATCH] blktrace:...
92
93
  #define BLK_TN_PROCESS		(__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
  #define BLK_TN_TIMESTAMP	(__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
9d5f09a42   Alan D. Brunelle   Added in MESSAGE ...
94
  #define BLK_TN_MESSAGE		(__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY))
be1c63411   Olaf Kirch   [PATCH] blktrace:...
95

2056a782f   Jens Axboe   [PATCH] Block que...
96
97
98
99
100
101
102
  #define BLK_IO_TRACE_MAGIC	0x65617400
  #define BLK_IO_TRACE_VERSION	0x07
  
  /*
   * The trace itself
   */
  struct blk_io_trace {
c0ddffa84   Sven Schuetz   include blktrace_...
103
104
105
106
107
108
109
110
111
112
113
  	__u32 magic;		/* MAGIC << 8 | version */
  	__u32 sequence;		/* event number */
  	__u64 time;		/* in microseconds */
  	__u64 sector;		/* disk offset */
  	__u32 bytes;		/* transfer length */
  	__u32 action;		/* what happened */
  	__u32 pid;		/* who did it */
  	__u32 device;		/* device number */
  	__u32 cpu;		/* on what cpu did it happen */
  	__u16 error;		/* completion error */
  	__u16 pdu_len;		/* length of data after this trace */
2056a782f   Jens Axboe   [PATCH] Block que...
114
115
116
117
118
119
  };
  
  /*
   * The remap event
   */
  struct blk_io_trace_remap {
c7149d6bc   Alan D. Brunelle   Fix remap handlin...
120
  	__be32 device_from;
a42aaa3bb   Alan D. Brunelle   blktrace: correct...
121
122
  	__be32 device_to;
  	__be64 sector_from;
2056a782f   Jens Axboe   [PATCH] Block que...
123
124
125
126
127
128
129
  };
  
  enum {
  	Blktrace_setup = 1,
  	Blktrace_running,
  	Blktrace_stopped,
  };
0497b345e   Jens Axboe   blktrace: use BLK...
130
  #define BLKTRACE_BDEV_SIZE	32
c0ddffa84   Sven Schuetz   include blktrace_...
131
132
133
134
  /*
   * User setup structure passed with BLKTRACESTART
   */
  struct blk_user_trace_setup {
0497b345e   Jens Axboe   blktrace: use BLK...
135
  	char name[BLKTRACE_BDEV_SIZE];	/* output */
c0ddffa84   Sven Schuetz   include blktrace_...
136
137
138
139
140
141
142
143
144
145
  	__u16 act_mask;			/* input */
  	__u32 buf_size;			/* input */
  	__u32 buf_nr;			/* input */
  	__u64 start_lba;
  	__u64 end_lba;
  	__u32 pid;
  };
  
  #ifdef __KERNEL__
  #if defined(CONFIG_BLK_DEV_IO_TRACE)
157f9c00e   Arnaldo Carvalho de Melo   tracing/blktrace:...
146
147
  
  #include <linux/sysfs.h>
2056a782f   Jens Axboe   [PATCH] Block que...
148
149
150
  struct blk_trace {
  	int trace_state;
  	struct rchan *rchan;
43cf38eb5   Tejun Heo   percpu: add __per...
151
152
  	unsigned long __percpu *sequence;
  	unsigned char __percpu *msg_data;
2056a782f   Jens Axboe   [PATCH] Block que...
153
154
155
156
157
158
159
  	u16 act_mask;
  	u64 start_lba;
  	u64 end_lba;
  	u32 pid;
  	u32 dev;
  	struct dentry *dir;
  	struct dentry *dropped_file;
02c62304e   Alan D. Brunelle   Added in user-inj...
160
  	struct dentry *msg_file;
2056a782f   Jens Axboe   [PATCH] Block que...
161
162
  	atomic_t dropped;
  };
2056a782f   Jens Axboe   [PATCH] Block que...
163
  extern int blk_trace_ioctl(struct block_device *, unsigned, char __user *);
165125e1e   Jens Axboe   [BLOCK] Get rid o...
164
  extern void blk_trace_shutdown(struct request_queue *);
d0deef5b1   Shawn Du   blktrace: support...
165
166
167
  extern int do_blk_trace_setup(struct request_queue *q, char *name,
  			      dev_t dev, struct block_device *bdev,
  			      struct blk_user_trace_setup *buts);
b9075fa96   Joe Perches   treewide: use __p...
168
  extern __printf(2, 3)
08e8138ad   Joe Perches   block: Add __attr...
169
  void __trace_note_message(struct blk_trace *, const char *fmt, ...);
171044d44   Arnd Bergmann   compat_ioctl: han...
170

9d5f09a42   Alan D. Brunelle   Added in MESSAGE ...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
  /**
   * blk_add_trace_msg - Add a (simple) message to the blktrace stream
   * @q:		queue the io is for
   * @fmt:	format to print message in
   * args...	Variable argument list for format
   *
   * Description:
   *     Records a (simple) message onto the blktrace stream.
   *
   *     NOTE: BLK_TN_MAX_MSG characters are output at most.
   *     NOTE: Can not use 'static inline' due to presence of var args...
   *
   **/
  #define blk_add_trace_msg(q, fmt, ...)					\
  	do {								\
  		struct blk_trace *bt = (q)->blk_trace;			\
  		if (unlikely(bt))					\
  			__trace_note_message(bt, fmt, ##__VA_ARGS__);	\
  	} while (0)
64565911c   Jens Axboe   block: make blktr...
190
  #define BLK_TN_MAX_MSG		128
2056a782f   Jens Axboe   [PATCH] Block que...
191

5f3ea37c7   Arnaldo Carvalho de Melo   blktrace: port to...
192
193
  extern void blk_add_driver_data(struct request_queue *q, struct request *rq,
  				void *data, size_t len);
7da975a23   Martin K. Petersen   Fix blktrace comp...
194
  extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
d0deef5b1   Shawn Du   blktrace: support...
195
  			   struct block_device *bdev,
6da127ad0   Christof Schmitt   blktrace: Add blk...
196
  			   char __user *arg);
7da975a23   Martin K. Petersen   Fix blktrace comp...
197
198
  extern int blk_trace_startstop(struct request_queue *q, int start);
  extern int blk_trace_remove(struct request_queue *q);
48c0d4d4c   Zdenek Kabelac   Add missing blk_t...
199
  extern void blk_trace_remove_sysfs(struct device *dev);
1d54ad6da   Li Zefan   blktrace: add tra...
200
  extern int blk_trace_init_sysfs(struct device *dev);
6da127ad0   Christof Schmitt   blktrace: Add blk...
201

157f9c00e   Arnaldo Carvalho de Melo   tracing/blktrace:...
202
  extern struct attribute_group blk_trace_attr_group;
2056a782f   Jens Axboe   [PATCH] Block que...
203
  #else /* !CONFIG_BLK_DEV_IO_TRACE */
d0deef5b1   Shawn Du   blktrace: support...
204
205
206
207
208
209
210
211
  # define blk_trace_ioctl(bdev, cmd, arg)		(-ENOTTY)
  # define blk_trace_shutdown(q)				do { } while (0)
  # define do_blk_trace_setup(q, name, dev, bdev, buts)	(-ENOTTY)
  # define blk_add_driver_data(q, rq, data, len)		do {} while (0)
  # define blk_trace_setup(q, name, dev, bdev, arg)	(-ENOTTY)
  # define blk_trace_startstop(q, start)			(-ENOTTY)
  # define blk_trace_remove(q)				(-ENOTTY)
  # define blk_add_trace_msg(q, fmt, ...)			do { } while (0)
b0da3f0da   Jun'ichi Nomura   Add a tracepoint ...
212
  # define blk_trace_remove_sysfs(dev)			do { } while (0)
1d54ad6da   Li Zefan   blktrace: add tra...
213
214
215
216
  static inline int blk_trace_init_sysfs(struct device *dev)
  {
  	return 0;
  }
2056a782f   Jens Axboe   [PATCH] Block que...
217
  #endif /* CONFIG_BLK_DEV_IO_TRACE */
d0deef5b1   Shawn Du   blktrace: support...
218

2669b19fa   Stephen Rothwell   block: fix for bl...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
  #ifdef CONFIG_COMPAT
  
  struct compat_blk_user_trace_setup {
  	char name[32];
  	u16 act_mask;
  	u32 buf_size;
  	u32 buf_nr;
  	compat_u64 start_lba;
  	compat_u64 end_lba;
  	u32 pid;
  };
  #define BLKTRACESETUP32 _IOWR(0x12, 115, struct compat_blk_user_trace_setup)
  
  #endif
f1db457ce   Li Zefan   tracing/events: c...
233
  #if defined(CONFIG_EVENT_TRACING) && defined(CONFIG_BLOCK)
55782138e   Li Zefan   tracing/events: c...
234
235
236
  
  static inline int blk_cmd_buf_len(struct request *rq)
  {
33659ebba   Christoph Hellwig   block: remove wra...
237
  	return (rq->cmd_type == REQ_TYPE_BLOCK_PC) ? rq->cmd_len * 3 : 1;
55782138e   Li Zefan   tracing/events: c...
238
239
240
241
  }
  
  extern void blk_dump_cmd(char *buf, struct request *rq);
  extern void blk_fill_rwbs(char *rwbs, u32 rw, int bytes);
55782138e   Li Zefan   tracing/events: c...
242

f1db457ce   Li Zefan   tracing/events: c...
243
  #endif /* CONFIG_EVENT_TRACING && CONFIG_BLOCK */
55782138e   Li Zefan   tracing/events: c...
244

171044d44   Arnd Bergmann   compat_ioctl: han...
245
  #endif /* __KERNEL__ */
2056a782f   Jens Axboe   [PATCH] Block que...
246
  #endif