writeback: trace global_dirty_state
Wu Fengguang [Tue, 7 Dec 2010 04:34:29 +0000 (22:34 -0600)]
Add trace event balance_dirty_state for showing the global dirty page
counts and thresholds at each global_dirty_limits() invocation.  This
will cover the callers throttle_vm_writeout(), over_bground_thresh()
and each balance_dirty_pages() loop.

Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>

include/trace/events/writeback.h
mm/page-writeback.c

index 3e7662a..6bca4cc 100644 (file)
@@ -204,6 +204,52 @@ TRACE_EVENT(writeback_queue_io,
                __entry->moved)
 );
 
+TRACE_EVENT(global_dirty_state,
+
+       TP_PROTO(unsigned long background_thresh,
+                unsigned long dirty_thresh
+       ),
+
+       TP_ARGS(background_thresh,
+               dirty_thresh
+       ),
+
+       TP_STRUCT__entry(
+               __field(unsigned long,  nr_dirty)
+               __field(unsigned long,  nr_writeback)
+               __field(unsigned long,  nr_unstable)
+               __field(unsigned long,  background_thresh)
+               __field(unsigned long,  dirty_thresh)
+               __field(unsigned long,  dirty_limit)
+               __field(unsigned long,  nr_dirtied)
+               __field(unsigned long,  nr_written)
+       ),
+
+       TP_fast_assign(
+               __entry->nr_dirty       = global_page_state(NR_FILE_DIRTY);
+               __entry->nr_writeback   = global_page_state(NR_WRITEBACK);
+               __entry->nr_unstable    = global_page_state(NR_UNSTABLE_NFS);
+               __entry->nr_dirtied     = global_page_state(NR_DIRTIED);
+               __entry->nr_written     = global_page_state(NR_WRITTEN);
+               __entry->background_thresh = background_thresh;
+               __entry->dirty_thresh   = dirty_thresh;
+               __entry->dirty_limit = global_dirty_limit;
+       ),
+
+       TP_printk("dirty=%lu writeback=%lu unstable=%lu "
+                 "bg_thresh=%lu thresh=%lu limit=%lu "
+                 "dirtied=%lu written=%lu",
+                 __entry->nr_dirty,
+                 __entry->nr_writeback,
+                 __entry->nr_unstable,
+                 __entry->background_thresh,
+                 __entry->dirty_thresh,
+                 __entry->dirty_limit,
+                 __entry->nr_dirtied,
+                 __entry->nr_written
+       )
+);
+
 DECLARE_EVENT_CLASS(writeback_congest_waited_template,
 
        TP_PROTO(unsigned int usec_timeout, unsigned int usec_delayed),
index 798842a..f9d9f54 100644 (file)
@@ -447,6 +447,7 @@ void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty)
        }
        *pbackground = background;
        *pdirty = dirty;
+       trace_global_dirty_state(background, dirty);
 }
 
 /**