On Mon 03-03-25 18:06:16, Tang Yizhou wrote: > From: Tang Yizhou <yizhou.tang@xxxxxxxxxx> > > Currently, trace_balance_dirty_pages() already has 12 parameters. In the > next patch, I initially attempted to introduce an additional parameter. > However, in include/linux/trace_events.h, bpf_trace_run12() only supports > up to 12 parameters and bpf_trace_run13() does not exist. > > To reduce the number of parameters in trace_balance_dirty_pages(), we can > make it accept a pointer to struct dirty_throttle_control as a parameter. > To achieve this, we need to move the definition of struct > dirty_throttle_control from mm/page-writeback.c to > include/linux/writeback.h. > > By the way, rename bdi_setpoint and bdi_dirty in the tracepoint to > wb_setpoint and wb_dirty, respectively. These changes were omitted by > Tejun in the cgroup writeback patchset. > > Signed-off-by: Tang Yizhou <yizhou.tang@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > include/linux/writeback.h | 23 +++++++++++++++++++++ > include/trace/events/writeback.h | 28 +++++++++++-------------- > mm/page-writeback.c | 35 ++------------------------------ > 3 files changed, 37 insertions(+), 49 deletions(-) > > diff --git a/include/linux/writeback.h b/include/linux/writeback.h > index d11b903c2edb..32095928365c 100644 > --- a/include/linux/writeback.h > +++ b/include/linux/writeback.h > @@ -313,6 +313,29 @@ static inline void cgroup_writeback_umount(struct super_block *sb) > /* > * mm/page-writeback.c > */ > +/* consolidated parameters for balance_dirty_pages() and its subroutines */ > +struct dirty_throttle_control { > +#ifdef CONFIG_CGROUP_WRITEBACK > + struct wb_domain *dom; > + struct dirty_throttle_control *gdtc; /* only set in memcg dtc's */ > +#endif > + struct bdi_writeback *wb; > + struct fprop_local_percpu *wb_completions; > + > + unsigned long avail; /* dirtyable */ > + unsigned long dirty; /* file_dirty + write + nfs */ > + unsigned long thresh; /* dirty threshold */ > + unsigned long bg_thresh; /* dirty background threshold */ > + > + unsigned long wb_dirty; /* per-wb counterparts */ > + unsigned long wb_thresh; > + unsigned long wb_bg_thresh; > + > + unsigned long pos_ratio; > + bool freerun; > + bool dirty_exceeded; > +}; > + > void laptop_io_completion(struct backing_dev_info *info); > void laptop_sync_completion(void); > void laptop_mode_timer_fn(struct timer_list *t); > diff --git a/include/trace/events/writeback.h b/include/trace/events/writeback.h > index a261e86e61fa..3046ca6b08ea 100644 > --- a/include/trace/events/writeback.h > +++ b/include/trace/events/writeback.h > @@ -629,11 +629,7 @@ TRACE_EVENT(bdi_dirty_ratelimit, > TRACE_EVENT(balance_dirty_pages, > > TP_PROTO(struct bdi_writeback *wb, > - unsigned long thresh, > - unsigned long bg_thresh, > - unsigned long dirty, > - unsigned long bdi_thresh, > - unsigned long bdi_dirty, > + struct dirty_throttle_control *dtc, > unsigned long dirty_ratelimit, > unsigned long task_ratelimit, > unsigned long dirtied, > @@ -641,7 +637,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(wb, dtc, > dirty_ratelimit, task_ratelimit, > dirtied, period, pause, start_time), > > @@ -650,8 +646,8 @@ TRACE_EVENT(balance_dirty_pages, > __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, wb_setpoint) > + __field(unsigned long, wb_dirty) > __field(unsigned long, dirty_ratelimit) > __field(unsigned long, task_ratelimit) > __field(unsigned int, dirtied) > @@ -664,16 +660,16 @@ TRACE_EVENT(balance_dirty_pages, > ), > > TP_fast_assign( > - unsigned long freerun = (thresh + bg_thresh) / 2; > + unsigned long freerun = (dtc->thresh + dtc->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 + > freerun) / 2; > - __entry->dirty = dirty; > - __entry->bdi_setpoint = __entry->setpoint * > - bdi_thresh / (thresh + 1); > - __entry->bdi_dirty = bdi_dirty; > + __entry->dirty = dtc->dirty; > + __entry->wb_setpoint = __entry->setpoint * > + dtc->wb_thresh / (dtc->thresh + 1); > + __entry->wb_dirty = dtc->wb_dirty; > __entry->dirty_ratelimit = KBps(dirty_ratelimit); > __entry->task_ratelimit = KBps(task_ratelimit); > __entry->dirtied = dirtied; > @@ -689,7 +685,7 @@ TRACE_EVENT(balance_dirty_pages, > > TP_printk("bdi %s: " > "limit=%lu setpoint=%lu dirty=%lu " > - "bdi_setpoint=%lu bdi_dirty=%lu " > + "wb_setpoint=%lu wb_dirty=%lu " > "dirty_ratelimit=%lu task_ratelimit=%lu " > "dirtied=%u dirtied_pause=%u " > "paused=%lu pause=%ld period=%lu think=%ld cgroup_ino=%lu", > @@ -697,8 +693,8 @@ TRACE_EVENT(balance_dirty_pages, > __entry->limit, > __entry->setpoint, > __entry->dirty, > - __entry->bdi_setpoint, > - __entry->bdi_dirty, > + __entry->wb_setpoint, > + __entry->wb_dirty, > __entry->dirty_ratelimit, > __entry->task_ratelimit, > __entry->dirtied, > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > index eb55ece39c56..e980b2aec352 100644 > --- a/mm/page-writeback.c > +++ b/mm/page-writeback.c > @@ -120,29 +120,6 @@ EXPORT_SYMBOL(laptop_mode); > > struct wb_domain global_wb_domain; > > -/* consolidated parameters for balance_dirty_pages() and its subroutines */ > -struct dirty_throttle_control { > -#ifdef CONFIG_CGROUP_WRITEBACK > - struct wb_domain *dom; > - struct dirty_throttle_control *gdtc; /* only set in memcg dtc's */ > -#endif > - struct bdi_writeback *wb; > - struct fprop_local_percpu *wb_completions; > - > - unsigned long avail; /* dirtyable */ > - unsigned long dirty; /* file_dirty + write + nfs */ > - unsigned long thresh; /* dirty threshold */ > - unsigned long bg_thresh; /* dirty background threshold */ > - > - unsigned long wb_dirty; /* per-wb counterparts */ > - unsigned long wb_thresh; > - unsigned long wb_bg_thresh; > - > - unsigned long pos_ratio; > - bool freerun; > - bool dirty_exceeded; > -}; > - > /* > * Length of period for aging writeout fractions of bdis. This is an > * arbitrarily chosen number. The longer the period, the slower fractions will > @@ -1962,11 +1939,7 @@ static int balance_dirty_pages(struct bdi_writeback *wb, > */ > if (pause < min_pause) { > trace_balance_dirty_pages(wb, > - sdtc->thresh, > - sdtc->bg_thresh, > - sdtc->dirty, > - sdtc->wb_thresh, > - sdtc->wb_dirty, > + sdtc, > dirty_ratelimit, > task_ratelimit, > pages_dirtied, > @@ -1991,11 +1964,7 @@ static int balance_dirty_pages(struct bdi_writeback *wb, > > pause: > trace_balance_dirty_pages(wb, > - sdtc->thresh, > - sdtc->bg_thresh, > - sdtc->dirty, > - sdtc->wb_thresh, > - sdtc->wb_dirty, > + sdtc, > dirty_ratelimit, > task_ratelimit, > pages_dirtied, > -- > 2.25.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR