diff options
author | Tejun Heo <tj@kernel.org> | 2015-08-18 17:54:56 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-08-18 18:49:15 -0400 |
commit | 5634cc2aa9aebc77bc862992e7805469dcf83dac (patch) | |
tree | b755b54562cf2df20679f0f823505aea2d48e2f4 /include/trace | |
parent | 9acee9c551f045d2c5b5261aa587331423fd7d92 (diff) |
writeback: update writeback tracepoints to report cgroup
The following tracepoints are updated to report the cgroup used during
cgroup writeback.
* writeback_write_inode[_start]
* writeback_queue
* writeback_exec
* writeback_start
* writeback_written
* writeback_wait
* writeback_nowork
* writeback_wake_background
* wbc_writepage
* writeback_queue_io
* bdi_dirty_ratelimit
* balance_dirty_pages
* writeback_sb_inodes_requeue
* writeback_single_inode[_start]
Note that writeback_bdi_register is separated out from writeback_class
as reporting cgroup doesn't make sense to it. Tracepoints which take
bdi are updated to take bdi_writeback instead.
Signed-off-by: Tejun Heo <tj@kernel.org>
Suggested-by: Jan Kara <jack@suse.cz>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'include/trace')
-rw-r--r-- | include/trace/events/writeback.h | 180 |
1 files changed, 141 insertions, 39 deletions
diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index a7aa607a4c55..fff846b512e6 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h | |||
@@ -131,6 +131,66 @@ DEFINE_EVENT(writeback_dirty_inode_template, writeback_dirty_inode, | |||
131 | TP_ARGS(inode, flags) | 131 | TP_ARGS(inode, flags) |
132 | ); | 132 | ); |
133 | 133 | ||
134 | #ifdef CREATE_TRACE_POINTS | ||
135 | #ifdef CONFIG_CGROUP_WRITEBACK | ||
136 | |||
137 | static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb) | ||
138 | { | ||
139 | return kernfs_path_len(wb->memcg_css->cgroup->kn) + 1; | ||
140 | } | ||
141 | |||
142 | static inline void __trace_wb_assign_cgroup(char *buf, struct bdi_writeback *wb) | ||
143 | { | ||
144 | struct cgroup *cgrp = wb->memcg_css->cgroup; | ||
145 | char *path; | ||
146 | |||
147 | path = cgroup_path(cgrp, buf, kernfs_path_len(cgrp->kn) + 1); | ||
148 | WARN_ON_ONCE(path != buf); | ||
149 | } | ||
150 | |||
151 | static inline size_t __trace_wbc_cgroup_size(struct writeback_control *wbc) | ||
152 | { | ||
153 | if (wbc->wb) | ||
154 | return __trace_wb_cgroup_size(wbc->wb); | ||
155 | else | ||
156 | return 2; | ||
157 | } | ||
158 | |||
159 | static inline void __trace_wbc_assign_cgroup(char *buf, | ||
160 | struct writeback_control *wbc) | ||
161 | { | ||
162 | if (wbc->wb) | ||
163 | __trace_wb_assign_cgroup(buf, wbc->wb); | ||
164 | else | ||
165 | strcpy(buf, "/"); | ||
166 | } | ||
167 | |||
168 | #else /* CONFIG_CGROUP_WRITEBACK */ | ||
169 | |||
170 | static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb) | ||
171 | { | ||
172 | return 2; | ||
173 | } | ||
174 | |||
175 | static inline void __trace_wb_assign_cgroup(char *buf, struct bdi_writeback *wb) | ||
176 | { | ||
177 | strcpy(buf, "/"); | ||
178 | } | ||
179 | |||
180 | static inline size_t __trace_wbc_cgroup_size(struct writeback_control *wbc) | ||
181 | { | ||
182 | return 2; | ||
183 | } | ||
184 | |||
185 | static inline void __trace_wbc_assign_cgroup(char *buf, | ||
186 | struct writeback_control *wbc) | ||
187 | { | ||
188 | strcpy(buf, "/"); | ||
189 | } | ||
190 | |||
191 | #endif /* CONFIG_CGROUP_WRITEBACK */ | ||
192 | #endif /* CREATE_TRACE_POINTS */ | ||
193 | |||
134 | DECLARE_EVENT_CLASS(writeback_write_inode_template, | 194 | DECLARE_EVENT_CLASS(writeback_write_inode_template, |
135 | 195 | ||
136 | TP_PROTO(struct inode *inode, struct writeback_control *wbc), | 196 | TP_PROTO(struct inode *inode, struct writeback_control *wbc), |
@@ -141,6 +201,7 @@ DECLARE_EVENT_CLASS(writeback_write_inode_template, | |||
141 | __array(char, name, 32) | 201 | __array(char, name, 32) |
142 | __field(unsigned long, ino) | 202 | __field(unsigned long, ino) |
143 | __field(int, sync_mode) | 203 | __field(int, sync_mode) |
204 | __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) | ||
144 | ), | 205 | ), |
145 | 206 | ||
146 | TP_fast_assign( | 207 | TP_fast_assign( |
@@ -148,12 +209,14 @@ DECLARE_EVENT_CLASS(writeback_write_inode_template, | |||
148 | dev_name(inode_to_bdi(inode)->dev), 32); | 209 | dev_name(inode_to_bdi(inode)->dev), 32); |
149 | __entry->ino = inode->i_ino; | 210 | __entry->ino = inode->i_ino; |
150 | __entry->sync_mode = wbc->sync_mode; | 211 | __entry->sync_mode = wbc->sync_mode; |
212 | __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); | ||
151 | ), | 213 | ), |
152 | 214 | ||
153 | TP_printk("bdi %s: ino=%lu sync_mode=%d", | 215 | TP_printk("bdi %s: ino=%lu sync_mode=%d cgroup=%s", |
154 | __entry->name, | 216 | __entry->name, |
155 | __entry->ino, | 217 | __entry->ino, |
156 | __entry->sync_mode | 218 | __entry->sync_mode, |
219 | __get_str(cgroup) | ||
157 | ) | 220 | ) |
158 | ); | 221 | ); |
159 | 222 | ||
@@ -172,8 +235,8 @@ DEFINE_EVENT(writeback_write_inode_template, writeback_write_inode, | |||
172 | ); | 235 | ); |
173 | 236 | ||
174 | DECLARE_EVENT_CLASS(writeback_work_class, | 237 | DECLARE_EVENT_CLASS(writeback_work_class, |
175 | TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), | 238 | TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), |
176 | TP_ARGS(bdi, work), | 239 | TP_ARGS(wb, work), |
177 | TP_STRUCT__entry( | 240 | TP_STRUCT__entry( |
178 | __array(char, name, 32) | 241 | __array(char, name, 32) |
179 | __field(long, nr_pages) | 242 | __field(long, nr_pages) |
@@ -183,10 +246,11 @@ DECLARE_EVENT_CLASS(writeback_work_class, | |||
183 | __field(int, range_cyclic) | 246 | __field(int, range_cyclic) |
184 | __field(int, for_background) | 247 | __field(int, for_background) |
185 | __field(int, reason) | 248 | __field(int, reason) |
249 | __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) | ||
186 | ), | 250 | ), |
187 | TP_fast_assign( | 251 | TP_fast_assign( |
188 | strncpy(__entry->name, | 252 | strncpy(__entry->name, |
189 | bdi->dev ? dev_name(bdi->dev) : "(unknown)", 32); | 253 | wb->bdi->dev ? dev_name(wb->bdi->dev) : "(unknown)", 32); |
190 | __entry->nr_pages = work->nr_pages; | 254 | __entry->nr_pages = work->nr_pages; |
191 | __entry->sb_dev = work->sb ? work->sb->s_dev : 0; | 255 | __entry->sb_dev = work->sb ? work->sb->s_dev : 0; |
192 | __entry->sync_mode = work->sync_mode; | 256 | __entry->sync_mode = work->sync_mode; |
@@ -194,9 +258,10 @@ DECLARE_EVENT_CLASS(writeback_work_class, | |||
194 | __entry->range_cyclic = work->range_cyclic; | 258 | __entry->range_cyclic = work->range_cyclic; |
195 | __entry->for_background = work->for_background; | 259 | __entry->for_background = work->for_background; |
196 | __entry->reason = work->reason; | 260 | __entry->reason = work->reason; |
261 | __trace_wb_assign_cgroup(__get_str(cgroup), wb); | ||
197 | ), | 262 | ), |
198 | TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " | 263 | TP_printk("bdi %s: sb_dev %d:%d nr_pages=%ld sync_mode=%d " |
199 | "kupdate=%d range_cyclic=%d background=%d reason=%s", | 264 | "kupdate=%d range_cyclic=%d background=%d reason=%s cgroup=%s", |
200 | __entry->name, | 265 | __entry->name, |
201 | MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), | 266 | MAJOR(__entry->sb_dev), MINOR(__entry->sb_dev), |
202 | __entry->nr_pages, | 267 | __entry->nr_pages, |
@@ -204,13 +269,14 @@ DECLARE_EVENT_CLASS(writeback_work_class, | |||
204 | __entry->for_kupdate, | 269 | __entry->for_kupdate, |
205 | __entry->range_cyclic, | 270 | __entry->range_cyclic, |
206 | __entry->for_background, | 271 | __entry->for_background, |
207 | __print_symbolic(__entry->reason, WB_WORK_REASON) | 272 | __print_symbolic(__entry->reason, WB_WORK_REASON), |
273 | __get_str(cgroup) | ||
208 | ) | 274 | ) |
209 | ); | 275 | ); |
210 | #define DEFINE_WRITEBACK_WORK_EVENT(name) \ | 276 | #define DEFINE_WRITEBACK_WORK_EVENT(name) \ |
211 | DEFINE_EVENT(writeback_work_class, name, \ | 277 | DEFINE_EVENT(writeback_work_class, name, \ |
212 | TP_PROTO(struct backing_dev_info *bdi, struct wb_writeback_work *work), \ | 278 | TP_PROTO(struct bdi_writeback *wb, struct wb_writeback_work *work), \ |
213 | TP_ARGS(bdi, work)) | 279 | TP_ARGS(wb, work)) |
214 | DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); | 280 | DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); |
215 | DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); | 281 | DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); |
216 | DEFINE_WRITEBACK_WORK_EVENT(writeback_start); | 282 | DEFINE_WRITEBACK_WORK_EVENT(writeback_start); |
@@ -230,26 +296,42 @@ TRACE_EVENT(writeback_pages_written, | |||
230 | ); | 296 | ); |
231 | 297 | ||
232 | DECLARE_EVENT_CLASS(writeback_class, | 298 | DECLARE_EVENT_CLASS(writeback_class, |
233 | TP_PROTO(struct backing_dev_info *bdi), | 299 | TP_PROTO(struct bdi_writeback *wb), |
234 | TP_ARGS(bdi), | 300 | TP_ARGS(wb), |
235 | TP_STRUCT__entry( | 301 | TP_STRUCT__entry( |
236 | __array(char, name, 32) | 302 | __array(char, name, 32) |
303 | __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) | ||
237 | ), | 304 | ), |
238 | TP_fast_assign( | 305 | TP_fast_assign( |
239 | strncpy(__entry->name, dev_name(bdi->dev), 32); | 306 | strncpy(__entry->name, dev_name(wb->bdi->dev), 32); |
307 | __trace_wb_assign_cgroup(__get_str(cgroup), wb); | ||
240 | ), | 308 | ), |
241 | TP_printk("bdi %s", | 309 | TP_printk("bdi %s: cgroup=%s", |
242 | __entry->name | 310 | __entry->name, |
311 | __get_str(cgroup) | ||
243 | ) | 312 | ) |
244 | ); | 313 | ); |
245 | #define DEFINE_WRITEBACK_EVENT(name) \ | 314 | #define DEFINE_WRITEBACK_EVENT(name) \ |
246 | DEFINE_EVENT(writeback_class, name, \ | 315 | DEFINE_EVENT(writeback_class, name, \ |
247 | TP_PROTO(struct backing_dev_info *bdi), \ | 316 | TP_PROTO(struct bdi_writeback *wb), \ |
248 | TP_ARGS(bdi)) | 317 | TP_ARGS(wb)) |
249 | 318 | ||
250 | DEFINE_WRITEBACK_EVENT(writeback_nowork); | 319 | DEFINE_WRITEBACK_EVENT(writeback_nowork); |
251 | DEFINE_WRITEBACK_EVENT(writeback_wake_background); | 320 | DEFINE_WRITEBACK_EVENT(writeback_wake_background); |
252 | DEFINE_WRITEBACK_EVENT(writeback_bdi_register); | 321 | |
322 | TRACE_EVENT(writeback_bdi_register, | ||
323 | TP_PROTO(struct backing_dev_info *bdi), | ||
324 | TP_ARGS(bdi), | ||
325 | TP_STRUCT__entry( | ||
326 | __array(char, name, 32) | ||
327 | ), | ||
328 | TP_fast_assign( | ||
329 | strncpy(__entry->name, dev_name(bdi->dev), 32); | ||
330 | ), | ||
331 | TP_printk("bdi %s", | ||
332 | __entry->name | ||
333 | ) | ||
334 | ); | ||
253 | 335 | ||
254 | DECLARE_EVENT_CLASS(wbc_class, | 336 | DECLARE_EVENT_CLASS(wbc_class, |
255 | TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), | 337 | TP_PROTO(struct writeback_control *wbc, struct backing_dev_info *bdi), |
@@ -265,6 +347,7 @@ DECLARE_EVENT_CLASS(wbc_class, | |||
265 | __field(int, range_cyclic) | 347 | __field(int, range_cyclic) |
266 | __field(long, range_start) | 348 | __field(long, range_start) |
267 | __field(long, range_end) | 349 | __field(long, range_end) |
350 | __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) | ||
268 | ), | 351 | ), |
269 | 352 | ||
270 | TP_fast_assign( | 353 | TP_fast_assign( |
@@ -278,11 +361,12 @@ DECLARE_EVENT_CLASS(wbc_class, | |||
278 | __entry->range_cyclic = wbc->range_cyclic; | 361 | __entry->range_cyclic = wbc->range_cyclic; |
279 | __entry->range_start = (long)wbc->range_start; | 362 | __entry->range_start = (long)wbc->range_start; |
280 | __entry->range_end = (long)wbc->range_end; | 363 | __entry->range_end = (long)wbc->range_end; |
364 | __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); | ||
281 | ), | 365 | ), |
282 | 366 | ||
283 | TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " | 367 | TP_printk("bdi %s: towrt=%ld skip=%ld mode=%d kupd=%d " |
284 | "bgrd=%d reclm=%d cyclic=%d " | 368 | "bgrd=%d reclm=%d cyclic=%d " |
285 | "start=0x%lx end=0x%lx", | 369 | "start=0x%lx end=0x%lx cgroup=%s", |
286 | __entry->name, | 370 | __entry->name, |
287 | __entry->nr_to_write, | 371 | __entry->nr_to_write, |
288 | __entry->pages_skipped, | 372 | __entry->pages_skipped, |
@@ -292,7 +376,9 @@ DECLARE_EVENT_CLASS(wbc_class, | |||
292 | __entry->for_reclaim, | 376 | __entry->for_reclaim, |
293 | __entry->range_cyclic, | 377 | __entry->range_cyclic, |
294 | __entry->range_start, | 378 | __entry->range_start, |
295 | __entry->range_end) | 379 | __entry->range_end, |
380 | __get_str(cgroup) | ||
381 | ) | ||
296 | ) | 382 | ) |
297 | 383 | ||
298 | #define DEFINE_WBC_EVENT(name) \ | 384 | #define DEFINE_WBC_EVENT(name) \ |
@@ -312,6 +398,7 @@ TRACE_EVENT(writeback_queue_io, | |||
312 | __field(long, age) | 398 | __field(long, age) |
313 | __field(int, moved) | 399 | __field(int, moved) |
314 | __field(int, reason) | 400 | __field(int, reason) |
401 | __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) | ||
315 | ), | 402 | ), |
316 | TP_fast_assign( | 403 | TP_fast_assign( |
317 | unsigned long *older_than_this = work->older_than_this; | 404 | unsigned long *older_than_this = work->older_than_this; |
@@ -321,13 +408,15 @@ TRACE_EVENT(writeback_queue_io, | |||
321 | (jiffies - *older_than_this) * 1000 / HZ : -1; | 408 | (jiffies - *older_than_this) * 1000 / HZ : -1; |
322 | __entry->moved = moved; | 409 | __entry->moved = moved; |
323 | __entry->reason = work->reason; | 410 | __entry->reason = work->reason; |
411 | __trace_wb_assign_cgroup(__get_str(cgroup), wb); | ||
324 | ), | 412 | ), |
325 | TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s", | 413 | TP_printk("bdi %s: older=%lu age=%ld enqueue=%d reason=%s cgroup=%s", |
326 | __entry->name, | 414 | __entry->name, |
327 | __entry->older, /* older_than_this in jiffies */ | 415 | __entry->older, /* older_than_this in jiffies */ |
328 | __entry->age, /* older_than_this in relative milliseconds */ | 416 | __entry->age, /* older_than_this in relative milliseconds */ |
329 | __entry->moved, | 417 | __entry->moved, |
330 | __print_symbolic(__entry->reason, WB_WORK_REASON) | 418 | __print_symbolic(__entry->reason, WB_WORK_REASON), |
419 | __get_str(cgroup) | ||
331 | ) | 420 | ) |
332 | ); | 421 | ); |
333 | 422 | ||
@@ -381,11 +470,11 @@ TRACE_EVENT(global_dirty_state, | |||
381 | 470 | ||
382 | TRACE_EVENT(bdi_dirty_ratelimit, | 471 | TRACE_EVENT(bdi_dirty_ratelimit, |
383 | 472 | ||
384 | TP_PROTO(struct backing_dev_info *bdi, | 473 | TP_PROTO(struct bdi_writeback *wb, |
385 | unsigned long dirty_rate, | 474 | unsigned long dirty_rate, |
386 | unsigned long task_ratelimit), | 475 | unsigned long task_ratelimit), |
387 | 476 | ||
388 | TP_ARGS(bdi, dirty_rate, task_ratelimit), | 477 | TP_ARGS(wb, dirty_rate, task_ratelimit), |
389 | 478 | ||
390 | TP_STRUCT__entry( | 479 | TP_STRUCT__entry( |
391 | __array(char, bdi, 32) | 480 | __array(char, bdi, 32) |
@@ -395,36 +484,39 @@ TRACE_EVENT(bdi_dirty_ratelimit, | |||
395 | __field(unsigned long, dirty_ratelimit) | 484 | __field(unsigned long, dirty_ratelimit) |
396 | __field(unsigned long, task_ratelimit) | 485 | __field(unsigned long, task_ratelimit) |
397 | __field(unsigned long, balanced_dirty_ratelimit) | 486 | __field(unsigned long, balanced_dirty_ratelimit) |
487 | __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) | ||
398 | ), | 488 | ), |
399 | 489 | ||
400 | TP_fast_assign( | 490 | TP_fast_assign( |
401 | strlcpy(__entry->bdi, dev_name(bdi->dev), 32); | 491 | strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); |
402 | __entry->write_bw = KBps(bdi->wb.write_bandwidth); | 492 | __entry->write_bw = KBps(wb->write_bandwidth); |
403 | __entry->avg_write_bw = KBps(bdi->wb.avg_write_bandwidth); | 493 | __entry->avg_write_bw = KBps(wb->avg_write_bandwidth); |
404 | __entry->dirty_rate = KBps(dirty_rate); | 494 | __entry->dirty_rate = KBps(dirty_rate); |
405 | __entry->dirty_ratelimit = KBps(bdi->wb.dirty_ratelimit); | 495 | __entry->dirty_ratelimit = KBps(wb->dirty_ratelimit); |
406 | __entry->task_ratelimit = KBps(task_ratelimit); | 496 | __entry->task_ratelimit = KBps(task_ratelimit); |
407 | __entry->balanced_dirty_ratelimit = | 497 | __entry->balanced_dirty_ratelimit = |
408 | KBps(bdi->wb.balanced_dirty_ratelimit); | 498 | KBps(wb->balanced_dirty_ratelimit); |
499 | __trace_wb_assign_cgroup(__get_str(cgroup), wb); | ||
409 | ), | 500 | ), |
410 | 501 | ||
411 | TP_printk("bdi %s: " | 502 | TP_printk("bdi %s: " |
412 | "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " | 503 | "write_bw=%lu awrite_bw=%lu dirty_rate=%lu " |
413 | "dirty_ratelimit=%lu task_ratelimit=%lu " | 504 | "dirty_ratelimit=%lu task_ratelimit=%lu " |
414 | "balanced_dirty_ratelimit=%lu", | 505 | "balanced_dirty_ratelimit=%lu cgroup=%s", |
415 | __entry->bdi, | 506 | __entry->bdi, |
416 | __entry->write_bw, /* write bandwidth */ | 507 | __entry->write_bw, /* write bandwidth */ |
417 | __entry->avg_write_bw, /* avg write bandwidth */ | 508 | __entry->avg_write_bw, /* avg write bandwidth */ |
418 | __entry->dirty_rate, /* bdi dirty rate */ | 509 | __entry->dirty_rate, /* bdi dirty rate */ |
419 | __entry->dirty_ratelimit, /* base ratelimit */ | 510 | __entry->dirty_ratelimit, /* base ratelimit */ |
420 | __entry->task_ratelimit, /* ratelimit with position control */ | 511 | __entry->task_ratelimit, /* ratelimit with position control */ |
421 | __entry->balanced_dirty_ratelimit /* the balanced ratelimit */ | 512 | __entry->balanced_dirty_ratelimit, /* the balanced ratelimit */ |
513 | __get_str(cgroup) | ||
422 | ) | 514 | ) |
423 | ); | 515 | ); |
424 | 516 | ||
425 | TRACE_EVENT(balance_dirty_pages, | 517 | TRACE_EVENT(balance_dirty_pages, |
426 | 518 | ||
427 | TP_PROTO(struct backing_dev_info *bdi, | 519 | TP_PROTO(struct bdi_writeback *wb, |
428 | unsigned long thresh, | 520 | unsigned long thresh, |
429 | unsigned long bg_thresh, | 521 | unsigned long bg_thresh, |
430 | unsigned long dirty, | 522 | unsigned long dirty, |
@@ -437,7 +529,7 @@ TRACE_EVENT(balance_dirty_pages, | |||
437 | long pause, | 529 | long pause, |
438 | unsigned long start_time), | 530 | unsigned long start_time), |
439 | 531 | ||
440 | TP_ARGS(bdi, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, | 532 | TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, |
441 | dirty_ratelimit, task_ratelimit, | 533 | dirty_ratelimit, task_ratelimit, |
442 | dirtied, period, pause, start_time), | 534 | dirtied, period, pause, start_time), |
443 | 535 | ||
@@ -456,11 +548,12 @@ TRACE_EVENT(balance_dirty_pages, | |||
456 | __field( long, pause) | 548 | __field( long, pause) |
457 | __field(unsigned long, period) | 549 | __field(unsigned long, period) |
458 | __field( long, think) | 550 | __field( long, think) |
551 | __dynamic_array(char, cgroup, __trace_wb_cgroup_size(wb)) | ||
459 | ), | 552 | ), |
460 | 553 | ||
461 | TP_fast_assign( | 554 | TP_fast_assign( |
462 | unsigned long freerun = (thresh + bg_thresh) / 2; | 555 | unsigned long freerun = (thresh + bg_thresh) / 2; |
463 | strlcpy(__entry->bdi, dev_name(bdi->dev), 32); | 556 | strlcpy(__entry->bdi, dev_name(wb->bdi->dev), 32); |
464 | 557 | ||
465 | __entry->limit = global_wb_domain.dirty_limit; | 558 | __entry->limit = global_wb_domain.dirty_limit; |
466 | __entry->setpoint = (global_wb_domain.dirty_limit + | 559 | __entry->setpoint = (global_wb_domain.dirty_limit + |
@@ -478,6 +571,7 @@ TRACE_EVENT(balance_dirty_pages, | |||
478 | __entry->period = period * 1000 / HZ; | 571 | __entry->period = period * 1000 / HZ; |
479 | __entry->pause = pause * 1000 / HZ; | 572 | __entry->pause = pause * 1000 / HZ; |
480 | __entry->paused = (jiffies - start_time) * 1000 / HZ; | 573 | __entry->paused = (jiffies - start_time) * 1000 / HZ; |
574 | __trace_wb_assign_cgroup(__get_str(cgroup), wb); | ||
481 | ), | 575 | ), |
482 | 576 | ||
483 | 577 | ||
@@ -486,7 +580,7 @@ TRACE_EVENT(balance_dirty_pages, | |||
486 | "bdi_setpoint=%lu bdi_dirty=%lu " | 580 | "bdi_setpoint=%lu bdi_dirty=%lu " |
487 | "dirty_ratelimit=%lu task_ratelimit=%lu " | 581 | "dirty_ratelimit=%lu task_ratelimit=%lu " |
488 | "dirtied=%u dirtied_pause=%u " | 582 | "dirtied=%u dirtied_pause=%u " |
489 | "paused=%lu pause=%ld period=%lu think=%ld", | 583 | "paused=%lu pause=%ld period=%lu think=%ld cgroup=%s", |
490 | __entry->bdi, | 584 | __entry->bdi, |
491 | __entry->limit, | 585 | __entry->limit, |
492 | __entry->setpoint, | 586 | __entry->setpoint, |
@@ -500,7 +594,8 @@ TRACE_EVENT(balance_dirty_pages, | |||
500 | __entry->paused, /* ms */ | 594 | __entry->paused, /* ms */ |
501 | __entry->pause, /* ms */ | 595 | __entry->pause, /* ms */ |
502 | __entry->period, /* ms */ | 596 | __entry->period, /* ms */ |
503 | __entry->think /* ms */ | 597 | __entry->think, /* ms */ |
598 | __get_str(cgroup) | ||
504 | ) | 599 | ) |
505 | ); | 600 | ); |
506 | 601 | ||
@@ -514,6 +609,8 @@ TRACE_EVENT(writeback_sb_inodes_requeue, | |||
514 | __field(unsigned long, ino) | 609 | __field(unsigned long, ino) |
515 | __field(unsigned long, state) | 610 | __field(unsigned long, state) |
516 | __field(unsigned long, dirtied_when) | 611 | __field(unsigned long, dirtied_when) |
612 | __dynamic_array(char, cgroup, | ||
613 | __trace_wb_cgroup_size(inode_to_wb(inode))) | ||
517 | ), | 614 | ), |
518 | 615 | ||
519 | TP_fast_assign( | 616 | TP_fast_assign( |
@@ -522,14 +619,16 @@ TRACE_EVENT(writeback_sb_inodes_requeue, | |||
522 | __entry->ino = inode->i_ino; | 619 | __entry->ino = inode->i_ino; |
523 | __entry->state = inode->i_state; | 620 | __entry->state = inode->i_state; |
524 | __entry->dirtied_when = inode->dirtied_when; | 621 | __entry->dirtied_when = inode->dirtied_when; |
622 | __trace_wb_assign_cgroup(__get_str(cgroup), inode_to_wb(inode)); | ||
525 | ), | 623 | ), |
526 | 624 | ||
527 | TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu", | 625 | TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu cgroup=%s", |
528 | __entry->name, | 626 | __entry->name, |
529 | __entry->ino, | 627 | __entry->ino, |
530 | show_inode_state(__entry->state), | 628 | show_inode_state(__entry->state), |
531 | __entry->dirtied_when, | 629 | __entry->dirtied_when, |
532 | (jiffies - __entry->dirtied_when) / HZ | 630 | (jiffies - __entry->dirtied_when) / HZ, |
631 | __get_str(cgroup) | ||
533 | ) | 632 | ) |
534 | ); | 633 | ); |
535 | 634 | ||
@@ -585,6 +684,7 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, | |||
585 | __field(unsigned long, writeback_index) | 684 | __field(unsigned long, writeback_index) |
586 | __field(long, nr_to_write) | 685 | __field(long, nr_to_write) |
587 | __field(unsigned long, wrote) | 686 | __field(unsigned long, wrote) |
687 | __dynamic_array(char, cgroup, __trace_wbc_cgroup_size(wbc)) | ||
588 | ), | 688 | ), |
589 | 689 | ||
590 | TP_fast_assign( | 690 | TP_fast_assign( |
@@ -596,10 +696,11 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, | |||
596 | __entry->writeback_index = inode->i_mapping->writeback_index; | 696 | __entry->writeback_index = inode->i_mapping->writeback_index; |
597 | __entry->nr_to_write = nr_to_write; | 697 | __entry->nr_to_write = nr_to_write; |
598 | __entry->wrote = nr_to_write - wbc->nr_to_write; | 698 | __entry->wrote = nr_to_write - wbc->nr_to_write; |
699 | __trace_wbc_assign_cgroup(__get_str(cgroup), wbc); | ||
599 | ), | 700 | ), |
600 | 701 | ||
601 | TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " | 702 | TP_printk("bdi %s: ino=%lu state=%s dirtied_when=%lu age=%lu " |
602 | "index=%lu to_write=%ld wrote=%lu", | 703 | "index=%lu to_write=%ld wrote=%lu cgroup=%s", |
603 | __entry->name, | 704 | __entry->name, |
604 | __entry->ino, | 705 | __entry->ino, |
605 | show_inode_state(__entry->state), | 706 | show_inode_state(__entry->state), |
@@ -607,7 +708,8 @@ DECLARE_EVENT_CLASS(writeback_single_inode_template, | |||
607 | (jiffies - __entry->dirtied_when) / HZ, | 708 | (jiffies - __entry->dirtied_when) / HZ, |
608 | __entry->writeback_index, | 709 | __entry->writeback_index, |
609 | __entry->nr_to_write, | 710 | __entry->nr_to_write, |
610 | __entry->wrote | 711 | __entry->wrote, |
712 | __get_str(cgroup) | ||
611 | ) | 713 | ) |
612 | ); | 714 | ); |
613 | 715 | ||