The symbol global_wb_domain is not GPL-exported to modules. In order to allow kernel tracers implemented as GPL modules to access the global writeback domain dirty limit, as used within the global_dirty_state and balance_dirty_pages trace events, pass a pointer to the global writeback domain as a new parameter for those tracepoints. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxxxx> Cc: Alexei Starovoitov <ast@xxxxxxxxxx> Cc: Daniel Borkmann <daniel@xxxxxxxxxxxxx> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: bpf@xxxxxxxxxxxxxxx Cc: netdev@xxxxxxxxxxxxxxx --- include/trace/events/writeback.h | 17 ++++++++++------- mm/page-writeback.c | 9 +++++---- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h index d94def25e4dc..8fd774108c9c 100644 --- a/include/trace/events/writeback.h +++ b/include/trace/events/writeback.h @@ -531,11 +531,13 @@ TRACE_EVENT(writeback_queue_io, TRACE_EVENT(global_dirty_state, - TP_PROTO(unsigned long background_thresh, + TP_PROTO(struct wb_domain *domain, + unsigned long background_thresh, unsigned long dirty_thresh ), - TP_ARGS(background_thresh, + TP_ARGS(domain, + background_thresh, dirty_thresh ), @@ -558,7 +560,7 @@ TRACE_EVENT(global_dirty_state, __entry->nr_written = global_node_page_state(NR_WRITTEN); __entry->background_thresh = background_thresh; __entry->dirty_thresh = dirty_thresh; - __entry->dirty_limit = global_wb_domain.dirty_limit; + __entry->dirty_limit = domain->dirty_limit; ), TP_printk("dirty=%lu writeback=%lu unstable=%lu " @@ -625,7 +627,8 @@ TRACE_EVENT(bdi_dirty_ratelimit, TRACE_EVENT(balance_dirty_pages, - TP_PROTO(struct bdi_writeback *wb, + TP_PROTO(struct wb_domain *domain, + struct bdi_writeback *wb, unsigned long thresh, unsigned long bg_thresh, unsigned long dirty, @@ -638,7 +641,7 @@ TRACE_EVENT(balance_dirty_pages, long pause, unsigned long start_time), - TP_ARGS(wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, + TP_ARGS(domain, wb, thresh, bg_thresh, dirty, bdi_thresh, bdi_dirty, dirty_ratelimit, task_ratelimit, dirtied, period, pause, start_time), @@ -664,8 +667,8 @@ TRACE_EVENT(balance_dirty_pages, unsigned long freerun = (thresh + bg_thresh) / 2; strscpy_pad(__entry->bdi, bdi_dev_name(wb->bdi), 32); - __entry->limit = global_wb_domain.dirty_limit; - __entry->setpoint = (global_wb_domain.dirty_limit + + __entry->limit = domain->dirty_limit; + __entry->setpoint = (domain->dirty_limit + freerun) / 2; __entry->dirty = dirty; __entry->bdi_setpoint = __entry->setpoint * diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 7326b54ab728..c76aae305360 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -443,9 +443,8 @@ static void domain_dirty_limits(struct dirty_throttle_control *dtc) dtc->thresh = thresh; dtc->bg_thresh = bg_thresh; - /* we should eventually report the domain in the TP */ if (!gdtc) - trace_global_dirty_state(bg_thresh, thresh); + trace_global_dirty_state(&global_wb_domain, bg_thresh, thresh); } /** @@ -1736,7 +1735,8 @@ static void balance_dirty_pages(struct bdi_writeback *wb, * do a reset, as it may be a light dirtier. */ if (pause < min_pause) { - trace_balance_dirty_pages(wb, + trace_balance_dirty_pages(&global_wb_domain, + wb, sdtc->thresh, sdtc->bg_thresh, sdtc->dirty, @@ -1765,7 +1765,8 @@ static void balance_dirty_pages(struct bdi_writeback *wb, } pause: - trace_balance_dirty_pages(wb, + trace_balance_dirty_pages(&global_wb_domain, + wb, sdtc->thresh, sdtc->bg_thresh, sdtc->dirty, -- 2.17.1