On Mon, 2019-01-28 at 12:10 -0800, Andrew Morton wrote: > On Mon, 28 Jan 2019 15:03:28 -0500 Rik van Riel <riel@xxxxxxxxxxx> > wrote: > > > On Mon, 2019-01-28 at 11:54 -0800, Andrew Morton wrote: > > > On Mon, 28 Jan 2019 14:35:35 -0500 Rik van Riel <riel@xxxxxxxxxxx > > > > > > > wrote: > > > > > > > memory. > > > > */ > > > > - delta = max_t(unsigned long long, delta, min(freeable, > > > > batch_size)); > > > > + if (!delta) { > > > > + shrinker->small_scan += freeable; > > > > + > > > > + delta = shrinker->small_scan >> priority; > > > > + shrinker->small_scan -= delta << priority; When delta is a non-zero number, we subtract (delta << priority) from shrinker->small_scan. That should happen every time delta >= (1<<priority), which is 4096 for DEF_PRIORITY. > > > > + > > > > + delta *= 4; > > > > + do_div(delta, shrinker->seeks); > > > > > > What prevents shrinker->small_scan from over- or underflowing > > > over > > > time? > > > > We only go into this code path if > > delta >> DEF_PRIORITY is zero. > > > > That is, freeable is smaller than 4096. > > > > I'm still not understanding. If `freeable' always has a value of > (say) > 1, we'll eventually overflow shrinker->small_scan? Or at least, it's > unobvious why this cannot happen. -- All Rights Reversed.
Attachment:
signature.asc
Description: This is a digitally signed message part