writeback: trace event balance_dirty_pages
Useful for analyzing the dynamics of the throttling algorithms and debugging user reported problems. Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
This commit is contained in:
@ -271,6 +271,79 @@ TRACE_EVENT(bdi_dirty_ratelimit,
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(balance_dirty_pages,
|
||||
|
||||
TP_PROTO(struct backing_dev_info *bdi,
|
||||
unsigned long thresh,
|
||||
unsigned long bg_thresh,
|
||||
unsigned long dirty,
|
||||
unsigned long bdi_thresh,
|
||||
unsigned long bdi_dirty,
|
||||
unsigned long dirty_ratelimit,
|
||||
unsigned long task_ratelimit,
|
||||
unsigned long dirtied,
|
||||
long pause,
|
||||
unsigned long start_time),
|
||||
|
||||
TP_ARGS(bdi, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty,
|
||||
dirty_ratelimit, task_ratelimit,
|
||||
dirtied, pause, start_time),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__array( char, bdi, 32)
|
||||
__field(unsigned long, limit)
|
||||
__field(unsigned long, setpoint)
|
||||
__field(unsigned long, dirty)
|
||||
__field(unsigned long, bdi_setpoint)
|
||||
__field(unsigned long, bdi_dirty)
|
||||
__field(unsigned long, dirty_ratelimit)
|
||||
__field(unsigned long, task_ratelimit)
|
||||
__field(unsigned int, dirtied)
|
||||
__field(unsigned int, dirtied_pause)
|
||||
__field(unsigned long, paused)
|
||||
__field( long, pause)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
unsigned long freerun = (thresh + bg_thresh) / 2;
|
||||
strlcpy(__entry->bdi, dev_name(bdi->dev), 32);
|
||||
|
||||
__entry->limit = global_dirty_limit;
|
||||
__entry->setpoint = (global_dirty_limit + freerun) / 2;
|
||||
__entry->dirty = dirty;
|
||||
__entry->bdi_setpoint = __entry->setpoint *
|
||||
bdi_thresh / (thresh + 1);
|
||||
__entry->bdi_dirty = bdi_dirty;
|
||||
__entry->dirty_ratelimit = KBps(dirty_ratelimit);
|
||||
__entry->task_ratelimit = KBps(task_ratelimit);
|
||||
__entry->dirtied = dirtied;
|
||||
__entry->dirtied_pause = current->nr_dirtied_pause;
|
||||
__entry->pause = pause * 1000 / HZ;
|
||||
__entry->paused = (jiffies - start_time) * 1000 / HZ;
|
||||
),
|
||||
|
||||
|
||||
TP_printk("bdi %s: "
|
||||
"limit=%lu setpoint=%lu dirty=%lu "
|
||||
"bdi_setpoint=%lu bdi_dirty=%lu "
|
||||
"dirty_ratelimit=%lu task_ratelimit=%lu "
|
||||
"dirtied=%u dirtied_pause=%u "
|
||||
"paused=%lu pause=%ld",
|
||||
__entry->bdi,
|
||||
__entry->limit,
|
||||
__entry->setpoint,
|
||||
__entry->dirty,
|
||||
__entry->bdi_setpoint,
|
||||
__entry->bdi_dirty,
|
||||
__entry->dirty_ratelimit,
|
||||
__entry->task_ratelimit,
|
||||
__entry->dirtied,
|
||||
__entry->dirtied_pause,
|
||||
__entry->paused, /* ms */
|
||||
__entry->pause /* ms */
|
||||
)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(writeback_congest_waited_template,
|
||||
|
||||
TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
|
||||
|
Reference in New Issue
Block a user