diff options
author | Coly Li <colyli@suse.de> | 2018-12-18 22:29:23 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2018-12-18 22:29:23 +0800 |
commit | eaa08bb233d318ab05585a9212244306ee241946 (patch) | |
tree | ac1b8e3e4beb9d3b080f3636592e6d8a98261315 | |
parent | 6fb5ca54d3518bfc48a1e31fc8ca1445b672c9ae (diff) | |
download | bcache-patches-eaa08bb233d318ab05585a9212244306ee241946.tar.gz |
for-next: remove merged patches
12 files changed, 0 insertions, 942 deletions
diff --git a/for-next/0001-bcache-add-comment-for-cache_set-fill_iter.patch b/for-next/0001-bcache-add-comment-for-cache_set-fill_iter.patch deleted file mode 100644 index 097af54..0000000 --- a/for-next/0001-bcache-add-comment-for-cache_set-fill_iter.patch +++ /dev/null @@ -1,76 +0,0 @@ -From d0e282a872a53c581b5f5aa2c47c4cf8732b4e0f Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Wed, 24 Oct 2018 10:35:38 +0800 -Subject: [PATCH 1/6] bcache: add comment for cache_set->fill_iter - -We have the following define for btree iterator: - struct btree_iter { - size_t size, used; - #ifdef CONFIG_BCACHE_DEBUG - struct btree_keys *b; - #endif - struct btree_iter_set { - struct bkey *k, *end; - } data[MAX_BSETS]; - }; - -We can see that the length of data[] field is static MAX_BSETS, which is -defined as 4 currently. - -But a btree node on disk could have too many bsets for an iterator to fit -on the stack - maybe far more that MAX_BSETS. Have to dynamically allocate -space to host more btree_iter_sets. - -bch_cache_set_alloc() will make sure the pool cache_set->fill_iter can -allocate an iterator equipped with enough room that can host - (sb.bucket_size / sb.block_size) -btree_iter_sets, which is more than static MAX_BSETS. - -bch_btree_node_read_done() will use that pool to allocate one iterator, to -host many bsets in one btree node. - -Add more comment around cache_set->fill_iter to make code less confusing. - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/bcache.h | 6 +++++- - drivers/md/bcache/btree.c | 5 +++++ - 2 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index b61b83bbcfff..96d2213f279e 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -658,7 +658,11 @@ struct cache_set { - - /* - * A btree node on disk could have too many bsets for an iterator to fit -- * on the stack - have to dynamically allocate them -+ * on the stack - have to dynamically allocate them. -+ * bch_cache_set_alloc() will make sure the pool can allocate iterators -+ * equipped with enough room that can host -+ * (sb.bucket_size / sb.block_size) -+ * btree_iter_sets, which is more than static MAX_BSETS. - */ - mempool_t fill_iter; - -diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c -index 3f4211b5cd33..23cb1dc7296b 100644 ---- a/drivers/md/bcache/btree.c -+++ b/drivers/md/bcache/btree.c -@@ -207,6 +207,11 @@ void bch_btree_node_read_done(struct btree *b) - struct bset *i = btree_bset_first(b); - struct btree_iter *iter; - -+ /* -+ * c->fill_iter can allocate an iterator with more memory space -+ * than static MAX_BSETS. -+ * See the comment arount cache_set->fill_iter. -+ */ - iter = mempool_alloc(&b->c->fill_iter, GFP_NOIO); - iter->size = b->c->sb.bucket_size / b->c->sb.block_size; - iter->used = 0; --- -2.16.4 - diff --git a/for-next/0002-bcache-do-not-check-if-debug-dentry-is-ERR-or-NULL-e.patch b/for-next/0002-bcache-do-not-check-if-debug-dentry-is-ERR-or-NULL-e.patch deleted file mode 100644 index 0c0d419..0000000 --- a/for-next/0002-bcache-do-not-check-if-debug-dentry-is-ERR-or-NULL-e.patch +++ /dev/null @@ -1,49 +0,0 @@ -From d844297ebf7b315311dd0b242d78c85e81c86a19 Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Thu, 18 Oct 2018 20:44:57 +0800 -Subject: [PATCH 2/6] bcache: do not check if debug dentry is ERR or NULL - explicitly on remove - -debugfs_remove and debugfs_remove_recursive will check if the dentry -pointer is NULL or ERR, and will do nothing in that case. - -Remove the check in cache_set_free and bch_debug_init. - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/debug.c | 3 +-- - drivers/md/bcache/super.c | 3 +-- - 2 files changed, 2 insertions(+), 4 deletions(-) - -diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c -index 8f448b9c96a1..8b123be05254 100644 ---- a/drivers/md/bcache/debug.c -+++ b/drivers/md/bcache/debug.c -@@ -249,8 +249,7 @@ void bch_debug_init_cache_set(struct cache_set *c) - - void bch_debug_exit(void) - { -- if (!IS_ERR_OR_NULL(bcache_debug)) -- debugfs_remove_recursive(bcache_debug); -+ debugfs_remove_recursive(bcache_debug); - } - - void __init bch_debug_init(void) -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index 7bbd670a5a84..5b59d44656c0 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -1510,8 +1510,7 @@ static void cache_set_free(struct closure *cl) - struct cache *ca; - unsigned int i; - -- if (!IS_ERR_OR_NULL(c->debug)) -- debugfs_remove(c->debug); -+ debugfs_remove(c->debug); - - bch_open_buckets_free(c); - bch_btree_cache_free(c); --- -2.16.4 - diff --git a/for-next/0003-bcache-update-comment-for-bch_data_insert.patch b/for-next/0003-bcache-update-comment-for-bch_data_insert.patch deleted file mode 100644 index 6336384..0000000 --- a/for-next/0003-bcache-update-comment-for-bch_data_insert.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 4e33c501eb3970b9ae19ef5a5da49a25ea917596 Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Sat, 17 Nov 2018 11:08:35 +0800 -Subject: [PATCH 3/6] bcache: update comment for bch_data_insert - -commit 220bb38c21b8 ("bcache: Break up struct search") introduced changes -to struct search and s->iop. -bypass/bio are fields of struct data_insert_op now. Update the comment. - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/request.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c -index 3bf35914bb57..15070412a32e 100644 ---- a/drivers/md/bcache/request.c -+++ b/drivers/md/bcache/request.c -@@ -311,11 +311,11 @@ static void bch_data_insert_start(struct closure *cl) - * data is written it calls bch_journal, and after the keys have been added to - * the next journal write they're inserted into the btree. - * -- * It inserts the data in s->cache_bio; bi_sector is used for the key offset, -+ * It inserts the data in op->bio; bi_sector is used for the key offset, - * and op->inode is used for the key inode. - * -- * If s->bypass is true, instead of inserting the data it invalidates the -- * region of the cache represented by s->cache_bio and op->inode. -+ * If op->bypass is true, instead of inserting the data it invalidates the -+ * region of the cache represented by op->bio and op->inode. - */ - void bch_data_insert(struct closure *cl) - { --- -2.16.4 - diff --git a/for-next/0004-bcache-update-comment-in-sysfs.c.patch b/for-next/0004-bcache-update-comment-in-sysfs.c.patch deleted file mode 100644 index 2f80bfd..0000000 --- a/for-next/0004-bcache-update-comment-in-sysfs.c.patch +++ /dev/null @@ -1,43 +0,0 @@ -From f66cbe5080a0f154f1d71e08ed88abf8aa6af6bf Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Sat, 10 Nov 2018 14:50:18 +0800 -Subject: [PATCH 4/6] bcache: update comment in sysfs.c - -We have struct cached_dev allocated by kzalloc in register_bcache(), which -initializes all the fields of cached_dev with 0s. And commit ce4c3e19e520 -("bcache: Replace bch_read_string_list() by __sysfs_match_string()") has -remove the string "default". - -Update the comment. - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/sysfs.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index 26f035a0c5b9..d2e5c9892d4d 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -16,7 +16,7 @@ - #include <linux/sort.h> - #include <linux/sched/clock.h> - --/* Default is -1; we skip past it for struct cached_dev's cache mode */ -+/* Default is 0 ("writethrough") */ - static const char * const bch_cache_modes[] = { - "writethrough", - "writeback", -@@ -25,7 +25,7 @@ static const char * const bch_cache_modes[] = { - NULL - }; - --/* Default is -1; we skip past it for stop_when_cache_set_failed */ -+/* Default is 0 ("auto") */ - static const char * const bch_stop_on_failure_modes[] = { - "auto", - "always", --- -2.16.4 - diff --git a/for-next/0005-bcache-do-not-mark-writeback_running-until-backing-d.patch b/for-next/0005-bcache-do-not-mark-writeback_running-until-backing-d.patch deleted file mode 100644 index cc33d74..0000000 --- a/for-next/0005-bcache-do-not-mark-writeback_running-until-backing-d.patch +++ /dev/null @@ -1,89 +0,0 @@ -From fe998ddec29f65946c5fca821961412be11c752b Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Thu, 22 Nov 2018 20:54:02 +0800 -Subject: [PATCH 5/6] bcache: do not mark writeback_running until backing dev - attached to cache_set - -A fresh backing device is not attached to any cache_set, and -has no writeback kthread created until first attached to some -cache_set. - -But bch_cached_dev_writeback_init run -" - dc->writeback_running = true; - WARN_ON(test_and_clear_bit(BCACHE_DEV_WB_RUNNING, - &dc->disk.flags)); -" -for any newly formatted backing devices. - -For a fresh standalone backing device, we can get something like -following even if no writeback kthread created: ------------------------- -/sys/block/bcache0/bcache# cat writeback_running -1 -/sys/block/bcache0/bcache# cat writeback_rate_debug -rate: 512.0k/sec -dirty: 0.0k -target: 0.0k -proportional: 0.0k -integral: 0.0k -change: 0.0k/sec -next io: -15427384ms - -The none ZERO fields are misleading as no alive writeback kthread yet. - -Set dc->writeback_running false as no writeback thread created in -bch_cached_dev_writeback_init(). - -We have writeback thread created and woken up in bch_cached_dev_writeback -_start(). Set dc->writeback_running true before bch_writeback_queue() -called, as a writeback thread will check if dc->writeback_running is true -before writing back dirty data, and hung if false detected. - -After the change, we can get the following output for a fresh standalone -backing device: ------------------------ -/sys/block/bcache0/bcache$ cat writeback_running -0 -/sys/block/bcache0/bcache# cat writeback_rate_debug -rate: 0.0k/sec -dirty: 0.0k -target: 0.0k -proportional: 0.0k -integral: 0.0k -change: 0.0k/sec -next io: 0ms - -v1 -> v2: - Set dc->writeback_running before bch_writeback_queue() called, - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/writeback.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c -index 08c3a9f9676c..1696b212ec4e 100644 ---- a/drivers/md/bcache/writeback.c -+++ b/drivers/md/bcache/writeback.c -@@ -777,7 +777,7 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc) - bch_keybuf_init(&dc->writeback_keys); - - dc->writeback_metadata = true; -- dc->writeback_running = true; -+ dc->writeback_running = false; - dc->writeback_percent = 10; - dc->writeback_delay = 30; - atomic_long_set(&dc->writeback_rate.rate, 1024); -@@ -805,6 +805,7 @@ int bch_cached_dev_writeback_start(struct cached_dev *dc) - cached_dev_put(dc); - return PTR_ERR(dc->writeback_thread); - } -+ dc->writeback_running = true; - - WARN_ON(test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)); - schedule_delayed_work(&dc->writeback_rate_update, --- -2.16.4 - diff --git a/for-next/0006-bcache-cannot-set-writeback_running-via-sysfs-if-no-.patch b/for-next/0006-bcache-cannot-set-writeback_running-via-sysfs-if-no-.patch deleted file mode 100644 index 9884412..0000000 --- a/for-next/0006-bcache-cannot-set-writeback_running-via-sysfs-if-no-.patch +++ /dev/null @@ -1,58 +0,0 @@ -From db533a0b1ddd1ec7eb2509cd7f598f626399af5e Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Thu, 22 Nov 2018 20:54:03 +0800 -Subject: [PATCH 6/6] bcache: cannot set writeback_running via sysfs if no - writeback kthread created - -"echo 1 > writeback_running" marks writeback_running even if no writeback -kthread created as "d_strtoul(writeback_running)" will simply set dc-> -writeback_running without checking the existence of dc->writeback_thread. - -Add check for setting writeback_running via sysfs: if no writeback kthread -available, reject setting to 1. - -v2 -> v3: - * Make message on wrong assignment more clear. - * Print name of bcache device instead of name of backing device. - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/sysfs.c | 21 +++++++++++++++++++-- - 1 file changed, 19 insertions(+), 2 deletions(-) - -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index d2e5c9892d4d..9d5fe12f0c9c 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -384,8 +384,25 @@ STORE(bch_cached_dev) - mutex_lock(&bch_register_lock); - size = __cached_dev_store(kobj, attr, buf, size); - -- if (attr == &sysfs_writeback_running) -- bch_writeback_queue(dc); -+ if (attr == &sysfs_writeback_running) { -+ /* dc->writeback_running changed in __cached_dev_store() */ -+ if (IS_ERR_OR_NULL(dc->writeback_thread)) { -+ /* -+ * reject setting it to 1 via sysfs if writeback -+ * kthread is not created yet. -+ */ -+ if (dc->writeback_running) { -+ dc->writeback_running = false; -+ pr_err("%s: failed to run non-existent writeback thread", -+ dc->disk.disk->disk_name); -+ } -+ } else -+ /* -+ * writeback kthread will check if dc->writeback_running -+ * is true or false. -+ */ -+ bch_writeback_queue(dc); -+ } - - if (attr == &sysfs_writeback_percent) - if (!test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)) --- -2.16.4 - diff --git a/for-next/writeback/0000-cover-letter.patch b/for-next/writeback/0000-cover-letter.patch deleted file mode 100644 index 9d4d5aa..0000000 --- a/for-next/writeback/0000-cover-letter.patch +++ /dev/null @@ -1,74 +0,0 @@ -From a9f079b92d94d5c81a2dc2bf2fd0fd68ad064540 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 22 Nov 2018 22:55:21 +0800 -Subject: [PATCH 0/5] Writeback performance tuning options - -I receive requirement to provide options to permit people to do research -on writeback performance tuning for their extreme heavy workloads. And -these options are required to be disabled by default to avoid changing -current code behavior. - -This series adds several disabled-by-default options for writeback -performance tuning. - -- Auto gc after writeback accomplished - sysfs entry gc_after_writeback is added, if it is explicitly enabled, - gc thread will be forced woken up when writeback accomplished and - all cache data are clean. This behavior will shrink bcache B+ tree - and discard clean SSD space, which might be helpful for following - write request. The following patches cover this option, - - bcache: introduce force_wake_up_gc() - - bcache: option to automatically run gc thread after writeback - accomplished - -- Tunnable cutoff writeback and cutoff writeback sync - Currently cutoff writeback and cutoff wrireback sync are fixed value - defined by macro. There is no way for people to set a larger value and - test the resulting performance behavior. Now they can be specificed - as dynamic module load time parameter (bch_cutoff_writeback, and - bch_cutof_writeback_sync), and won't change after bcache module - loaded. Now people can test and observe the behavior on their own - cache device with larger cutoff writeback values. The following - patches cover these 2 options, - - bcache: add MODULE_DESCRIPTION information - - bcache: make cutoff_writeback and cutoff_writeback_sync tunnable - - bcache: set writeback_percent in a flexible range - -- A more flexible writeback_percent range - Currently writeback_percent is in range of [0, 40], because cutoff - writeback value is defind as 40 by a macro. This patch permits the - value to be specified in range [0, bch_cutoff_writeback], while the - maximum value of bch_cutoff_writeback can be 70. Now people may have - a more flexible writeback_percent parameter range to test and observe - how bcache writeback code behaves on their own cache hardware. The - following patch covers this change, - - bcache: set writeback_percent in a flexible range - -If anyone is also interested on writeback performance tuning with these -tunnable options, I do appreciate if you find a better performance -number with the non-default option values, and share them with us. - -Thanks in advance. - -Coly Li - ---- -Coly Li (5): - bcache: introduce force_wake_up_gc() - bcache: option to automatically run gc thread after writeback - accomplished - bcache: add MODULE_DESCRIPTION information - bcache: make cutoff_writeback and cutoff_writeback_sync tunnable - bcache: set writeback_percent in a flexible range - - drivers/md/bcache/bcache.h | 14 ++++++++++++++ - drivers/md/bcache/btree.h | 18 +++++++++++++++++ - drivers/md/bcache/super.c | 45 +++++++++++++++++++++++++++++++++++++++++-- - drivers/md/bcache/sysfs.c | 36 +++++++++++++++++++--------------- - drivers/md/bcache/writeback.c | 27 ++++++++++++++++++++++++++ - drivers/md/bcache/writeback.h | 12 ++++++++++-- - 6 files changed, 132 insertions(+), 20 deletions(-) - --- -2.16.4 - diff --git a/for-next/writeback/0001-bcache-introduce-force_wake_up_gc.patch b/for-next/writeback/0001-bcache-introduce-force_wake_up_gc.patch deleted file mode 100644 index fb47988..0000000 --- a/for-next/writeback/0001-bcache-introduce-force_wake_up_gc.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 9ef5ce6d8440c8f6681c3d8c3320932e654a9916 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 22 Nov 2018 20:22:58 +0800 -Subject: [PATCH 1/5] 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> ---- - drivers/md/bcache/btree.h | 18 ++++++++++++++++++ - drivers/md/bcache/sysfs.c | 17 ++--------------- - 2 files changed, 20 insertions(+), 15 deletions(-) - -diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h -index a68d6c55783b..d1c72ef64edf 100644 ---- a/drivers/md/bcache/btree.h -+++ b/drivers/md/bcache/btree.h -@@ -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 - -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index d2e5c9892d4d..7351ee4940f3 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -725,21 +725,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; --- -2.16.4 - diff --git a/for-next/writeback/0002-bcache-option-to-automatically-run-gc-thread-after-w.patch b/for-next/writeback/0002-bcache-option-to-automatically-run-gc-thread-after-w.patch deleted file mode 100644 index f70496b..0000000 --- a/for-next/writeback/0002-bcache-option-to-automatically-run-gc-thread-after-w.patch +++ /dev/null @@ -1,164 +0,0 @@ -From 251cacad396bafd20f0dc05831369baf23a5fa1f Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 15 Nov 2018 20:52:03 +0800 -Subject: [PATCH 2/5] bcache: option to automatically run gc thread after - writeback accomplished - -The option gc_after_writeback is disabled by default, because garbage -collection will discard SSD data which drops cached data. - -Echo 1 into /sys/fs/bcache/<UUID>/internal/gc_after_writeback will enable -this option, which wakes up gc thread when writeback accomplished and all -cached data is clean. - -This option is helpful for people who cares writing performance more. -In heavy writing workload, all cached data can be clean only happens when -writeback thread cleans all cached data in I/O idle time. In such -situation a following gc running may help to shrink bcache B+ tree and -discard more clean data, which may be helpful for future writing requests. - -If you are not sure whether this is helpful for your own workload, please -leave it as disabled by default. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/bcache.h | 14 ++++++++++++++ - drivers/md/bcache/sysfs.c | 9 +++++++++ - drivers/md/bcache/writeback.c | 27 +++++++++++++++++++++++++++ - drivers/md/bcache/writeback.h | 2 ++ - 4 files changed, 52 insertions(+) - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index 96d2213f279e..fdf75352e16a 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -626,6 +626,20 @@ struct cache_set { - /* Where in the btree gc currently is */ - struct bkey gc_done; - -+ /* -+ * For automatical garbage collection after writeback completed, this -+ * varialbe is used as bit fields, -+ * - 0000 0001b (BCH_ENABLE_AUTO_GC): enable gc after writeback -+ * - 0000 0010b (BCH_DO_AUTO_GC): do gc after writeback -+ * This is an optimization for following write request after writeback -+ * finished, but read hit rate dropped due to clean data on cache is -+ * discarded. Unless user explicitly sets it via sysfs, it won't be -+ * enabled. -+ */ -+#define BCH_ENABLE_AUTO_GC 1 -+#define BCH_DO_AUTO_GC 2 -+ uint8_t gc_after_writeback; -+ - /* - * The allocation code needs gc_mark in struct bucket to be correct, but - * it's not while a gc is in progress. Protected by bucket_lock. -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index 7351ee4940f3..a38a74dffda4 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -128,6 +128,7 @@ rw_attribute(expensive_debug_checks); - rw_attribute(cache_replacement_policy); - rw_attribute(btree_shrinker_disabled); - rw_attribute(copy_gc_enabled); -+rw_attribute(gc_after_writeback); - rw_attribute(size); - - static ssize_t bch_snprint_string_list(char *buf, -@@ -676,6 +677,7 @@ SHOW(__bch_cache_set) - sysfs_printf(gc_always_rewrite, "%i", c->gc_always_rewrite); - sysfs_printf(btree_shrinker_disabled, "%i", c->shrinker_disabled); - sysfs_printf(copy_gc_enabled, "%i", c->copy_gc_enabled); -+ sysfs_printf(gc_after_writeback, "%i", c->gc_after_writeback); - sysfs_printf(io_disable, "%i", - test_bit(CACHE_SET_IO_DISABLE, &c->flags)); - -@@ -776,6 +778,12 @@ STORE(__bch_cache_set) - sysfs_strtoul(gc_always_rewrite, c->gc_always_rewrite); - sysfs_strtoul(btree_shrinker_disabled, c->shrinker_disabled); - sysfs_strtoul(copy_gc_enabled, c->copy_gc_enabled); -+ /* -+ * write gc_after_writeback here may overwrite an already set -+ * BCH_DO_AUTO_GC, it doesn't matter because this flag will be -+ * set in next chance. -+ */ -+ sysfs_strtoul_clamp(gc_after_writeback, c->gc_after_writeback, 0, 1); - - return size; - } -@@ -856,6 +864,7 @@ static struct attribute *bch_cache_set_internal_files[] = { - &sysfs_gc_always_rewrite, - &sysfs_btree_shrinker_disabled, - &sysfs_copy_gc_enabled, -+ &sysfs_gc_after_writeback, - &sysfs_io_disable, - NULL - }; -diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c -index 08c3a9f9676c..74e3f5f3807b 100644 ---- a/drivers/md/bcache/writeback.c -+++ b/drivers/md/bcache/writeback.c -@@ -17,6 +17,15 @@ - #include <linux/sched/clock.h> - #include <trace/events/bcache.h> - -+static void update_gc_after_writeback(struct cache_set *c) -+{ -+ if (c->gc_after_writeback != (BCH_ENABLE_AUTO_GC) || -+ c->gc_stats.in_use < BCH_AUTO_GC_DIRTY_THRESHOLD) -+ return; -+ -+ c->gc_after_writeback |= BCH_DO_AUTO_GC; -+} -+ - /* Rate limiting */ - static uint64_t __calc_target_rate(struct cached_dev *dc) - { -@@ -191,6 +200,7 @@ static void update_writeback_rate(struct work_struct *work) - if (!set_at_max_writeback_rate(c, dc)) { - down_read(&dc->writeback_lock); - __update_writeback_rate(dc); -+ update_gc_after_writeback(c); - up_read(&dc->writeback_lock); - } - } -@@ -689,6 +699,23 @@ static int bch_writeback_thread(void *arg) - up_write(&dc->writeback_lock); - break; - } -+ -+ /* -+ * When dirty data rate is high (e.g. 50%+), there might -+ * be heavy buckets fragmentation after writeback -+ * finished, which hurts following write performance. -+ * If users really care about write performance they -+ * may set BCH_ENABLE_AUTO_GC via sysfs, then when -+ * BCH_DO_AUTO_GC is set, garbage collection thread -+ * will be wake up here. After moving gc, the shrunk -+ * btree and discarded free buckets SSD space may be -+ * helpful for following write requests. -+ */ -+ if (c->gc_after_writeback == -+ (BCH_ENABLE_AUTO_GC|BCH_DO_AUTO_GC)) { -+ c->gc_after_writeback &= ~BCH_DO_AUTO_GC; -+ force_wake_up_gc(c); -+ } - } - - up_write(&dc->writeback_lock); -diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h -index d2b9fdbc8994..ce63be98a39d 100644 ---- a/drivers/md/bcache/writeback.h -+++ b/drivers/md/bcache/writeback.h -@@ -11,6 +11,8 @@ - #define WRITEBACK_RATE_UPDATE_SECS_MAX 60 - #define WRITEBACK_RATE_UPDATE_SECS_DEFAULT 5 - -+#define BCH_AUTO_GC_DIRTY_THRESHOLD 50 -+ - /* - * 14 (16384ths) is chosen here as something that each backing device - * should be a reasonable fraction of the share, and not to blow up --- -2.16.4 - diff --git a/for-next/writeback/0003-bcache-add-MODULE_DESCRIPTION-information.patch b/for-next/writeback/0003-bcache-add-MODULE_DESCRIPTION-information.patch deleted file mode 100644 index 274ea01..0000000 --- a/for-next/writeback/0003-bcache-add-MODULE_DESCRIPTION-information.patch +++ /dev/null @@ -1,40 +0,0 @@ -From c06276db58e51e942d18394d3104c20d8631d381 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 20 Nov 2018 17:40:52 +0800 -Subject: [PATCH 3/5] bcache: add MODULE_DESCRIPTION information - -This patch moves MODULE_AUTHOR and MODULE_LICENSE to end of super.c, and -add MODULE_DESCRIPTION("Bcache: a Linux block layer cache"). - -This is preparation for adding module parameters. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/super.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index 5b59d44656c0..61d3b63fa617 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -25,9 +25,6 @@ - #include <linux/reboot.h> - #include <linux/sysfs.h> - --MODULE_LICENSE("GPL"); --MODULE_AUTHOR("Kent Overstreet <kent.overstreet@gmail.com>"); -- - static const char bcache_magic[] = { - 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca, - 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 -@@ -2469,3 +2466,7 @@ static int __init bcache_init(void) - - module_exit(bcache_exit); - module_init(bcache_init); -+ -+MODULE_DESCRIPTION("Bcache: a Linux block layer cache"); -+MODULE_AUTHOR("Kent Overstreet <kent.overstreet@gmail.com>"); -+MODULE_LICENSE("GPL"); --- -2.16.4 - diff --git a/for-next/writeback/0004-bcache-make-cutoff_writeback-and-cutoff_writeback_sy.patch b/for-next/writeback/0004-bcache-make-cutoff_writeback-and-cutoff_writeback_sy.patch deleted file mode 100644 index c1784a8..0000000 --- a/for-next/writeback/0004-bcache-make-cutoff_writeback-and-cutoff_writeback_sy.patch +++ /dev/null @@ -1,187 +0,0 @@ -From 7288050aabb63b4d99d8aa7f6ab7244dd730696b Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 20 Nov 2018 22:50:31 +0800 -Subject: [PATCH 4/5] bcache: make cutoff_writeback and cutoff_writeback_sync - tunnable - -Currently the cutoff writeback and cutoff writeback sync thresholds are -defined by CUTOFF_WRITEBACK (40) and CUTOFF_WRITEBACK_SYNC (70) as static -values. Most of time these they work fine, but when people want to do -research on bcache writeback mode performance tuning, there is no chance -to modify the soft and hard cutoff writeback values. - -This patch introduces two module parameters bch_cutoff_writeback_sync and -bch_cutoff_writeback which permit people to tune the values when loading -bcache.ko. If they are not specified by module loading, current values -CUTOFF_WRITEBACK_SYNC and CUTOFF_WRITEBACK will be used as default and -nothing changes. - -When people want to tune this two values, -- cutoff_writeback can be set in range [1, 70] -- cutoff_writeback_sync can be set in range [1, 90] -- cutoff_writeback always <= cutoff_writeback_sync - -The default values are strongly recommended to most of users for most of -workloads. Anyway, if people wants to take their own risk to do research -on new writeback cutoff tuning for their own workload, now they can -make it. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/super.c | 40 ++++++++++++++++++++++++++++++++++++++++ - drivers/md/bcache/sysfs.c | 7 +++++++ - drivers/md/bcache/writeback.h | 10 ++++++++-- - 3 files changed, 55 insertions(+), 2 deletions(-) - -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index 61d3b63fa617..4dee119c3664 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -25,6 +25,9 @@ - #include <linux/reboot.h> - #include <linux/sysfs.h> - -+unsigned int bch_cutoff_writeback; -+unsigned int bch_cutoff_writeback_sync; -+ - static const char bcache_magic[] = { - 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca, - 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 -@@ -2420,6 +2423,32 @@ static void bcache_exit(void) - mutex_destroy(&bch_register_lock); - } - -+/* Check and fixup module parameters */ -+static void check_module_parameters(void) -+{ -+ if (bch_cutoff_writeback_sync == 0) -+ bch_cutoff_writeback_sync = CUTOFF_WRITEBACK_SYNC; -+ else if (bch_cutoff_writeback_sync > CUTOFF_WRITEBACK_SYNC_MAX) { -+ pr_warn("set bch_cutoff_writeback_sync (%u) to max value %u", -+ bch_cutoff_writeback_sync, CUTOFF_WRITEBACK_SYNC_MAX); -+ bch_cutoff_writeback_sync = CUTOFF_WRITEBACK_SYNC_MAX; -+ } -+ -+ if (bch_cutoff_writeback == 0) -+ bch_cutoff_writeback = CUTOFF_WRITEBACK; -+ else if (bch_cutoff_writeback > CUTOFF_WRITEBACK_MAX) { -+ pr_warn("set bch_cutoff_writeback (%u) to max value %u", -+ bch_cutoff_writeback, CUTOFF_WRITEBACK_MAX); -+ bch_cutoff_writeback = CUTOFF_WRITEBACK_MAX; -+ } -+ -+ if (bch_cutoff_writeback > bch_cutoff_writeback_sync) { -+ pr_warn("set bch_cutoff_writeback (%u) to %u", -+ bch_cutoff_writeback, bch_cutoff_writeback_sync); -+ bch_cutoff_writeback = bch_cutoff_writeback_sync; -+ } -+} -+ - static int __init bcache_init(void) - { - static const struct attribute *files[] = { -@@ -2428,6 +2457,8 @@ static int __init bcache_init(void) - NULL - }; - -+ check_module_parameters(); -+ - mutex_init(&bch_register_lock); - init_waitqueue_head(&unregister_wait); - register_reboot_notifier(&reboot); -@@ -2464,9 +2495,18 @@ static int __init bcache_init(void) - return -ENOMEM; - } - -+/* -+ * Module hooks -+ */ - module_exit(bcache_exit); - module_init(bcache_init); - -+module_param(bch_cutoff_writeback, uint, 0); -+MODULE_PARM_DESC(bch_cutoff_writeback, "threshold to cutoff writeback"); -+ -+module_param(bch_cutoff_writeback_sync, uint, 0); -+MODULE_PARM_DESC(bch_cutoff_writeback_sync, "hard threshold to cutoff writeback"); -+ - MODULE_DESCRIPTION("Bcache: a Linux block layer cache"); - MODULE_AUTHOR("Kent Overstreet <kent.overstreet@gmail.com>"); - MODULE_LICENSE("GPL"); -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index a38a74dffda4..27fbc2dd1734 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -88,6 +88,8 @@ read_attribute(writeback_keys_done); - read_attribute(writeback_keys_failed); - read_attribute(io_errors); - read_attribute(congested); -+read_attribute(cutoff_writeback); -+read_attribute(cutoff_writeback_sync); - rw_attribute(congested_read_threshold_us); - rw_attribute(congested_write_threshold_us); - -@@ -669,6 +671,9 @@ SHOW(__bch_cache_set) - sysfs_print(congested_write_threshold_us, - c->congested_write_threshold_us); - -+ sysfs_print(cutoff_writeback, bch_cutoff_writeback); -+ sysfs_print(cutoff_writeback_sync, bch_cutoff_writeback_sync); -+ - sysfs_print(active_journal_entries, fifo_used(&c->journal.pin)); - sysfs_printf(verify, "%i", c->verify); - sysfs_printf(key_merging_disabled, "%i", c->key_merging_disabled); -@@ -866,6 +871,8 @@ static struct attribute *bch_cache_set_internal_files[] = { - &sysfs_copy_gc_enabled, - &sysfs_gc_after_writeback, - &sysfs_io_disable, -+ &sysfs_cutoff_writeback, -+ &sysfs_cutoff_writeback_sync, - NULL - }; - KTYPE(bch_cache_set_internal); -diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h -index ce63be98a39d..6a743d3bb338 100644 ---- a/drivers/md/bcache/writeback.h -+++ b/drivers/md/bcache/writeback.h -@@ -5,6 +5,9 @@ - #define CUTOFF_WRITEBACK 40 - #define CUTOFF_WRITEBACK_SYNC 70 - -+#define CUTOFF_WRITEBACK_MAX 70 -+#define CUTOFF_WRITEBACK_SYNC_MAX 90 -+ - #define MAX_WRITEBACKS_IN_PASS 5 - #define MAX_WRITESIZE_IN_PASS 5000 /* *512b */ - -@@ -55,6 +58,9 @@ static inline bool bcache_dev_stripe_dirty(struct cached_dev *dc, - } - } - -+extern unsigned int bch_cutoff_writeback; -+extern unsigned int bch_cutoff_writeback_sync; -+ - static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, - unsigned int cache_mode, bool would_skip) - { -@@ -62,7 +68,7 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, - - if (cache_mode != CACHE_MODE_WRITEBACK || - test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags) || -- in_use > CUTOFF_WRITEBACK_SYNC) -+ in_use > bch_cutoff_writeback_sync) - return false; - - if (dc->partial_stripes_expensive && -@@ -75,7 +81,7 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, - - return (op_is_sync(bio->bi_opf) || - bio->bi_opf & (REQ_META|REQ_PRIO) || -- in_use <= CUTOFF_WRITEBACK); -+ in_use <= bch_cutoff_writeback); - } - - static inline void bch_writeback_queue(struct cached_dev *dc) --- -2.16.4 - diff --git a/for-next/writeback/0005-bcache-set-writeback_percent-in-a-flexible-range.patch b/for-next/writeback/0005-bcache-set-writeback_percent-in-a-flexible-range.patch deleted file mode 100644 index 7e11d57..0000000 --- a/for-next/writeback/0005-bcache-set-writeback_percent-in-a-flexible-range.patch +++ /dev/null @@ -1,43 +0,0 @@ -From a9f079b92d94d5c81a2dc2bf2fd0fd68ad064540 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 20 Nov 2018 22:53:40 +0800 -Subject: [PATCH 5/5] bcache: set writeback_percent in a flexible range - -Because CUTOFF_WRITEBACK is defined as 40, so before the changes of -dynamic cutoff writeback values, writeback_percent is limited to -[0, CUTOFF_WRITEBACK]. Any value larger than CUTOFF_WRITEBACK will -be fixed up to 40. - -Now cutof writeback limit is a dynamic value bch_cutoff_writeback, -so the range of writeback_percent can be a more flexible range as -[0, bch_cutoff_writeback]. The flexibility is, it can be expended -to a larger or smaller range than [0, 40], depends on how value -bch_cutoff_writeback is specified. - -The default value is still strongly recommended to most of users for -most of workloads. But for people who want to do research on bcache -writeback perforamnce tuning, they may have chance to specify more -flexible writeback_percent in range [0, 70]. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/sysfs.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index 27fbc2dd1734..36de4d52d60a 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -267,7 +267,8 @@ STORE(__cached_dev) - d_strtoul(writeback_running); - d_strtoul(writeback_delay); - -- sysfs_strtoul_clamp(writeback_percent, dc->writeback_percent, 0, 40); -+ sysfs_strtoul_clamp(writeback_percent, dc->writeback_percent, -+ 0, bch_cutoff_writeback); - - if (attr == &sysfs_writeback_rate) { - ssize_t ret; --- -2.16.4 - |