On 2019/12/12 11:48 上午, John Stoffel wrote: >>>>>> "Sasha" == Sasha Levin <sashal@xxxxxxxxxx> writes: > > Sasha> From: Coly Li <colyli@xxxxxxx> > Sasha> [ Upstream commit 9fcc34b1a6dd4b8e5337e2b6ef45e428897eca6b ] > > Sasha> In bch_mca_scan(), the number of shrinking btree node is calculated > Sasha> by code like this, > Sasha> unsigned long nr = sc->nr_to_scan; > > Sasha> nr /= c->btree_pages; > Sasha> nr = min_t(unsigned long, nr, mca_can_free(c)); > Sasha> variable sc->nr_to_scan is number of objects (here is bcache B+tree > Sasha> nodes' number) to shrink, and pointer variable sc is sent from memory > Sasha> management code as parametr of a callback. > > Sasha> If sc->nr_to_scan is smaller than c->btree_pages, after the above > Sasha> calculation, variable 'nr' will be 0 and nothing will be shrunk. It is > Sasha> frequeently observed that only 1 or 2 is set to sc->nr_to_scan and make > Sasha> nr to be zero. Then bch_mca_scan() will do nothing more then acquiring > Sasha> and releasing mutex c->bucket_lock. > > Sasha> This patch checkes whether nr is 0 after the above calculation, if 0 > Sasha> is the result then set 1 to variable 'n'. Then at least bch_mca_scan() > Sasha> will try to shrink a single B+tree node. > > Sasha> nr /= c->btree_pages; > Sasha> + if (nr == 0) > Sasha> + nr = 1; > > > Wouldn't it be even more clear with: > > nr /= c->bree_pages || 1; > > instead? No, it is not more clear. At least to me, I may confuse does it mean, - nr = (nr / c->btree_pages) || 1; - or nr = nr / (c->btree_pages || 1) If I don't check C manual, I am not able to tell the correct calculate at first time. Thanks. -- Coly Li