bcache: introduce force_wake_up_gc()
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>
This commit is contained in:
parent
f383ae300c
commit
cb07ad6368
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue