On Mon, Sep 05, 2011 at 11:02:59PM +0800, Peter Zijlstra wrote: > On Sun, 2011-09-04 at 09:53 +0800, Wu Fengguang wrote: > > + * (o) bdi control lines > > + * > > + * The control lines for the global/bdi setpoints both stretch up to @limit. > > + * The below figure illustrates the main bdi control line with an auxiliary > > + * line extending it to @limit. > > + * > > + * o > > + * o > > + * o [o] main control line > > + * o [*] auxiliary control line > > + * o > > + * o > > + * o > > + * o > > + * o > > + * o > > + * o--------------------- balance point, rate scale = 1 > > + * | o > > + * | o > > + * | o > > + * | o > > + * | o > > + * | o > > + * | o------- connect point, rate scale = 1/2 > > + * | .* > > + * | . * > > + * | . * > > + * | . * > > + * | . * > > + * | . * > > + * | . * > > + * [--------------------+-----------------------------.--------------------*] > > + * 0 bdi_setpoint x_intercept limit > > + * > > + * The auxiliary control line allows smoothly throttling bdi_dirty down to > > + * normal if it starts high in situations like > > + * - start writing to a slow SD card and a fast disk at the same time. The SD > > + * card's bdi_dirty may rush to many times higher than bdi_setpoint. > > + * - the bdi dirty thresh drops quickly due to change of JBOD workload > > In light of the global control thing already having a hard stop at > limit, what's the point of the auxiliary line? Why not simply run the > bdi control between [0.5, 1.5] and leave it at that? Good point! It helps remove one confusing concept. This patch reduces the auxiliary control line to a flat y=0.25 line. The comments will be further simplified, too. Thanks, Fengguang --- mm/page-writeback.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) --- linux-next.orig/mm/page-writeback.c 2011-09-06 09:59:50.000000000 +0800 +++ linux-next/mm/page-writeback.c 2011-09-06 10:05:31.000000000 +0800 @@ -676,18 +676,11 @@ static unsigned long bdi_position_ratio( span = (thresh - bdi_thresh + 8 * write_bw) * (u64)x >> 16; x_intercept = bdi_setpoint + span; - span >>= 1; - if (unlikely(bdi_dirty > bdi_setpoint + span)) { - if (unlikely(bdi_dirty > limit)) - return 0; - if (x_intercept < limit) { - x_intercept = limit; /* auxiliary control line */ - bdi_setpoint += span; - pos_ratio >>= 1; - } - } - pos_ratio *= x_intercept - bdi_dirty; - do_div(pos_ratio, x_intercept - bdi_setpoint + 1); + if (bdi_dirty < x_intercept - span / 4) { + pos_ratio *= x_intercept - bdi_dirty; + do_div(pos_ratio, x_intercept - bdi_setpoint + 1); + } else + pos_ratio /= 4; return pos_ratio; } -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html