aboutsummaryrefslogtreecommitdiffstats
path: root/include/trace
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2015-08-18 17:54:56 -0400
committerJens Axboe <axboe@fb.com>2015-08-18 18:49:15 -0400
commit5634cc2aa9aebc77bc862992e7805469dcf83dac (patch)
treeb755b54562cf2df20679f0f823505aea2d48e2f4 /include/trace
parent9acee9c551f045d2c5b5261aa587331423fd7d92 (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.h180
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
137static 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
142static 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
151static 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
159static 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
170static inline size_t __trace_wb_cgroup_size(struct bdi_writeback *wb)
171{
172 return 2;
173}
174
175static inline void __trace_wb_assign_cgroup(char *buf, struct bdi_writeback *wb)
176{
177 strcpy(buf, "/");
178}
179
180static inline size_t __trace_wbc_cgroup_size(struct writeback_control *wbc)
181{
182 return 2;
183}
184
185static 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
134DECLARE_EVENT_CLASS(writeback_write_inode_template, 194DECLARE_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
174DECLARE_EVENT_CLASS(writeback_work_class, 237DECLARE_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) \
211DEFINE_EVENT(writeback_work_class, name, \ 277DEFINE_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))
214DEFINE_WRITEBACK_WORK_EVENT(writeback_queue); 280DEFINE_WRITEBACK_WORK_EVENT(writeback_queue);
215DEFINE_WRITEBACK_WORK_EVENT(writeback_exec); 281DEFINE_WRITEBACK_WORK_EVENT(writeback_exec);
216DEFINE_WRITEBACK_WORK_EVENT(writeback_start); 282DEFINE_WRITEBACK_WORK_EVENT(writeback_start);
@@ -230,26 +296,42 @@ TRACE_EVENT(writeback_pages_written,
230); 296);
231 297
232DECLARE_EVENT_CLASS(writeback_class, 298DECLARE_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) \
246DEFINE_EVENT(writeback_class, name, \ 315DEFINE_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
250DEFINE_WRITEBACK_EVENT(writeback_nowork); 319DEFINE_WRITEBACK_EVENT(writeback_nowork);
251DEFINE_WRITEBACK_EVENT(writeback_wake_background); 320DEFINE_WRITEBACK_EVENT(writeback_wake_background);
252DEFINE_WRITEBACK_EVENT(writeback_bdi_register); 321
322TRACE_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
254DECLARE_EVENT_CLASS(wbc_class, 336DECLARE_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
382TRACE_EVENT(bdi_dirty_ratelimit, 471TRACE_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
425TRACE_EVENT(balance_dirty_pages, 517TRACE_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