Commit cb07ad63 authored by Coly Li's avatar Coly Li Committed by Jens Axboe
Browse files

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: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f383ae30
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -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

+2 −15
Original line number Diff line number Diff line
@@ -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;