xref: /linux/include/uapi/linux/blktrace_api.h (revision cc25df3e2e22a956d3a0d427369367b4a901d203)
1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 #ifndef _UAPIBLKTRACE_H
3 #define _UAPIBLKTRACE_H
4 
5 #include <linux/types.h>
6 
7 /*
8  * Trace categories
9  */
10 enum blktrace_cat {
11 	BLK_TC_READ	= 1 << 0,	/* reads */
12 	BLK_TC_WRITE	= 1 << 1,	/* writes */
13 	BLK_TC_FLUSH	= 1 << 2,	/* flush */
14 	BLK_TC_SYNC	= 1 << 3,	/* sync IO */
15 	BLK_TC_SYNCIO	= BLK_TC_SYNC,
16 	BLK_TC_QUEUE	= 1 << 4,	/* queueing/merging */
17 	BLK_TC_REQUEUE	= 1 << 5,	/* requeueing */
18 	BLK_TC_ISSUE	= 1 << 6,	/* issue */
19 	BLK_TC_COMPLETE	= 1 << 7,	/* completions */
20 	BLK_TC_FS	= 1 << 8,	/* fs requests */
21 	BLK_TC_PC	= 1 << 9,	/* pc requests */
22 	BLK_TC_NOTIFY	= 1 << 10,	/* special message */
23 	BLK_TC_AHEAD	= 1 << 11,	/* readahead */
24 	BLK_TC_META	= 1 << 12,	/* metadata */
25 	BLK_TC_DISCARD	= 1 << 13,	/* discard requests */
26 	BLK_TC_DRV_DATA	= 1 << 14,	/* binary per-driver data */
27 	BLK_TC_FUA	= 1 << 15,	/* fua requests */
28 
29 	BLK_TC_END_V1	= 1 << 15,	/* we've run out of bits! */
30 
31 	BLK_TC_ZONE_APPEND	= 1ull << 16,  	/* zone append */
32 	BLK_TC_ZONE_RESET	= 1ull << 17,	/* zone reset */
33 	BLK_TC_ZONE_RESET_ALL	= 1ull << 18,	/* zone reset all */
34 	BLK_TC_ZONE_FINISH	= 1ull << 19,	/* zone finish */
35 	BLK_TC_ZONE_OPEN	= 1ull << 20,	/* zone open */
36 	BLK_TC_ZONE_CLOSE	= 1ull << 21,	/* zone close */
37 
38 	BLK_TC_WRITE_ZEROES	= 1ull << 22,	/* write-zeroes */
39 
40 	BLK_TC_END_V2		= 1ull << 22,
41 };
42 
43 #define BLK_TC_SHIFT		(16)
44 #define BLK_TC_ACT(act)		((u64)(act) << BLK_TC_SHIFT)
45 
46 /*
47  * Basic trace actions
48  */
49 enum blktrace_act {
50 	__BLK_TA_QUEUE = 1,		/* queued */
51 	__BLK_TA_BACKMERGE,		/* back merged to existing rq */
52 	__BLK_TA_FRONTMERGE,		/* front merge to existing rq */
53 	__BLK_TA_GETRQ,			/* allocated new request */
54 	__BLK_TA_SLEEPRQ,		/* sleeping on rq allocation */
55 	__BLK_TA_REQUEUE,		/* request requeued */
56 	__BLK_TA_ISSUE,			/* sent to driver */
57 	__BLK_TA_COMPLETE,		/* completed by driver */
58 	__BLK_TA_PLUG,			/* queue was plugged */
59 	__BLK_TA_UNPLUG_IO,		/* queue was unplugged by io */
60 	__BLK_TA_UNPLUG_TIMER,		/* queue was unplugged by timer */
61 	__BLK_TA_INSERT,		/* insert request */
62 	__BLK_TA_SPLIT,			/* bio was split */
63 	__BLK_TA_BOUNCE,		/* unused, was: bio was bounced */
64 	__BLK_TA_REMAP,			/* bio was remapped */
65 	__BLK_TA_ABORT,			/* request aborted */
66 	__BLK_TA_DRV_DATA,		/* driver-specific binary data */
67 	__BLK_TA_ZONE_PLUG,		/* zone write plug was plugged */
68 	__BLK_TA_ZONE_UNPLUG,		/* zone write plug was unplugged */
69 	__BLK_TA_CGROUP = 1 << 8,	/* from a cgroup*/
70 };
71 
72 /*
73  * Notify events.
74  */
75 enum blktrace_notify {
76 	__BLK_TN_PROCESS = 0,		/* establish pid/name mapping */
77 	__BLK_TN_TIMESTAMP,		/* include system clock */
78 	__BLK_TN_MESSAGE,		/* Character string message */
79 	__BLK_TN_CGROUP = __BLK_TA_CGROUP, /* from a cgroup */
80 };
81 
82 
83 /*
84  * Trace actions in full. Additionally, read or write is masked
85  */
86 #define BLK_TA_QUEUE		(__BLK_TA_QUEUE | BLK_TC_ACT(BLK_TC_QUEUE))
87 #define BLK_TA_BACKMERGE	(__BLK_TA_BACKMERGE | BLK_TC_ACT(BLK_TC_QUEUE))
88 #define BLK_TA_FRONTMERGE	(__BLK_TA_FRONTMERGE | BLK_TC_ACT(BLK_TC_QUEUE))
89 #define	BLK_TA_GETRQ		(__BLK_TA_GETRQ | BLK_TC_ACT(BLK_TC_QUEUE))
90 #define	BLK_TA_SLEEPRQ		(__BLK_TA_SLEEPRQ | BLK_TC_ACT(BLK_TC_QUEUE))
91 #define	BLK_TA_REQUEUE		(__BLK_TA_REQUEUE | BLK_TC_ACT(BLK_TC_REQUEUE))
92 #define BLK_TA_ISSUE		(__BLK_TA_ISSUE | BLK_TC_ACT(BLK_TC_ISSUE))
93 #define BLK_TA_COMPLETE		(__BLK_TA_COMPLETE| BLK_TC_ACT(BLK_TC_COMPLETE))
94 #define BLK_TA_PLUG		(__BLK_TA_PLUG | BLK_TC_ACT(BLK_TC_QUEUE))
95 #define BLK_TA_UNPLUG_IO	(__BLK_TA_UNPLUG_IO | BLK_TC_ACT(BLK_TC_QUEUE))
96 #define BLK_TA_UNPLUG_TIMER	(__BLK_TA_UNPLUG_TIMER | BLK_TC_ACT(BLK_TC_QUEUE))
97 #define BLK_TA_INSERT		(__BLK_TA_INSERT | BLK_TC_ACT(BLK_TC_QUEUE))
98 #define BLK_TA_SPLIT		(__BLK_TA_SPLIT)
99 #define BLK_TA_BOUNCE		(__BLK_TA_BOUNCE)
100 #define BLK_TA_REMAP		(__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE))
101 #define BLK_TA_ABORT		(__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE))
102 #define BLK_TA_DRV_DATA	(__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA))
103 
104 #define BLK_TA_ZONE_APPEND	(__BLK_TA_COMPLETE |\
105 				 BLK_TC_ACT(BLK_TC_ZONE_APPEND))
106 #define BLK_TA_ZONE_PLUG	(__BLK_TA_ZONE_PLUG | BLK_TC_ACT(BLK_TC_QUEUE))
107 #define BLK_TA_ZONE_UNPLUG	(__BLK_TA_ZONE_UNPLUG |\
108 				 BLK_TC_ACT(BLK_TC_QUEUE))
109 
110 #define BLK_TN_PROCESS		(__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY))
111 #define BLK_TN_TIMESTAMP	(__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY))
112 #define BLK_TN_MESSAGE		(__BLK_TN_MESSAGE | BLK_TC_ACT(BLK_TC_NOTIFY))
113 
114 #define BLK_IO_TRACE_MAGIC	0x65617400
115 #define BLK_IO_TRACE_VERSION	0x07
116 #define BLK_IO_TRACE2_VERSION	0x08
117 
118 /*
119  * The trace itself
120  */
121 struct blk_io_trace {
122 	__u32 magic;		/* MAGIC << 8 | version */
123 	__u32 sequence;		/* event number */
124 	__u64 time;		/* in nanoseconds */
125 	__u64 sector;		/* disk offset */
126 	__u32 bytes;		/* transfer length */
127 	__u32 action;		/* what happened */
128 	__u32 pid;		/* who did it */
129 	__u32 device;		/* device number */
130 	__u32 cpu;		/* on what cpu did it happen */
131 	__u16 error;		/* completion error */
132 	__u16 pdu_len;		/* length of data after this trace */
133 	/* cgroup id will be stored here if exists */
134 };
135 
136 struct blk_io_trace2 {
137 	__u32 magic;		/* MAGIC << 8 | BLK_IO_TRACE2_VERSION */
138 	__u32 sequence;		/* event number */
139 	__u64 time;		/* in nanoseconds */
140 	__u64 sector;		/* disk offset */
141 	__u32 bytes;		/* transfer length */
142 	__u32 pid;		/* who did it */
143 	__u64 action;		/* what happened */
144 	__u32 device;		/* device number */
145 	__u32 cpu;		/* on what cpu did it happen */
146 	__u16 error;		/* completion error */
147 	__u16 pdu_len;		/* length of data after this trace */
148 	__u8 pad[12];
149 	/* cgroup id will be stored here if it exists */
150 };
151 /*
152  * The remap event
153  */
154 struct blk_io_trace_remap {
155 	__be32 device_from;
156 	__be32 device_to;
157 	__be64 sector_from;
158 };
159 
160 enum {
161 	Blktrace_setup = 1,
162 	Blktrace_running,
163 	Blktrace_stopped,
164 };
165 
166 #define BLKTRACE_BDEV_SIZE	32
167 #define BLKTRACE_BDEV_SIZE2	64
168 
169 /*
170  * User setup structure passed with BLKTRACESETUP
171  */
172 struct blk_user_trace_setup {
173 	char name[BLKTRACE_BDEV_SIZE];	/* output */
174 	__u16 act_mask;			/* input */
175 	__u32 buf_size;			/* input */
176 	__u32 buf_nr;			/* input */
177 	__u64 start_lba;
178 	__u64 end_lba;
179 	__u32 pid;
180 };
181 
182 /*
183  * User setup structure passed with BLKTRACESETUP2
184  */
185 struct blk_user_trace_setup2 {
186 	char name[BLKTRACE_BDEV_SIZE2];		/* output */
187 	__u64 act_mask;				/* input */
188 	__u32 buf_size;				/* input */
189 	__u32 buf_nr;				/* input */
190 	__u64 start_lba;
191 	__u64 end_lba;
192 	__u32 pid;
193 	__u32 flags;		/* currently unused */
194 	__u64 reserved[11];
195 };
196 
197 #endif /* _UAPIBLKTRACE_H */
198