1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM erofs |
4 | |
5 | #if !defined(_TRACE_EROFS_H) || defined(TRACE_HEADER_MULTI_READ) |
6 | #define _TRACE_EROFS_H |
7 | |
8 | #include <linux/tracepoint.h> |
9 | #include <linux/fs.h> |
10 | |
11 | struct erofs_map_blocks; |
12 | |
13 | #define show_dev(dev) MAJOR(dev), MINOR(dev) |
14 | #define show_dev_nid(entry) show_dev(entry->dev), entry->nid |
15 | |
16 | #define show_file_type(type) \ |
17 | __print_symbolic(type, \ |
18 | { 0, "FILE" }, \ |
19 | { 1, "DIR" }) |
20 | |
21 | #define show_map_flags(flags) __print_flags(flags, "|", \ |
22 | { EROFS_GET_BLOCKS_FIEMAP, "FIEMAP" }, \ |
23 | { EROFS_GET_BLOCKS_READMORE, "READMORE" }, \ |
24 | { EROFS_GET_BLOCKS_FINDTAIL, "FINDTAIL" }) |
25 | |
26 | #define show_mflags(flags) __print_flags(flags, "", \ |
27 | { EROFS_MAP_MAPPED, "M" }, \ |
28 | { EROFS_MAP_META, "I" }, \ |
29 | { EROFS_MAP_ENCODED, "E" }, \ |
30 | { EROFS_MAP_FULL_MAPPED, "F" }, \ |
31 | { EROFS_MAP_FRAGMENT, "R" }, \ |
32 | { EROFS_MAP_PARTIAL_REF, "P" }) |
33 | |
34 | TRACE_EVENT(erofs_lookup, |
35 | |
36 | TP_PROTO(struct inode *dir, struct dentry *dentry, unsigned int flags), |
37 | |
38 | TP_ARGS(dir, dentry, flags), |
39 | |
40 | TP_STRUCT__entry( |
41 | __field(dev_t, dev ) |
42 | __field(erofs_nid_t, nid ) |
43 | __string(name, dentry->d_name.name ) |
44 | __field(unsigned int, flags ) |
45 | ), |
46 | |
47 | TP_fast_assign( |
48 | __entry->dev = dir->i_sb->s_dev; |
49 | __entry->nid = EROFS_I(dir)->nid; |
50 | __assign_str(name, dentry->d_name.name); |
51 | __entry->flags = flags; |
52 | ), |
53 | |
54 | TP_printk("dev = (%d,%d), pnid = %llu, name:%s, flags:%x" , |
55 | show_dev_nid(__entry), |
56 | __get_str(name), |
57 | __entry->flags) |
58 | ); |
59 | |
60 | TRACE_EVENT(erofs_fill_inode, |
61 | TP_PROTO(struct inode *inode), |
62 | TP_ARGS(inode), |
63 | |
64 | TP_STRUCT__entry( |
65 | __field(dev_t, dev ) |
66 | __field(erofs_nid_t, nid ) |
67 | __field(erofs_blk_t, blkaddr ) |
68 | __field(unsigned int, ofs ) |
69 | ), |
70 | |
71 | TP_fast_assign( |
72 | __entry->dev = inode->i_sb->s_dev; |
73 | __entry->nid = EROFS_I(inode)->nid; |
74 | __entry->blkaddr = erofs_blknr(inode->i_sb, erofs_iloc(inode)); |
75 | __entry->ofs = erofs_blkoff(inode->i_sb, erofs_iloc(inode)); |
76 | ), |
77 | |
78 | TP_printk("dev = (%d,%d), nid = %llu, blkaddr %u ofs %u" , |
79 | show_dev_nid(__entry), |
80 | __entry->blkaddr, __entry->ofs) |
81 | ); |
82 | |
83 | TRACE_EVENT(erofs_read_folio, |
84 | |
85 | TP_PROTO(struct folio *folio, bool raw), |
86 | |
87 | TP_ARGS(folio, raw), |
88 | |
89 | TP_STRUCT__entry( |
90 | __field(dev_t, dev ) |
91 | __field(erofs_nid_t, nid ) |
92 | __field(int, dir ) |
93 | __field(pgoff_t, index ) |
94 | __field(int, uptodate) |
95 | __field(bool, raw ) |
96 | ), |
97 | |
98 | TP_fast_assign( |
99 | __entry->dev = folio->mapping->host->i_sb->s_dev; |
100 | __entry->nid = EROFS_I(folio->mapping->host)->nid; |
101 | __entry->dir = S_ISDIR(folio->mapping->host->i_mode); |
102 | __entry->index = folio->index; |
103 | __entry->uptodate = folio_test_uptodate(folio); |
104 | __entry->raw = raw; |
105 | ), |
106 | |
107 | TP_printk("dev = (%d,%d), nid = %llu, %s, index = %lu, uptodate = %d " |
108 | "raw = %d" , |
109 | show_dev_nid(__entry), |
110 | show_file_type(__entry->dir), |
111 | (unsigned long)__entry->index, |
112 | __entry->uptodate, |
113 | __entry->raw) |
114 | ); |
115 | |
116 | TRACE_EVENT(erofs_readpages, |
117 | |
118 | TP_PROTO(struct inode *inode, pgoff_t start, unsigned int nrpage, |
119 | bool raw), |
120 | |
121 | TP_ARGS(inode, start, nrpage, raw), |
122 | |
123 | TP_STRUCT__entry( |
124 | __field(dev_t, dev ) |
125 | __field(erofs_nid_t, nid ) |
126 | __field(pgoff_t, start ) |
127 | __field(unsigned int, nrpage ) |
128 | __field(bool, raw ) |
129 | ), |
130 | |
131 | TP_fast_assign( |
132 | __entry->dev = inode->i_sb->s_dev; |
133 | __entry->nid = EROFS_I(inode)->nid; |
134 | __entry->start = start; |
135 | __entry->nrpage = nrpage; |
136 | __entry->raw = raw; |
137 | ), |
138 | |
139 | TP_printk("dev = (%d,%d), nid = %llu, start = %lu nrpage = %u raw = %d" , |
140 | show_dev_nid(__entry), |
141 | (unsigned long)__entry->start, |
142 | __entry->nrpage, |
143 | __entry->raw) |
144 | ); |
145 | |
146 | DECLARE_EVENT_CLASS(erofs__map_blocks_enter, |
147 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
148 | unsigned int flags), |
149 | |
150 | TP_ARGS(inode, map, flags), |
151 | |
152 | TP_STRUCT__entry( |
153 | __field( dev_t, dev ) |
154 | __field( erofs_nid_t, nid ) |
155 | __field( erofs_off_t, la ) |
156 | __field( u64, llen ) |
157 | __field( unsigned int, flags ) |
158 | ), |
159 | |
160 | TP_fast_assign( |
161 | __entry->dev = inode->i_sb->s_dev; |
162 | __entry->nid = EROFS_I(inode)->nid; |
163 | __entry->la = map->m_la; |
164 | __entry->llen = map->m_llen; |
165 | __entry->flags = flags; |
166 | ), |
167 | |
168 | TP_printk("dev = (%d,%d), nid = %llu, la %llu llen %llu flags %s" , |
169 | show_dev_nid(__entry), |
170 | __entry->la, __entry->llen, |
171 | __entry->flags ? show_map_flags(__entry->flags) : "NULL" ) |
172 | ); |
173 | |
174 | DEFINE_EVENT(erofs__map_blocks_enter, erofs_map_blocks_enter, |
175 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
176 | unsigned flags), |
177 | |
178 | TP_ARGS(inode, map, flags) |
179 | ); |
180 | |
181 | DEFINE_EVENT(erofs__map_blocks_enter, z_erofs_map_blocks_iter_enter, |
182 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
183 | unsigned int flags), |
184 | |
185 | TP_ARGS(inode, map, flags) |
186 | ); |
187 | |
188 | DECLARE_EVENT_CLASS(erofs__map_blocks_exit, |
189 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
190 | unsigned int flags, int ret), |
191 | |
192 | TP_ARGS(inode, map, flags, ret), |
193 | |
194 | TP_STRUCT__entry( |
195 | __field( dev_t, dev ) |
196 | __field( erofs_nid_t, nid ) |
197 | __field( unsigned int, flags ) |
198 | __field( erofs_off_t, la ) |
199 | __field( erofs_off_t, pa ) |
200 | __field( u64, llen ) |
201 | __field( u64, plen ) |
202 | __field( unsigned int, mflags ) |
203 | __field( int, ret ) |
204 | ), |
205 | |
206 | TP_fast_assign( |
207 | __entry->dev = inode->i_sb->s_dev; |
208 | __entry->nid = EROFS_I(inode)->nid; |
209 | __entry->flags = flags; |
210 | __entry->la = map->m_la; |
211 | __entry->pa = map->m_pa; |
212 | __entry->llen = map->m_llen; |
213 | __entry->plen = map->m_plen; |
214 | __entry->mflags = map->m_flags; |
215 | __entry->ret = ret; |
216 | ), |
217 | |
218 | TP_printk("dev = (%d,%d), nid = %llu, flags %s " |
219 | "la %llu pa %llu llen %llu plen %llu mflags %s ret %d" , |
220 | show_dev_nid(__entry), |
221 | __entry->flags ? show_map_flags(__entry->flags) : "NULL" , |
222 | __entry->la, __entry->pa, __entry->llen, __entry->plen, |
223 | show_mflags(__entry->mflags), __entry->ret) |
224 | ); |
225 | |
226 | DEFINE_EVENT(erofs__map_blocks_exit, erofs_map_blocks_exit, |
227 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
228 | unsigned flags, int ret), |
229 | |
230 | TP_ARGS(inode, map, flags, ret) |
231 | ); |
232 | |
233 | DEFINE_EVENT(erofs__map_blocks_exit, z_erofs_map_blocks_iter_exit, |
234 | TP_PROTO(struct inode *inode, struct erofs_map_blocks *map, |
235 | unsigned int flags, int ret), |
236 | |
237 | TP_ARGS(inode, map, flags, ret) |
238 | ); |
239 | |
240 | TRACE_EVENT(erofs_destroy_inode, |
241 | TP_PROTO(struct inode *inode), |
242 | |
243 | TP_ARGS(inode), |
244 | |
245 | TP_STRUCT__entry( |
246 | __field( dev_t, dev ) |
247 | __field( erofs_nid_t, nid ) |
248 | ), |
249 | |
250 | TP_fast_assign( |
251 | __entry->dev = inode->i_sb->s_dev; |
252 | __entry->nid = EROFS_I(inode)->nid; |
253 | ), |
254 | |
255 | TP_printk("dev = (%d,%d), nid = %llu" , show_dev_nid(__entry)) |
256 | ); |
257 | |
258 | #endif /* _TRACE_EROFS_H */ |
259 | |
260 | /* This part must be outside protection */ |
261 | #include <trace/define_trace.h> |
262 | |