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:
parent
b48c104d22
commit
ece13ac31b
2 changed files with 95 additions and 0 deletions
|
@ -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,
|
DECLARE_EVENT_CLASS(writeback_congest_waited_template,
|
||||||
|
|
||||||
TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
|
TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
|
||||||
|
|
|
@ -1103,12 +1103,34 @@ static void balance_dirty_pages(struct address_space *mapping,
|
||||||
pos_ratio >> RATELIMIT_CALC_SHIFT;
|
pos_ratio >> RATELIMIT_CALC_SHIFT;
|
||||||
pause = (HZ * pages_dirtied) / (task_ratelimit | 1);
|
pause = (HZ * pages_dirtied) / (task_ratelimit | 1);
|
||||||
if (unlikely(pause <= 0)) {
|
if (unlikely(pause <= 0)) {
|
||||||
|
trace_balance_dirty_pages(bdi,
|
||||||
|
dirty_thresh,
|
||||||
|
background_thresh,
|
||||||
|
nr_dirty,
|
||||||
|
bdi_thresh,
|
||||||
|
bdi_dirty,
|
||||||
|
dirty_ratelimit,
|
||||||
|
task_ratelimit,
|
||||||
|
pages_dirtied,
|
||||||
|
pause,
|
||||||
|
start_time);
|
||||||
pause = 1; /* avoid resetting nr_dirtied_pause below */
|
pause = 1; /* avoid resetting nr_dirtied_pause below */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pause = min(pause, max_pause);
|
pause = min(pause, max_pause);
|
||||||
|
|
||||||
pause:
|
pause:
|
||||||
|
trace_balance_dirty_pages(bdi,
|
||||||
|
dirty_thresh,
|
||||||
|
background_thresh,
|
||||||
|
nr_dirty,
|
||||||
|
bdi_thresh,
|
||||||
|
bdi_dirty,
|
||||||
|
dirty_ratelimit,
|
||||||
|
task_ratelimit,
|
||||||
|
pages_dirtied,
|
||||||
|
pause,
|
||||||
|
start_time);
|
||||||
__set_current_state(TASK_UNINTERRUPTIBLE);
|
__set_current_state(TASK_UNINTERRUPTIBLE);
|
||||||
io_schedule_timeout(pause);
|
io_schedule_timeout(pause);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue