Commit 8a731799 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe

writeback: reorganize [__]wb_update_bandwidth()

__wb_update_bandwidth() is called from two places -
fs/fs-writeback.c::balance_dirty_pages() and
mm/page-writeback.c::wb_writeback().  The latter updates only the
write bandwidth while the former also deals with the dirty ratelimit.
The two callsites are distinguished by whether @thresh parameter is
zero or not, which is cryptic.  In addition, the two files define
their own different versions of wb_update_bandwidth() on top of
__wb_update_bandwidth(), which is confusing to say the least.  This
patch cleans up [__]wb_update_bandwidth() in the following ways.

* __wb_update_bandwidth() now takes explicit @update_ratelimit
  parameter to gate dirty ratelimit handling.

* mm/page-writeback.c::wb_update_bandwidth() is flattened into its
  caller - balance_dirty_pages().

* fs/fs-writeback.c::wb_update_bandwidth() is moved to
  mm/page-writeback.c and __wb_update_bandwidth() is made static.

* While at it, add a lockdep assertion to __wb_update_bandwidth().

Except for the lockdep addition, this is pure reorganization and
doesn't introduce any behavioral changes.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Jan Kara <jack@suse.cz>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Greg Thelen <gthelen@google.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 0d960a38
...@@ -1087,16 +1087,6 @@ static bool over_bground_thresh(struct bdi_writeback *wb) ...@@ -1087,16 +1087,6 @@ static bool over_bground_thresh(struct bdi_writeback *wb)
return false; return false;
} }
/*
* Called under wb->list_lock. If there are multiple wb per bdi,
* only the flusher working on the first wb should do it.
*/
static void wb_update_bandwidth(struct bdi_writeback *wb,
unsigned long start_time)
{
__wb_update_bandwidth(wb, 0, 0, 0, 0, 0, start_time);
}
/* /*
* Explicit flushing or periodic writeback of "old" data. * Explicit flushing or periodic writeback of "old" data.
* *
......
...@@ -157,14 +157,7 @@ int dirty_writeback_centisecs_handler(struct ctl_table *, int, ...@@ -157,14 +157,7 @@ int dirty_writeback_centisecs_handler(struct ctl_table *, int,
void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty); void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty);
unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh); unsigned long wb_calc_thresh(struct bdi_writeback *wb, unsigned long thresh);
void __wb_update_bandwidth(struct bdi_writeback *wb, void wb_update_bandwidth(struct bdi_writeback *wb, unsigned long start_time);
unsigned long thresh,
unsigned long bg_thresh,
unsigned long dirty,
unsigned long bdi_thresh,
unsigned long bdi_dirty,
unsigned long start_time);
void page_writeback_init(void); void page_writeback_init(void);
void balance_dirty_pages_ratelimited(struct address_space *mapping); void balance_dirty_pages_ratelimited(struct address_space *mapping);
......
...@@ -1160,19 +1160,22 @@ static void wb_update_dirty_ratelimit(struct bdi_writeback *wb, ...@@ -1160,19 +1160,22 @@ static void wb_update_dirty_ratelimit(struct bdi_writeback *wb,
trace_bdi_dirty_ratelimit(wb->bdi, dirty_rate, task_ratelimit); trace_bdi_dirty_ratelimit(wb->bdi, dirty_rate, task_ratelimit);
} }
void __wb_update_bandwidth(struct bdi_writeback *wb, static void __wb_update_bandwidth(struct bdi_writeback *wb,
unsigned long thresh, unsigned long thresh,
unsigned long bg_thresh, unsigned long bg_thresh,
unsigned long dirty, unsigned long dirty,
unsigned long wb_thresh, unsigned long wb_thresh,
unsigned long wb_dirty, unsigned long wb_dirty,
unsigned long start_time) unsigned long start_time,
bool update_ratelimit)
{ {
unsigned long now = jiffies; unsigned long now = jiffies;
unsigned long elapsed = now - wb->bw_time_stamp; unsigned long elapsed = now - wb->bw_time_stamp;
unsigned long dirtied; unsigned long dirtied;
unsigned long written; unsigned long written;
lockdep_assert_held(&wb->list_lock);
/* /*
* rate-limit, only update once every 200ms. * rate-limit, only update once every 200ms.
*/ */
...@@ -1189,7 +1192,7 @@ void __wb_update_bandwidth(struct bdi_writeback *wb, ...@@ -1189,7 +1192,7 @@ void __wb_update_bandwidth(struct bdi_writeback *wb,
if (elapsed > HZ && time_before(wb->bw_time_stamp, start_time)) if (elapsed > HZ && time_before(wb->bw_time_stamp, start_time))
goto snapshot; goto snapshot;
if (thresh) { if (update_ratelimit) {
global_update_bandwidth(thresh, dirty, now); global_update_bandwidth(thresh, dirty, now);
wb_update_dirty_ratelimit(wb, thresh, bg_thresh, dirty, wb_update_dirty_ratelimit(wb, thresh, bg_thresh, dirty,
wb_thresh, wb_dirty, wb_thresh, wb_dirty,
...@@ -1203,20 +1206,9 @@ void __wb_update_bandwidth(struct bdi_writeback *wb, ...@@ -1203,20 +1206,9 @@ void __wb_update_bandwidth(struct bdi_writeback *wb,
wb->bw_time_stamp = now; wb->bw_time_stamp = now;
} }
static void wb_update_bandwidth(struct bdi_writeback *wb, void wb_update_bandwidth(struct bdi_writeback *wb, unsigned long start_time)
unsigned long thresh,
unsigned long bg_thresh,
unsigned long dirty,
unsigned long wb_thresh,
unsigned long wb_dirty,
unsigned long start_time)
{ {
if (time_is_after_eq_jiffies(wb->bw_time_stamp + BANDWIDTH_INTERVAL)) __wb_update_bandwidth(wb, 0, 0, 0, 0, 0, start_time, false);
return;
spin_lock(&wb->list_lock);
__wb_update_bandwidth(wb, thresh, bg_thresh, dirty,
wb_thresh, wb_dirty, start_time);
spin_unlock(&wb->list_lock);
} }
/* /*
...@@ -1467,8 +1459,15 @@ static void balance_dirty_pages(struct address_space *mapping, ...@@ -1467,8 +1459,15 @@ static void balance_dirty_pages(struct address_space *mapping,
if (dirty_exceeded && !wb->dirty_exceeded) if (dirty_exceeded && !wb->dirty_exceeded)
wb->dirty_exceeded = 1; wb->dirty_exceeded = 1;
wb_update_bandwidth(wb, dirty_thresh, background_thresh, if (time_is_before_jiffies(wb->bw_time_stamp +
nr_dirty, wb_thresh, wb_dirty, start_time); BANDWIDTH_INTERVAL)) {
spin_lock(&wb->list_lock);
__wb_update_bandwidth(wb, dirty_thresh,
background_thresh, nr_dirty,
wb_thresh, wb_dirty, start_time,
true);
spin_unlock(&wb->list_lock);
}
dirty_ratelimit = wb->dirty_ratelimit; dirty_ratelimit = wb->dirty_ratelimit;
pos_ratio = wb_position_ratio(wb, dirty_thresh, pos_ratio = wb_position_ratio(wb, dirty_thresh,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment