diff options
author | Coly Li <colyli@suse.de> | 2018-08-09 22:30:11 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2018-08-09 22:30:11 +0800 |
commit | f8345446d91b6bd50e3fc01fad55fafc650ea3f3 (patch) | |
tree | 2ab0b4c7a024b015a47810d34e32093298392293 | |
parent | 40d39c3d65a51dcd224eef11b0b38b37fbefb82c (diff) | |
download | bcache-patches-f8345446d91b6bd50e3fc01fad55fafc650ea3f3.tar.gz |
for-next: remove patches applied to Jens' tree
11 files changed, 0 insertions, 1033 deletions
diff --git a/for-next/0000-cover-letter.patch b/for-next/0000-cover-letter.patch deleted file mode 100644 index 60919cb..0000000 --- a/for-next/0000-cover-letter.patch +++ /dev/null @@ -1,56 +0,0 @@ -From 1ac333e00ca5af1223d63df97e8eac012f62ba4e Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 9 Aug 2018 15:35:29 +0800 -Subject: [PATCH 00/10] bcache patches for 4.19, 2nd wave - -Hi Jens, - -Here are 2nd wave bcache patches for 4.19. - -The patches from me were either verified by other people or posted -for quite long time. Except for the debugfs_create_dir() fix and -"set max writeback rate" fix, rested patches are simple or trivial -IMHO. - -Our new bcache developer Shenghui Wang contributes two patches in -this run. The first one fixes a misleading error message, and the -second one is a code style clean up. - -Thanks in advance for picking them. - -Coly Li ---- -Coly Li (8): - bcache: do not check return value of debugfs_create_dir() - bcache: display rate debug parameters to 0 when writeback is not - running - bcache: avoid unncessary cache prefetch bch_btree_node_get() - bcache: add a comment in super.c - bcache: fix mistaken code comments in bcache.h - bcache: fix mistaken comments in request.c - bcache: add code comments for bset.c - bcache: set max writeback rate when I/O request is idle - -Shenghui Wang (2): - bcache: make the pr_err statement used for ENOENT only in - sysfs_attatch section - bcache: trivial - remove tailing backslash in macro BTREE_FLAG - - drivers/md/bcache/bcache.h | 18 +++---- - drivers/md/bcache/bset.c | 63 ++++++++++++++++++++++++ - drivers/md/bcache/btree.c | 14 +++--- - drivers/md/bcache/btree.h | 2 +- - drivers/md/bcache/closure.c | 13 +++-- - drivers/md/bcache/closure.h | 4 +- - drivers/md/bcache/debug.c | 11 +++-- - drivers/md/bcache/request.c | 61 +++++++++++++++++++++-- - drivers/md/bcache/super.c | 9 +++- - drivers/md/bcache/sysfs.c | 41 ++++++++++------ - drivers/md/bcache/util.c | 2 +- - drivers/md/bcache/util.h | 2 +- - drivers/md/bcache/writeback.c | 91 +++++++++++++++++++++++------------ - 13 files changed, 251 insertions(+), 80 deletions(-) - --- -2.18.0 - diff --git a/for-next/0001-bcache-do-not-check-return-value-of-debugfs_create_d.patch b/for-next/0001-bcache-do-not-check-return-value-of-debugfs_create_d.patch deleted file mode 100644 index 70a58d1..0000000 --- a/for-next/0001-bcache-do-not-check-return-value-of-debugfs_create_d.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 3678e3fc53da440570bb61fface0d6af11f96cae Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 22 May 2018 14:29:09 +0800 -Subject: [PATCH 01/10] bcache: do not check return value of - debugfs_create_dir() - -Greg KH suggests that normal code should not care about debugfs. Therefore -no matter successful or failed of debugfs_create_dir() execution, it is -unncessary to check its return value. - -There are two functions called debugfs_create_dir() and check the return -value, which are bch_debug_init() and closure_debug_init(). This patch -changes these two functions from int to void type, and ignore return values -of debugfs_create_dir(). - -This patch does not fix exact bug, just makes things work as they should. - -Signed-off-by: Coly Li <colyli@suse.de> -Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Cc: stable@vger.kernel.org -Cc: Kai Krakow <kai@kaishome.de> -Cc: Kent Overstreet <kent.overstreet@gmail.com> ---- - drivers/md/bcache/bcache.h | 2 +- - drivers/md/bcache/closure.c | 13 +++++++++---- - drivers/md/bcache/closure.h | 4 ++-- - drivers/md/bcache/debug.c | 11 ++++++----- - drivers/md/bcache/super.c | 4 +++- - 5 files changed, 21 insertions(+), 13 deletions(-) - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index 872ef4d67711..0a3e82b0876d 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -1001,7 +1001,7 @@ void bch_open_buckets_free(struct cache_set *); - int bch_cache_allocator_start(struct cache *ca); - - void bch_debug_exit(void); --int bch_debug_init(struct kobject *); -+void bch_debug_init(struct kobject *kobj); - void bch_request_exit(void); - int bch_request_init(void); - -diff --git a/drivers/md/bcache/closure.c b/drivers/md/bcache/closure.c -index 0e14969182c6..618253683d40 100644 ---- a/drivers/md/bcache/closure.c -+++ b/drivers/md/bcache/closure.c -@@ -199,11 +199,16 @@ static const struct file_operations debug_ops = { - .release = single_release - }; - --int __init closure_debug_init(void) -+void __init closure_debug_init(void) - { -- closure_debug = debugfs_create_file("closures", -- 0400, bcache_debug, NULL, &debug_ops); -- return IS_ERR_OR_NULL(closure_debug); -+ if (!IS_ERR_OR_NULL(bcache_debug)) -+ /* -+ * it is unnecessary to check return value of -+ * debugfs_create_file(), we should not care -+ * about this. -+ */ -+ closure_debug = debugfs_create_file( -+ "closures", 0400, bcache_debug, NULL, &debug_ops); - } - #endif - -diff --git a/drivers/md/bcache/closure.h b/drivers/md/bcache/closure.h -index 71427eb5fdae..7c2c5bc7c88b 100644 ---- a/drivers/md/bcache/closure.h -+++ b/drivers/md/bcache/closure.h -@@ -186,13 +186,13 @@ static inline void closure_sync(struct closure *cl) - - #ifdef CONFIG_BCACHE_CLOSURES_DEBUG - --int closure_debug_init(void); -+void closure_debug_init(void); - void closure_debug_create(struct closure *cl); - void closure_debug_destroy(struct closure *cl); - - #else - --static inline int closure_debug_init(void) { return 0; } -+static inline void closure_debug_init(void) {} - static inline void closure_debug_create(struct closure *cl) {} - static inline void closure_debug_destroy(struct closure *cl) {} - -diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c -index 04d146711950..12034c07257b 100644 ---- a/drivers/md/bcache/debug.c -+++ b/drivers/md/bcache/debug.c -@@ -252,11 +252,12 @@ void bch_debug_exit(void) - debugfs_remove_recursive(bcache_debug); - } - --int __init bch_debug_init(struct kobject *kobj) -+void __init bch_debug_init(struct kobject *kobj) - { -- if (!IS_ENABLED(CONFIG_DEBUG_FS)) -- return 0; -- -+ /* -+ * it is unnecessary to check return value of -+ * debugfs_create_file(), we should not care -+ * about this. -+ */ - bcache_debug = debugfs_create_dir("bcache", NULL); -- return IS_ERR_OR_NULL(bcache_debug); - } -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index e0a92104ca23..c7ffa6ef3f82 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -2345,10 +2345,12 @@ static int __init bcache_init(void) - goto err; - - if (bch_request_init() || -- bch_debug_init(bcache_kobj) || closure_debug_init() || - sysfs_create_files(bcache_kobj, files)) - goto err; - -+ bch_debug_init(bcache_kobj); -+ closure_debug_init(); -+ - return 0; - err: - bcache_exit(); --- -2.18.0 - diff --git a/for-next/0002-bcache-display-rate-debug-parameters-to-0-when-write.patch b/for-next/0002-bcache-display-rate-debug-parameters-to-0-when-write.patch deleted file mode 100644 index a60c771..0000000 --- a/for-next/0002-bcache-display-rate-debug-parameters-to-0-when-write.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 7ee659583a709e9a0da10a9a5d3e9bc103d94853 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Sat, 5 May 2018 20:52:33 +0800 -Subject: [PATCH 02/10] bcache: display rate debug parameters to 0 when - writeback is not running - -When writeback is not running, writeback rate should be 0, other value is -misleading. And the following dyanmic writeback rate debug parameters -should be 0 too, - rate, proportional, integral, change -otherwise they are misleading when writeback is not running. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/sysfs.c | 26 ++++++++++++++++---------- - 1 file changed, 16 insertions(+), 10 deletions(-) - -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index 225b15aa0340..3e9d3459a224 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -149,6 +149,7 @@ SHOW(__bch_cached_dev) - struct cached_dev *dc = container_of(kobj, struct cached_dev, - disk.kobj); - const char *states[] = { "no cache", "clean", "dirty", "inconsistent" }; -+ int wb = dc->writeback_running; - - #define var(stat) (dc->stat) - -@@ -170,7 +171,7 @@ SHOW(__bch_cached_dev) - var_printf(writeback_running, "%i"); - var_print(writeback_delay); - var_print(writeback_percent); -- sysfs_hprint(writeback_rate, dc->writeback_rate.rate << 9); -+ sysfs_hprint(writeback_rate, wb ? dc->writeback_rate.rate << 9 : 0); - sysfs_hprint(io_errors, atomic_read(&dc->io_errors)); - sysfs_printf(io_error_limit, "%i", dc->error_limit); - sysfs_printf(io_disable, "%i", dc->io_disable); -@@ -188,15 +189,20 @@ SHOW(__bch_cached_dev) - char change[20]; - s64 next_io; - -- bch_hprint(rate, dc->writeback_rate.rate << 9); -- bch_hprint(dirty, bcache_dev_sectors_dirty(&dc->disk) << 9); -- bch_hprint(target, dc->writeback_rate_target << 9); -- bch_hprint(proportional,dc->writeback_rate_proportional << 9); -- bch_hprint(integral, dc->writeback_rate_integral_scaled << 9); -- bch_hprint(change, dc->writeback_rate_change << 9); -- -- next_io = div64_s64(dc->writeback_rate.next - local_clock(), -- NSEC_PER_MSEC); -+ /* -+ * Except for dirty and target, other values should -+ * be 0 if writeback is not running. -+ */ -+ bch_hprint(rate, wb ? dc->writeback_rate.rate << 9 : 0); -+ bch_hprint(dirty, bcache_dev_sectors_dirty(&dc->disk) << 9); -+ bch_hprint(target, dc->writeback_rate_target << 9); -+ bch_hprint(proportional, -+ wb ? dc->writeback_rate_proportional << 9 : 0); -+ bch_hprint(integral, -+ wb ? dc->writeback_rate_integral_scaled << 9 : 0); -+ bch_hprint(change, wb ? dc->writeback_rate_change << 9 : 0); -+ next_io = wb ? div64_s64(dc->writeback_rate.next-local_clock(), -+ NSEC_PER_MSEC) : 0; - - return sprintf(buf, - "rate:\t\t%s/sec\n" --- -2.18.0 - diff --git a/for-next/0003-bcache-avoid-unncessary-cache-prefetch-bch_btree_nod.patch b/for-next/0003-bcache-avoid-unncessary-cache-prefetch-bch_btree_nod.patch deleted file mode 100644 index bef5596..0000000 --- a/for-next/0003-bcache-avoid-unncessary-cache-prefetch-bch_btree_nod.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 3fc57055129d0f3f0002643ca28bcc242c974b02 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Mon, 26 Mar 2018 15:05:08 +0800 -Subject: [PATCH 03/10] bcache: avoid unncessary cache prefetch - bch_btree_node_get() - -In bch_btree_node_get() the read-in btree node will be partially -prefetched into L1 cache for following bset iteration (if there is). -But if the btree node read is failed, the perfetch operations will -waste L1 cache space. This patch checkes whether read operation and -only does cache prefetch when read I/O succeeded. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/btree.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - -diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c -index 475008fbbaab..c19f7716df88 100644 ---- a/drivers/md/bcache/btree.c -+++ b/drivers/md/bcache/btree.c -@@ -1011,6 +1011,13 @@ struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op, - BUG_ON(b->level != level); - } - -+ if (btree_node_io_error(b)) { -+ rw_unlock(write, b); -+ return ERR_PTR(-EIO); -+ } -+ -+ BUG_ON(!b->written); -+ - b->parent = parent; - b->accessed = 1; - -@@ -1022,13 +1029,6 @@ struct btree *bch_btree_node_get(struct cache_set *c, struct btree_op *op, - for (; i <= b->keys.nsets; i++) - prefetch(b->keys.set[i].data); - -- if (btree_node_io_error(b)) { -- rw_unlock(write, b); -- return ERR_PTR(-EIO); -- } -- -- BUG_ON(!b->written); -- - return b; - } - --- -2.18.0 - diff --git a/for-next/0004-bcache-add-a-comment-in-super.c.patch b/for-next/0004-bcache-add-a-comment-in-super.c.patch deleted file mode 100644 index a5d8b6a..0000000 --- a/for-next/0004-bcache-add-a-comment-in-super.c.patch +++ /dev/null @@ -1,28 +0,0 @@ -From ec367ac0b48e43f6e8707ab10864f8ffd5220f5e Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Mon, 20 Nov 2017 16:53:48 +0800 -Subject: [PATCH 04/10] bcache: add a comment in super.c - -This patch adds a line of code comment in super.c:register_bdev(), to -make code to be more comprehensible. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/super.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index c7ffa6ef3f82..f517d7d1fa10 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -1291,6 +1291,7 @@ static void register_bdev(struct cache_sb *sb, struct page *sb_page, - pr_info("registered backing device %s", dc->backing_dev_name); - - list_add(&dc->list, &uncached_devices); -+ /* attch to a matched cache set if it exists */ - list_for_each_entry(c, &bch_cache_sets, list) - bch_cached_dev_attach(dc, c, NULL); - --- -2.18.0 - diff --git a/for-next/0005-bcache-fix-mistaken-code-comments-in-bcache.h.patch b/for-next/0005-bcache-fix-mistaken-code-comments-in-bcache.h.patch deleted file mode 100644 index 5fae03f..0000000 --- a/for-next/0005-bcache-fix-mistaken-code-comments-in-bcache.h.patch +++ /dev/null @@ -1,33 +0,0 @@ -From c171ac9c60af11ec055e246d3ad50900381b905c Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Mon, 13 Nov 2017 23:55:01 +0800 -Subject: [PATCH 05/10] bcache: fix mistaken code comments in bcache.h - -This patch updates the code comment in struct cache with correct array -names, to make the code to be more comprehensible. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/bcache.h | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index 0a3e82b0876d..b393b3fd06b6 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -423,9 +423,9 @@ struct cache { - /* - * When allocating new buckets, prio_write() gets first dibs - since we - * may not be allocate at all without writing priorities and gens. -- * prio_buckets[] contains the last buckets we wrote priorities to (so -- * gc can mark them as metadata), prio_next[] contains the buckets -- * allocated for the next prio write. -+ * prio_last_buckets[] contains the last buckets we wrote priorities to -+ * (so gc can mark them as metadata), prio_buckets[] contains the -+ * buckets allocated for the next prio write. - */ - uint64_t *prio_buckets; - uint64_t *prio_last_buckets; --- -2.18.0 - diff --git a/for-next/0006-bcache-fix-mistaken-comments-in-request.c.patch b/for-next/0006-bcache-fix-mistaken-comments-in-request.c.patch deleted file mode 100644 index d823fb9..0000000 --- a/for-next/0006-bcache-fix-mistaken-comments-in-request.c.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 00c62fb5182203fd9911736115ca9ddbcaf680a6 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 14 Nov 2017 00:09:50 +0800 -Subject: [PATCH 06/10] bcache: fix mistaken comments in request.c - -This patch updates code comment in bch_keylist_realloc() by fixing -incorrected function names, to make the code to be more comprehennsible. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/request.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c -index 43af905920f5..914d501ad1e0 100644 ---- a/drivers/md/bcache/request.c -+++ b/drivers/md/bcache/request.c -@@ -107,7 +107,7 @@ static int bch_keylist_realloc(struct keylist *l, unsigned u64s, - /* - * The journalling code doesn't handle the case where the keys to insert - * is bigger than an empty write: If we just return -ENOMEM here, -- * bio_insert() and bio_invalidate() will insert the keys created so far -+ * bch_data_insert_keys() will insert the keys created so far - * and finish the rest when the keylist is empty. - */ - if (newsize * sizeof(uint64_t) > block_bytes(c) - sizeof(struct jset)) --- -2.18.0 - diff --git a/for-next/0007-bcache-add-code-comments-for-bset.c.patch b/for-next/0007-bcache-add-code-comments-for-bset.c.patch deleted file mode 100644 index c14596c..0000000 --- a/for-next/0007-bcache-add-code-comments-for-bset.c.patch +++ /dev/null @@ -1,149 +0,0 @@ -From 9879a0caf2a5c9d2143b9d386092012f50eae963 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 12 Apr 2018 17:24:18 +0800 -Subject: [PATCH 07/10] bcache: add code comments for bset.c - -This patch tries to add code comments in bset.c, to make some -tricky code and designment to be more comprehensible. Most information -of this patch comes from the discussion between Kent and I, he -offers very informative details. If there is any mistake -of the idea behind the code, no doubt that's from me misrepresentation. - -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/bset.c | 63 ++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 63 insertions(+) - -diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c -index f3403b45bc28..596c93b44e9b 100644 ---- a/drivers/md/bcache/bset.c -+++ b/drivers/md/bcache/bset.c -@@ -366,6 +366,10 @@ EXPORT_SYMBOL(bch_btree_keys_init); - - /* Binary tree stuff for auxiliary search trees */ - -+/* -+ * return array index next to j when does in-order traverse -+ * of a binary tree which is stored in a linear array -+ */ - static unsigned inorder_next(unsigned j, unsigned size) - { - if (j * 2 + 1 < size) { -@@ -379,6 +383,10 @@ static unsigned inorder_next(unsigned j, unsigned size) - return j; - } - -+/* -+ * return array index previous to j when does in-order traverse -+ * of a binary tree which is stored in a linear array -+ */ - static unsigned inorder_prev(unsigned j, unsigned size) - { - if (j * 2 < size) { -@@ -421,6 +429,10 @@ static unsigned __to_inorder(unsigned j, unsigned size, unsigned extra) - return j; - } - -+/* -+ * Return the cacheline index in bset_tree->data, where j is index -+ * from a linear array which stores the auxiliar binary tree -+ */ - static unsigned to_inorder(unsigned j, struct bset_tree *t) - { - return __to_inorder(j, t->size, t->extra); -@@ -441,6 +453,10 @@ static unsigned __inorder_to_tree(unsigned j, unsigned size, unsigned extra) - return j; - } - -+/* -+ * Return an index from a linear array which stores the auxiliar binary -+ * tree, j is the cacheline index of t->data. -+ */ - static unsigned inorder_to_tree(unsigned j, struct bset_tree *t) - { - return __inorder_to_tree(j, t->size, t->extra); -@@ -546,6 +562,20 @@ static inline uint64_t shrd128(uint64_t high, uint64_t low, uint8_t shift) - return low; - } - -+/* -+ * Calculate mantissa value for struct bkey_float. -+ * If most significant bit of f->exponent is not set, then -+ * - f->exponent >> 6 is 0 -+ * - p[0] points to bkey->low -+ * - p[-1] borrows bits from KEY_INODE() of bkey->high -+ * if most isgnificant bits of f->exponent is set, then -+ * - f->exponent >> 6 is 1 -+ * - p[0] points to bits from KEY_INODE() of bkey->high -+ * - p[-1] points to other bits from KEY_INODE() of -+ * bkey->high too. -+ * See make_bfloat() to check when most significant bit of f->exponent -+ * is set or not. -+ */ - static inline unsigned bfloat_mantissa(const struct bkey *k, - struct bkey_float *f) - { -@@ -570,6 +600,16 @@ static void make_bfloat(struct bset_tree *t, unsigned j) - BUG_ON(m < l || m > r); - BUG_ON(bkey_next(p) != m); - -+ /* -+ * If l and r have different KEY_INODE values (different backing -+ * device), f->exponent records how many least significant bits -+ * are different in KEY_INODE values and sets most significant -+ * bits to 1 (by +64). -+ * If l and r have same KEY_INODE value, f->exponent records -+ * how many different bits in least significant bits of bkey->low. -+ * See bfloat_mantiss() how the most significant bit of -+ * f->exponent is used to calculate bfloat mantissa value. -+ */ - if (KEY_INODE(l) != KEY_INODE(r)) - f->exponent = fls64(KEY_INODE(r) ^ KEY_INODE(l)) + 64; - else -@@ -633,6 +673,15 @@ void bch_bset_init_next(struct btree_keys *b, struct bset *i, uint64_t magic) - } - EXPORT_SYMBOL(bch_bset_init_next); - -+/* -+ * Build auxiliary binary tree 'struct bset_tree *t', this tree is used to -+ * accelerate bkey search in a btree node (pointed by bset_tree->data in -+ * memory). After search in the auxiliar tree by calling bset_search_tree(), -+ * a struct bset_search_iter is returned which indicates range [l, r] from -+ * bset_tree->data where the searching bkey might be inside. Then a followed -+ * linear comparison does the exact search, see __bch_bset_search() for how -+ * the auxiliary tree is used. -+ */ - void bch_bset_build_written_tree(struct btree_keys *b) - { - struct bset_tree *t = bset_tree_last(b); -@@ -898,6 +947,17 @@ static struct bset_search_iter bset_search_tree(struct bset_tree *t, - unsigned inorder, j, n = 1; - - do { -+ /* -+ * A bit trick here. -+ * If p < t->size, (int)(p - t->size) is a minus value and -+ * the most significant bit is set, right shifting 31 bits -+ * gets 1. If p >= t->size, the most significant bit is -+ * not set, right shifting 31 bits gets 0. -+ * So the following 2 lines equals to -+ * if (p >= t->size) -+ * p = 0; -+ * but a branch instruction is avoided. -+ */ - unsigned p = n << 4; - p &= ((int) (p - t->size)) >> 31; - -@@ -907,6 +967,9 @@ static struct bset_search_iter bset_search_tree(struct bset_tree *t, - f = &t->tree[j]; - - /* -+ * Similar bit trick, use subtract operation to avoid a branch -+ * instruction. -+ * - * n = (f->mantissa > bfloat_mantissa()) - * ? j * 2 - * : j * 2 + 1; --- -2.18.0 - diff --git a/for-next/0008-bcache-set-max-writeback-rate-when-I-O-request-is-id.patch b/for-next/0008-bcache-set-max-writeback-rate-when-I-O-request-is-id.patch deleted file mode 100644 index 856f5fc..0000000 --- a/for-next/0008-bcache-set-max-writeback-rate-when-I-O-request-is-id.patch +++ /dev/null @@ -1,383 +0,0 @@ -From 9c26e5fd96446919cc77c14a09ba9b6cf2320ab5 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Thu, 26 Jul 2018 15:16:11 +0800 -Subject: [PATCH 08/10] bcache: set max writeback rate when I/O request is idle - -Commit b1092c9af9ed ("bcache: allow quick writeback when backing idle") -allows the writeback rate to be faster if there is no I/O request on a -bcache device. It works well if there is only one bcache device attached -to the cache set. If there are many bcache devices attached to a cache -set, it may introduce performance regression because multiple faster -writeback threads of the idle bcache devices will compete the btree level -locks with the bcache device who have I/O requests coming. - -This patch fixes the above issue by only permitting fast writebac when -all bcache devices attached on the cache set are idle. And if one of the -bcache devices has new I/O request coming, minimized all writeback -throughput immediately and let PI controller __update_writeback_rate() -to decide the upcoming writeback rate for each bcache device. - -Also when all bcache devices are idle, limited wrieback rate to a small -number is wast of thoughput, especially when backing devices are slower -non-rotation devices (e.g. SATA SSD). This patch sets a max writeback -rate for each backing device if the whole cache set is idle. A faster -writeback rate in idle time means new I/Os may have more available space -for dirty data, and people may observe a better write performance then. - -Please note bcache may change its cache mode in run time, and this patch -still works if the cache mode is switched from writeback mode and there -is still dirty data on cache. - -Fixes: Commit b1092c9af9ed ("bcache: allow quick writeback when backing idle") -Cc: stable@vger.kernel.org #4.16+ -Signed-off-by: Coly Li <colyli@suse.de> -Tested-by: Kai Krakow <kai@kaishome.de> -Tested-by: Stefan Priebe <s.priebe@profihost.ag> -Cc: Michael Lyle <mlyle@lyle.org> ---- - drivers/md/bcache/bcache.h | 10 ++-- - drivers/md/bcache/request.c | 59 ++++++++++++++++++++++- - drivers/md/bcache/super.c | 4 ++ - drivers/md/bcache/sysfs.c | 15 ++++-- - drivers/md/bcache/util.c | 2 +- - drivers/md/bcache/util.h | 2 +- - drivers/md/bcache/writeback.c | 91 +++++++++++++++++++++++------------ - 7 files changed, 138 insertions(+), 45 deletions(-) - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index b393b3fd06b6..05f82ff6f016 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -328,13 +328,6 @@ struct cached_dev { - */ - atomic_t has_dirty; - -- /* -- * Set to zero by things that touch the backing volume-- except -- * writeback. Incremented by writeback. Used to determine when to -- * accelerate idle writeback. -- */ -- atomic_t backing_idle; -- - struct bch_ratelimit writeback_rate; - struct delayed_work writeback_rate_update; - -@@ -515,6 +508,8 @@ struct cache_set { - struct cache_accounting accounting; - - unsigned long flags; -+ atomic_t idle_counter; -+ atomic_t at_max_writeback_rate; - - struct cache_sb sb; - -@@ -524,6 +519,7 @@ struct cache_set { - - struct bcache_device **devices; - unsigned devices_max_used; -+ atomic_t attached_dev_nr; - struct list_head cached_devs; - uint64_t cached_dev_sectors; - atomic_long_t flash_dev_dirty_sectors; -diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c -index 914d501ad1e0..7dbe8b6316a0 100644 ---- a/drivers/md/bcache/request.c -+++ b/drivers/md/bcache/request.c -@@ -1103,6 +1103,44 @@ static void detached_dev_do_request(struct bcache_device *d, struct bio *bio) - generic_make_request(bio); - } - -+static void quit_max_writeback_rate(struct cache_set *c, -+ struct cached_dev *this_dc) -+{ -+ int i; -+ struct bcache_device *d; -+ struct cached_dev *dc; -+ -+ /* -+ * mutex bch_register_lock may compete with other parallel requesters, -+ * or attach/detach operations on other backing device. Waiting to -+ * the mutex lock may increase I/O request latency for seconds or more. -+ * To avoid such situation, if mutext_trylock() failed, only writeback -+ * rate of current cached device is set to 1, and __update_write_back() -+ * will decide writeback rate of other cached devices (remember now -+ * c->idle_counter is 0 already). -+ */ -+ if (mutex_trylock(&bch_register_lock)) { -+ for (i = 0; i < c->devices_max_used; i++) { -+ if (!c->devices[i]) -+ continue; -+ -+ if (UUID_FLASH_ONLY(&c->uuids[i])) -+ continue; -+ -+ d = c->devices[i]; -+ dc = container_of(d, struct cached_dev, disk); -+ /* -+ * set writeback rate to default minimum value, -+ * then let update_writeback_rate() to decide the -+ * upcoming rate. -+ */ -+ atomic_long_set(&dc->writeback_rate.rate, 1); -+ } -+ mutex_unlock(&bch_register_lock); -+ } else -+ atomic_long_set(&this_dc->writeback_rate.rate, 1); -+} -+ - /* Cached devices - read & write stuff */ - - static blk_qc_t cached_dev_make_request(struct request_queue *q, -@@ -1120,8 +1158,25 @@ static blk_qc_t cached_dev_make_request(struct request_queue *q, - return BLK_QC_T_NONE; - } - -- atomic_set(&dc->backing_idle, 0); -- generic_start_io_acct(q, bio_op(bio), bio_sectors(bio), &d->disk->part0); -+ if (likely(d->c)) { -+ if (atomic_read(&d->c->idle_counter)) -+ atomic_set(&d->c->idle_counter, 0); -+ /* -+ * If at_max_writeback_rate of cache set is true and new I/O -+ * comes, quit max writeback rate of all cached devices -+ * attached to this cache set, and set at_max_writeback_rate -+ * to false. -+ */ -+ if (unlikely(atomic_read(&d->c->at_max_writeback_rate) == 1)) { -+ atomic_set(&d->c->at_max_writeback_rate, 0); -+ quit_max_writeback_rate(d->c, dc); -+ } -+ } -+ -+ generic_start_io_acct(q, -+ bio_op(bio), -+ bio_sectors(bio), -+ &d->disk->part0); - - bio_set_dev(bio, dc->bdev); - bio->bi_iter.bi_sector += dc->sb.data_offset; -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index f517d7d1fa10..32b95f3b9461 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -696,6 +696,8 @@ static void bcache_device_detach(struct bcache_device *d) - { - lockdep_assert_held(&bch_register_lock); - -+ atomic_dec(&d->c->attached_dev_nr); -+ - if (test_bit(BCACHE_DEV_DETACHING, &d->flags)) { - struct uuid_entry *u = d->c->uuids + d->id; - -@@ -1144,6 +1146,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c, - - bch_cached_dev_run(dc); - bcache_device_link(&dc->disk, c, "bdev"); -+ atomic_inc(&c->attached_dev_nr); - - /* Allow the writeback thread to proceed */ - up_write(&dc->writeback_lock); -@@ -1696,6 +1699,7 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb) - c->block_bits = ilog2(sb->block_size); - c->nr_uuids = bucket_bytes(c) / sizeof(struct uuid_entry); - c->devices_max_used = 0; -+ atomic_set(&c->attached_dev_nr, 0); - c->btree_pages = bucket_pages(c); - if (c->btree_pages > BTREE_MAX_PAGES) - c->btree_pages = max_t(int, c->btree_pages / 4, -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index 3e9d3459a224..6e88142514fb 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -171,7 +171,8 @@ SHOW(__bch_cached_dev) - var_printf(writeback_running, "%i"); - var_print(writeback_delay); - var_print(writeback_percent); -- sysfs_hprint(writeback_rate, wb ? dc->writeback_rate.rate << 9 : 0); -+ sysfs_hprint(writeback_rate, -+ wb ? atomic_long_read(&dc->writeback_rate.rate) << 9 : 0); - sysfs_hprint(io_errors, atomic_read(&dc->io_errors)); - sysfs_printf(io_error_limit, "%i", dc->error_limit); - sysfs_printf(io_disable, "%i", dc->io_disable); -@@ -193,7 +194,9 @@ SHOW(__bch_cached_dev) - * Except for dirty and target, other values should - * be 0 if writeback is not running. - */ -- bch_hprint(rate, wb ? dc->writeback_rate.rate << 9 : 0); -+ bch_hprint(rate, -+ wb ? atomic_long_read(&dc->writeback_rate.rate) << 9 -+ : 0); - bch_hprint(dirty, bcache_dev_sectors_dirty(&dc->disk) << 9); - bch_hprint(target, dc->writeback_rate_target << 9); - bch_hprint(proportional, -@@ -261,8 +264,12 @@ STORE(__cached_dev) - - sysfs_strtoul_clamp(writeback_percent, dc->writeback_percent, 0, 40); - -- sysfs_strtoul_clamp(writeback_rate, -- dc->writeback_rate.rate, 1, INT_MAX); -+ if (attr == &sysfs_writeback_rate) { -+ int v; -+ -+ sysfs_strtoul_clamp(writeback_rate, v, 1, INT_MAX); -+ atomic_long_set(&dc->writeback_rate.rate, v); -+ } - - sysfs_strtoul_clamp(writeback_rate_update_seconds, - dc->writeback_rate_update_seconds, -diff --git a/drivers/md/bcache/util.c b/drivers/md/bcache/util.c -index fc479b026d6d..b15256bcf0e7 100644 ---- a/drivers/md/bcache/util.c -+++ b/drivers/md/bcache/util.c -@@ -200,7 +200,7 @@ uint64_t bch_next_delay(struct bch_ratelimit *d, uint64_t done) - { - uint64_t now = local_clock(); - -- d->next += div_u64(done * NSEC_PER_SEC, d->rate); -+ d->next += div_u64(done * NSEC_PER_SEC, atomic_long_read(&d->rate)); - - /* Bound the time. Don't let us fall further than 2 seconds behind - * (this prevents unnecessary backlog that would make it impossible -diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h -index cced87f8eb27..f7b0133c9d2f 100644 ---- a/drivers/md/bcache/util.h -+++ b/drivers/md/bcache/util.h -@@ -442,7 +442,7 @@ struct bch_ratelimit { - * Rate at which we want to do work, in units per second - * The units here correspond to the units passed to bch_next_delay() - */ -- uint32_t rate; -+ atomic_long_t rate; - }; - - static inline void bch_ratelimit_reset(struct bch_ratelimit *d) -diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c -index 912e969fedba..481d4cf38ac0 100644 ---- a/drivers/md/bcache/writeback.c -+++ b/drivers/md/bcache/writeback.c -@@ -104,11 +104,56 @@ static void __update_writeback_rate(struct cached_dev *dc) - - dc->writeback_rate_proportional = proportional_scaled; - dc->writeback_rate_integral_scaled = integral_scaled; -- dc->writeback_rate_change = new_rate - dc->writeback_rate.rate; -- dc->writeback_rate.rate = new_rate; -+ dc->writeback_rate_change = new_rate - -+ atomic_long_read(&dc->writeback_rate.rate); -+ atomic_long_set(&dc->writeback_rate.rate, new_rate); - dc->writeback_rate_target = target; - } - -+static bool set_at_max_writeback_rate(struct cache_set *c, -+ struct cached_dev *dc) -+{ -+ /* -+ * Idle_counter is increased everytime when update_writeback_rate() is -+ * called. If all backing devices attached to the same cache set have -+ * identical dc->writeback_rate_update_seconds values, it is about 6 -+ * rounds of update_writeback_rate() on each backing device before -+ * c->at_max_writeback_rate is set to 1, and then max wrteback rate set -+ * to each dc->writeback_rate.rate. -+ * In order to avoid extra locking cost for counting exact dirty cached -+ * devices number, c->attached_dev_nr is used to calculate the idle -+ * throushold. It might be bigger if not all cached device are in write- -+ * back mode, but it still works well with limited extra rounds of -+ * update_writeback_rate(). -+ */ -+ if (atomic_inc_return(&c->idle_counter) < -+ atomic_read(&c->attached_dev_nr) * 6) -+ return false; -+ -+ if (atomic_read(&c->at_max_writeback_rate) != 1) -+ atomic_set(&c->at_max_writeback_rate, 1); -+ -+ atomic_long_set(&dc->writeback_rate.rate, INT_MAX); -+ -+ /* keep writeback_rate_target as existing value */ -+ dc->writeback_rate_proportional = 0; -+ dc->writeback_rate_integral_scaled = 0; -+ dc->writeback_rate_change = 0; -+ -+ /* -+ * Check c->idle_counter and c->at_max_writeback_rate agagain in case -+ * new I/O arrives during before set_at_max_writeback_rate() returns. -+ * Then the writeback rate is set to 1, and its new value should be -+ * decided via __update_writeback_rate(). -+ */ -+ if ((atomic_read(&c->idle_counter) < -+ atomic_read(&c->attached_dev_nr) * 6) || -+ !atomic_read(&c->at_max_writeback_rate)) -+ return false; -+ -+ return true; -+} -+ - static void update_writeback_rate(struct work_struct *work) - { - struct cached_dev *dc = container_of(to_delayed_work(work), -@@ -136,13 +181,20 @@ static void update_writeback_rate(struct work_struct *work) - return; - } - -- down_read(&dc->writeback_lock); -- -- if (atomic_read(&dc->has_dirty) && -- dc->writeback_percent) -- __update_writeback_rate(dc); -+ if (atomic_read(&dc->has_dirty) && dc->writeback_percent) { -+ /* -+ * If the whole cache set is idle, set_at_max_writeback_rate() -+ * will set writeback rate to a max number. Then it is -+ * unncessary to update writeback rate for an idle cache set -+ * in maximum writeback rate number(s). -+ */ -+ if (!set_at_max_writeback_rate(c, dc)) { -+ down_read(&dc->writeback_lock); -+ __update_writeback_rate(dc); -+ up_read(&dc->writeback_lock); -+ } -+ } - -- up_read(&dc->writeback_lock); - - /* - * CACHE_SET_IO_DISABLE might be set via sysfs interface, -@@ -422,27 +474,6 @@ static void read_dirty(struct cached_dev *dc) - - delay = writeback_delay(dc, size); - -- /* If the control system would wait for at least half a -- * second, and there's been no reqs hitting the backing disk -- * for awhile: use an alternate mode where we have at most -- * one contiguous set of writebacks in flight at a time. If -- * someone wants to do IO it will be quick, as it will only -- * have to contend with one operation in flight, and we'll -- * be round-tripping data to the backing disk as quickly as -- * it can accept it. -- */ -- if (delay >= HZ / 2) { -- /* 3 means at least 1.5 seconds, up to 7.5 if we -- * have slowed way down. -- */ -- if (atomic_inc_return(&dc->backing_idle) >= 3) { -- /* Wait for current I/Os to finish */ -- closure_sync(&cl); -- /* And immediately launch a new set. */ -- delay = 0; -- } -- } -- - while (!kthread_should_stop() && - !test_bit(CACHE_SET_IO_DISABLE, &dc->disk.c->flags) && - delay) { -@@ -741,7 +772,7 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc) - dc->writeback_running = true; - dc->writeback_percent = 10; - dc->writeback_delay = 30; -- dc->writeback_rate.rate = 1024; -+ atomic_long_set(&dc->writeback_rate.rate, 1024); - dc->writeback_rate_minimum = 8; - - dc->writeback_rate_update_seconds = WRITEBACK_RATE_UPDATE_SECS_DEFAULT; --- -2.18.0 - diff --git a/for-next/0009-bcache-make-the-pr_err-statement-used-for-ENOENT-onl.patch b/for-next/0009-bcache-make-the-pr_err-statement-used-for-ENOENT-onl.patch deleted file mode 100644 index 59eb77f..0000000 --- a/for-next/0009-bcache-make-the-pr_err-statement-used-for-ENOENT-onl.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 1b28972603d1d9819c9273080b0a02ae00f609c2 Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Wed, 8 Aug 2018 20:32:52 +0800 -Subject: [PATCH 09/10] bcache: make the pr_err statement used for ENOENT only - in sysfs_attatch section - -The pr_err statement in the code for sysfs_attatch section would run -for various error codes, which maybe confusing. - -E.g, - -Run the command twice: - echo 796b5c05-b03c-4bc7-9cbd-a8df5e8be891 > \ - /sys/block/bcache0/bcache/attach - [the backing dev got attached on the first run] - echo 796b5c05-b03c-4bc7-9cbd-a8df5e8be891 > \ - /sys/block/bcache0/bcache/attach - -In dmesg, after the command run twice, we can get: - bcache: bch_cached_dev_attach() Can't attach sda6: already attached - bcache: __cached_dev_store() Can't attach 796b5c05-b03c-4bc7-9cbd-\ -a8df5e8be891 - : cache set not found -The first statement in the message was right, but the second was -confusing. - -bch_cached_dev_attach has various pr_ statements for various error -codes, except ENOENT. - -After the change, rerun above command twice: - echo 796b5c05-b03c-4bc7-9cbd-a8df5e8be891 > \ - /sys/block/bcache0/bcache/attach - echo 796b5c05-b03c-4bc7-9cbd-a8df5e8be891 > \ - /sys/block/bcache0/bcache/attach - -In dmesg we only got: - bcache: bch_cached_dev_attach() Can't attach sda6: already attached -No confusing "cache set not found" message anymore. - -And for some not exist SET-UUID: - echo 796b5c05-b03c-4bc7-9cbd-a8df5e8be898 > \ - /sys/block/bcache0/bcache/attach -In dmesg we can get: - bcache: __cached_dev_store() Can't attach 796b5c05-b03c-4bc7-9cbd-\ -a8df5e8be898 - : cache set not found - -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 6e88142514fb..22f8565d2bf1 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -351,8 +351,8 @@ STORE(__cached_dev) - if (!v) - return size; - } -- -- pr_err("Can't attach %s: cache set not found", buf); -+ if (v == -ENOENT) -+ pr_err("Can't attach %s: cache set not found", buf); - return v; - } - --- -2.18.0 - diff --git a/for-next/0010-bcache-trivial-remove-tailing-backslash-in-macro-BTR.patch b/for-next/0010-bcache-trivial-remove-tailing-backslash-in-macro-BTR.patch deleted file mode 100644 index 91713fd..0000000 --- a/for-next/0010-bcache-trivial-remove-tailing-backslash-in-macro-BTR.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 1ac333e00ca5af1223d63df97e8eac012f62ba4e Mon Sep 17 00:00:00 2001 -From: Shenghui Wang <shhuiw@foxmail.com> -Date: Fri, 3 Aug 2018 16:55:02 +0800 -Subject: [PATCH 10/10] bcache: trivial - remove tailing backslash in macro - BTREE_FLAG - -Remove the tailing backslash in macro BTREE_FLAG in btree.h - -Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> -Signed-off-by: Coly Li <colyli@suse.de> ---- - drivers/md/bcache/btree.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h -index d211e2c25b6b..68e9d926134d 100644 ---- a/drivers/md/bcache/btree.h -+++ b/drivers/md/bcache/btree.h -@@ -152,7 +152,7 @@ static inline bool btree_node_ ## flag(struct btree *b) \ - { return test_bit(BTREE_NODE_ ## flag, &b->flags); } \ - \ - static inline void set_btree_node_ ## flag(struct btree *b) \ --{ set_bit(BTREE_NODE_ ## flag, &b->flags); } \ -+{ set_bit(BTREE_NODE_ ## flag, &b->flags); } - - enum btree_flags { - BTREE_NODE_io_error, --- -2.18.0 - |