]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
bcache: fix using of loop variable in memory shrink
authorTang Junhui <tang.junhui@zte.com.cn>
Mon, 19 Mar 2018 00:36:22 +0000 (17:36 -0700)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 14 Aug 2019 09:18:49 +0000 (11:18 +0200)
BugLink: https://bugs.launchpad.net/bugs/1784665
In bch_mca_scan(), There are some confusion and logical error in the use of
loop variables. In this patch, we clarify them as:
1) nr: the number of btree nodes needs to scan, which will decrease after
we scan a btree node, and should not be less than 0;
2) i: the number of btree nodes have scanned, includes both
btree_cache_freeable and btree_cache, which should not be bigger than
btree_cache_used;
3) freed: the number of btree nodes have freed.

Signed-off-by: Tang Junhui <tang.junhui@zte.com.cn>
Reviewed-by: Michael Lyle <mlyle@lyle.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
(cherry picked from commit ca71df31661a0518ed58a1a59cf1993962153ebb)
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
drivers/md/bcache/btree.c

index 01ba49a5e9a8d41516846c2cbff5cf636fd6adc6..435e5da00e7759ac2cb871da3cd39957fc349712 100644 (file)
@@ -664,6 +664,7 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,
        struct btree *b, *t;
        unsigned long i, nr = sc->nr_to_scan;
        unsigned long freed = 0;
+       unsigned int btree_cache_used;
 
        if (c->shrinker_disabled)
                return SHRINK_STOP;
@@ -688,9 +689,10 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,
        nr = min_t(unsigned long, nr, mca_can_free(c));
 
        i = 0;
+       btree_cache_used = c->btree_cache_used;
        list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) {
-               if (freed >= nr)
-                       break;
+               if (nr <= 0)
+                       goto out;
 
                if (++i > 3 &&
                    !mca_reap(b, 0, false)) {
@@ -698,9 +700,10 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,
                        rw_unlock(true, b);
                        freed++;
                }
+               nr--;
        }
 
-       for (i = 0; (nr--) && i < c->btree_cache_used; i++) {
+       for (;  (nr--) && i < btree_cache_used; i++) {
                if (list_empty(&c->btree_cache))
                        goto out;