diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-23 02:40:04 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:40:44 -0900 |
commit | 5353f305878259894f51a11994b44e451b0775f9 (patch) | |
tree | d67cbd85dd3c6c55cd1c8c8a215dc9f26a00165e | |
parent | 64228c5d12a76e8a0d254a900c2edaa918addecc (diff) |
bcache: don't touch journal flags in fast paths
-rw-r--r-- | drivers/md/bcache/btree_update.c | 7 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.h | 14 | ||||
-rw-r--r-- | drivers/md/bcache/buckets.c | 12 | ||||
-rw-r--r-- | drivers/md/bcache/extents.c | 6 | ||||
-rw-r--r-- | drivers/md/bcache/journal.c | 2 |
5 files changed, 21 insertions, 20 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c index a6d595df7f04..5163733c80cf 100644 --- a/drivers/md/bcache/btree_update.c +++ b/drivers/md/bcache/btree_update.c @@ -723,12 +723,12 @@ void bch_btree_journal_key(struct btree_iter *iter, struct btree_write *w = btree_current_write(b); EBUG_ON(iter->level || b->level); - BUG_ON(!res->ref && test_bit(JOURNAL_REPLAY_DONE, &j->flags)); + EBUG_ON(!res->ref && test_bit(JOURNAL_REPLAY_DONE, &j->flags)); if (!journal_pin_active(&w->journal)) bch_journal_pin_add(j, &w->journal, btree_node_flush); - if (test_bit(JOURNAL_REPLAY_DONE, &j->flags)) { + if (res->ref) { bch_journal_add_keys(j, res, b->btree_id, insert); btree_bset_last(b)->journal_seq = cpu_to_le64(bch_journal_res_seq(j, res)); @@ -1414,7 +1414,6 @@ static void btree_split(struct btree *b, struct btree_iter *iter, * @insert_keys: list of keys to insert * @hook: insert callback * @persistent: if not null, @persistent will wait on journal write - * @flags: BTREE_INSERT_NO_MARK_KEY * * Inserts as many keys as it can into a given btree node, splitting it if full. * If a split occurred, this function will return early. This can only happen @@ -1616,7 +1615,7 @@ retry: if (!i->done) u64s += jset_u64s(i->k->k.u64s); - ret = test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags) + ret = !(trans->flags & BTREE_INSERT_JOURNAL_REPLAY) ? bch_journal_res_get(&c->journal, &res, u64s, u64s) : 0; if (ret) diff --git a/drivers/md/bcache/btree_update.h b/drivers/md/bcache/btree_update.h index 97725296a2e8..5f74662a845a 100644 --- a/drivers/md/bcache/btree_update.h +++ b/drivers/md/bcache/btree_update.h @@ -274,10 +274,10 @@ int __bch_btree_insert_at(struct btree_insert *, u64 *); #define BTREE_INSERT_NOFAIL (1 << 1) /* - * Don't account key being insert (bch_mark_key) - only for journal replay, - * where we've already marked the new keys: + * Insert is for journal replay: don't get journal reservations, or mark extents + * (bch_mark_key) */ -#define BTREE_INSERT_NO_MARK_KEY (1 << 2) +#define BTREE_INSERT_JOURNAL_REPLAY (1 << 2) int bch_btree_insert_list_at(struct btree_iter *, struct keylist *, struct disk_reservation *, @@ -287,12 +287,14 @@ static inline bool journal_res_insert_fits(struct btree_insert *trans, struct btree_insert_entry *insert, struct journal_res *res) { - struct cache_set *c = insert->iter->c; unsigned u64s = 0; struct btree_insert_entry *i; - /* If we're in journal replay we're not getting journal reservations: */ - if (!test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)) + /* + * If we didn't get a journal reservation, we're in journal replay and + * we're not journalling updates: + */ + if (!res->ref) return true; for (i = insert; i < trans->entries + trans->nr; i++) diff --git a/drivers/md/bcache/buckets.c b/drivers/md/bcache/buckets.c index 8e62ce236851..18ce58934f9e 100644 --- a/drivers/md/bcache/buckets.c +++ b/drivers/md/bcache/buckets.c @@ -437,8 +437,8 @@ static void bch_mark_pointer(struct cache_set *c, * checked the gen */ if (ptr_stale(ca, ptr)) { - BUG_ON(type != S_CACHED && - test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)); + EBUG_ON(type != S_CACHED && + test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)); return; } @@ -450,10 +450,10 @@ static void bch_mark_pointer(struct cache_set *c, if (!is_gc && gc_will_visit(c, gc_pos)) goto out; - BUG_ON(type != S_CACHED && - !may_make_unavailable && - is_available_bucket(old) && - test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)); + EBUG_ON(type != S_CACHED && + !may_make_unavailable && + is_available_bucket(old) && + test_bit(JOURNAL_REPLAY_DONE, &c->journal.flags)); BUG_ON((old.dirty_sectors || old.cached_sectors) && diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index b06e5a4fe957..02cb01a795c9 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -1129,7 +1129,7 @@ static void extent_insert_committed(struct btree_insert *trans, bkey_copy(&split.k, insert->k); - if (!(trans->flags & BTREE_INSERT_NO_MARK_KEY) && + if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY) && bkey_cmp(committed_pos, insert->k->k.p) && bkey_extent_is_compressed(trans->c, bkey_i_to_s_c(insert->k))) { @@ -1317,7 +1317,7 @@ bch_insert_fixup_extent(struct btree_insert *trans, */ EBUG_ON(bkey_cmp(iter->pos, bkey_start_pos(&insert->k->k))); - if (!(trans->flags & BTREE_INSERT_NO_MARK_KEY)) + if (!(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)) bch_add_sectors(iter, bkey_i_to_s_c(insert->k), bkey_start_offset(&insert->k->k), insert->k->k.size, &stats); @@ -1493,7 +1493,7 @@ stop: * and didn't fully insert @insert: */ if (insert->k->k.size && - !(trans->flags & BTREE_INSERT_NO_MARK_KEY)) + !(trans->flags & BTREE_INSERT_JOURNAL_REPLAY)) bch_subtract_sectors(iter, bkey_i_to_s_c(insert->k), bkey_start_offset(&insert->k->k), insert->k->k.size, &stats); diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 0d9104e7f19e..35f55cfa6ef2 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -1360,7 +1360,7 @@ int bch_journal_replay(struct cache_set *c, struct list_head *list) ret = bch_btree_insert(c, entry->btree_id, k, &disk_res, NULL, NULL, BTREE_INSERT_NOFAIL| - BTREE_INSERT_NO_MARK_KEY); + BTREE_INSERT_JOURNAL_REPLAY); bch_disk_reservation_put(c, &disk_res); if (ret) |