]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
lru_cache: use atomic operations when accessing lc->flags, always
authorLars Ellenberg <lars.ellenberg@linbit.com>
Tue, 22 Nov 2022 13:42:58 +0000 (14:42 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 23 Nov 2022 02:38:39 +0000 (19:38 -0700)
Or, depending on the way locking is implemented at the call sites,
some updates could be lost (has not been observed).

Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
Link: https://lore.kernel.org/r/20221122134301.69258-2-christoph.boehmwalder@linbit.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
lib/lru_cache.c

index dc35464216d3ccb0340ba747e5c3ef64620b51a4..fec89938623812154b673e81b6c32edafe37fd8e 100644 (file)
@@ -364,7 +364,7 @@ static struct lc_element *__lc_get(struct lru_cache *lc, unsigned int enr, unsig
        struct lc_element *e;
 
        PARANOIA_ENTRY();
-       if (lc->flags & LC_STARVING) {
+       if (test_bit(__LC_STARVING, &lc->flags)) {
                ++lc->starving;
                RETURN(NULL);
        }
@@ -417,7 +417,7 @@ static struct lc_element *__lc_get(struct lru_cache *lc, unsigned int enr, unsig
         * the LRU element, we have to wait ...
         */
        if (!lc_unused_element_available(lc)) {
-               __set_bit(__LC_STARVING, &lc->flags);
+               set_bit(__LC_STARVING, &lc->flags);
                RETURN(NULL);
        }