On Fri, Apr 22, 2022 at 01:54:13PM -0700, Andrew Morton wrote: > From: Chen Wandun <chenwandun@xxxxxxxxxx> > Subject: mm: rework calculation of bdi_min_ratio in bdi_set_min_ratio > > In function bdi_set_min_ratio, min_ratio is unsigned int, it will > result underflow when setting min_ratio below bdi->min_ratio, it > is confusing. Rework it, no functional change. > > Link: https://lkml.kernel.org/r/20220422095159.2858305-1-chenwandun@xxxxxxxxxx > Signed-off-by: Chen Wandun <chenwandun@xxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Cc: Jens Axboe <axboe@xxxxxxxxx> > Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > --- > > mm/page-writeback.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > --- a/mm/page-writeback.c~mm-rework-calculation-of-bdi_min_ratio-in-bdi_set_min_ratio > +++ a/mm/page-writeback.c > @@ -650,18 +650,25 @@ static unsigned int bdi_min_ratio; > > int bdi_set_min_ratio(struct backing_dev_info *bdi, unsigned int min_ratio) > { > + unsigned int delta; > int ret = 0; > > spin_lock_bh(&bdi_lock); > if (min_ratio > bdi->max_ratio) { > ret = -EINVAL; > } else { > - min_ratio -= bdi->min_ratio; > - if (bdi_min_ratio + min_ratio < 100) { > - bdi_min_ratio += min_ratio; > - bdi->min_ratio += min_ratio; > } else { > - ret = -EINVAL; I really don't see the why we're doing this, code gets to be worse, for no actual gain. > + if (min_ratio < bdi->min_ratio) { > + delta = bdi->min_ratio - min_ratio; > + bdi_min_ratio -= delta; > + bdi->min_ratio = min_ratio; > } else { > + delta = min_ratio - bdi->min_ratio; > + if (bdi_min_ratio + delta < 100) { > + bdi_min_ratio += delta; > + bdi->min_ratio = min_ratio; > + } else { > + ret = -EINVAL; > + } > } > }