Re: [PATCH 02/18] writeback: dirty position control

From: Wu Fengguang
Date: Mon Sep 05 2011 - 22:10:57 EST


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-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/