forked from luck/tmp_suning_uos_patched
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
|
@ -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),
|
||||
|
|
|
@ -1103,12 +1103,34 @@ static void balance_dirty_pages(struct address_space *mapping,
|
|||
pos_ratio >> RATELIMIT_CALC_SHIFT;
|
||||
pause = (HZ * pages_dirtied) / (task_ratelimit | 1);
|
||||
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 */
|
||||
break;
|
||||
}
|
||||
pause = min(pause, max_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);
|
||||
io_schedule_timeout(pause);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user