Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: Kill btree_iter->journal_pos

For BTREE_ITER_WITH_JOURNAL, we memoize lookups in the journal keys, to
avoid the binary search overhead.

Previously we stashed the pos of the last key returned from the journal,
in order to force the lookup to be redone when rewinding.

Now bch2_journal_keys_peek_upto() handles rewinding itself when
necessary - so we can slim down btree_iter.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+22 -17
+5 -13
fs/bcachefs/btree_iter.c
··· 1854 1854 struct btree_iter *iter, 1855 1855 struct bpos end_pos) 1856 1856 { 1857 - struct bkey_i *k; 1858 - 1859 - if (bpos_lt(iter->path->pos, iter->journal_pos)) 1860 - iter->journal_idx = 0; 1861 - 1862 - k = bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 1863 - iter->path->level, 1864 - iter->path->pos, 1865 - end_pos, 1866 - &iter->journal_idx); 1867 - 1868 - iter->journal_pos = k ? k->k.p : end_pos; 1869 - return k; 1857 + return bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 1858 + iter->path->level, 1859 + iter->path->pos, 1860 + end_pos, 1861 + &iter->journal_idx); 1870 1862 } 1871 1863 1872 1864 static noinline
-1
fs/bcachefs/btree_iter.h
··· 455 455 iter->pos = pos; 456 456 iter->k = POS_KEY(pos); 457 457 iter->journal_idx = 0; 458 - iter->journal_pos = POS_MIN; 459 458 #ifdef CONFIG_BCACHEFS_DEBUG 460 459 iter->ip_allocated = ip; 461 460 #endif
+17 -2
fs/bcachefs/btree_journal_iter.c
··· 73 73 return idx_to_pos(keys, __bch2_journal_key_search(keys, id, level, pos)); 74 74 } 75 75 76 + /* Returns first non-overwritten key >= search key: */ 76 77 struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree_id, 77 78 unsigned level, struct bpos pos, 78 79 struct bpos end_pos, size_t *idx) ··· 87 86 if (!*idx) 88 87 *idx = __bch2_journal_key_search(keys, btree_id, level, pos); 89 88 89 + while (*idx && 90 + __journal_key_cmp(btree_id, level, end_pos, idx_to_key(keys, *idx - 1)) <= 0) { 91 + --(*idx); 92 + iters++; 93 + if (iters == 10) { 94 + *idx = 0; 95 + goto search; 96 + } 97 + } 98 + 90 99 while ((k = *idx < keys->nr ? idx_to_key(keys, *idx) : NULL)) { 91 100 if (__journal_key_cmp(btree_id, level, end_pos, k) < 0) 92 101 return NULL; 93 102 94 - if (__journal_key_cmp(btree_id, level, pos, k) <= 0 && 95 - !k->overwritten) 103 + if (k->overwritten) { 104 + (*idx)++; 105 + continue; 106 + } 107 + 108 + if (__journal_key_cmp(btree_id, level, pos, k) <= 0) 96 109 return k->k; 97 110 98 111 (*idx)++;
-1
fs/bcachefs/btree_types.h
··· 304 304 305 305 /* BTREE_ITER_WITH_JOURNAL: */ 306 306 size_t journal_idx; 307 - struct bpos journal_pos; 308 307 #ifdef TRACK_PATH_ALLOCATED 309 308 unsigned long ip_allocated; 310 309 #endif