There is strong evidence to indicate a lot of time is being spent in congestion_wait(), some of it unnecessarily. This patch adds a tracepoint for congestion_wait to record when congestion_wait() occurred and how long was spent. Signed-off-by: Mel Gorman <mel@xxxxxxxxx> --- include/trace/events/writeback.h | 17 +++++++++++++++++ mm/backing-dev.c | 4 ++++ 2 files changed, 21 insertions(+), 0 deletions(-) diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index f345f66..e3bee61 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -153,6 +153,23 @@ DEFINE_WBC_EVENT(wbc_balance_dirty_written); DEFINE_WBC_EVENT(wbc_balance_dirty_wait); DEFINE_WBC_EVENT(wbc_writepage); +TRACE_EVENT(writeback_congest_waited, + + TP_PROTO(unsigned int usec_delayed), + + TP_ARGS(usec_delayed), + + TP_STRUCT__entry( + __field( unsigned int, usec_delayed ) + ), + + TP_fast_assign( + __entry->usec_delayed = usec_delayed; + ), + + TP_printk("usec_delayed=%u", __entry->usec_delayed) +); + #endif /* _TRACE_WRITEBACK_H */ /* This part must be outside protection */ diff --git a/mm/backing-dev.c b/mm/backing-dev.c index eaa4a5b..7ae33e2 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -759,12 +759,16 @@ EXPORT_SYMBOL(set_bdi_congested); long congestion_wait(int sync, long timeout) { long ret; + unsigned long start = jiffies; DEFINE_WAIT(wait); wait_queue_head_t *wqh = &congestion_wqh[sync]; prepare_to_wait(wqh, &wait, TASK_UNINTERRUPTIBLE); ret = io_schedule_timeout(timeout); finish_wait(wqh, &wait); + + trace_writeback_congest_waited(jiffies_to_usecs(jiffies - start)); + return ret; } EXPORT_SYMBOL(congestion_wait); -- 1.7.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>