bcache: introduce force_wake_up_gc()
authorColy Li <colyli@suse.de>
Thu, 13 Dec 2018 14:53:52 +0000 (22:53 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 13 Dec 2018 15:15:54 +0000 (08:15 -0700)
Garbage collection thread starts to work when c->sectors_to_gc is
negative value, otherwise nothing will happen even the gc thread is
woken up by wake_up_gc().

force_wake_up_gc() sets c->sectors_to_gc to -1 before calling
wake_up_gc(), then gc thread may have chance to run if no one else sets
c->sectors_to_gc to a positive value before gc_should_run().

This routine can be called where the gc thread is woken up and required
to run in force.

Signed-off-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/btree.h
drivers/md/bcache/sysfs.c

index a68d6c55783bd97eaf49d5744c9422f8af24be07..d1c72ef64edf5a1611fe309cd64b9524b2b0b9d9 100644 (file)
@@ -266,6 +266,24 @@ static inline void wake_up_gc(struct cache_set *c)
        wake_up(&c->gc_wait);
 }
 
+static inline void force_wake_up_gc(struct cache_set *c)
+{
+       /*
+        * Garbage collection thread only works when sectors_to_gc < 0,
+        * calling wake_up_gc() won't start gc thread if sectors_to_gc is
+        * not a nagetive value.
+        * Therefore sectors_to_gc is set to -1 here, before waking up
+        * gc thread by calling wake_up_gc(). Then gc_should_run() will
+        * give a chance to permit gc thread to run. "Give a chance" means
+        * before going into gc_should_run(), there is still possibility
+        * that c->sectors_to_gc being set to other positive value. So
+        * this routine won't 100% make sure gc thread will be woken up
+        * to run.
+        */
+       atomic_set(&c->sectors_to_gc, -1);
+       wake_up_gc(c);
+}
+
 #define MAP_DONE       0
 #define MAP_CONTINUE   1
 
index 9d5fe12f0c9cfb0e624b5acde31eb161ab291c30..c09748497cdc621d803bc27ec912ae29264b411e 100644 (file)
@@ -742,21 +742,8 @@ STORE(__bch_cache_set)
                bch_cache_accounting_clear(&c->accounting);
        }
 
-       if (attr == &sysfs_trigger_gc) {
-               /*
-                * Garbage collection thread only works when sectors_to_gc < 0,
-                * when users write to sysfs entry trigger_gc, most of time
-                * they want to forcibly triger gargage collection. Here -1 is
-                * set to c->sectors_to_gc, to make gc_should_run() give a
-                * chance to permit gc thread to run. "give a chance" means
-                * before going into gc_should_run(), there is still chance
-                * that c->sectors_to_gc being set to other positive value. So
-                * writing sysfs entry trigger_gc won't always make sure gc
-                * thread takes effect.
-                */
-               atomic_set(&c->sectors_to_gc, -1);
-               wake_up_gc(c);
-       }
+       if (attr == &sysfs_trigger_gc)
+               force_wake_up_gc(c);
 
        if (attr == &sysfs_prune_cache) {
                struct shrink_control sc;