bcachefs: kill btree_trans->wb_updates
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 12 Nov 2023 02:43:47 +0000 (21:43 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 1 Jan 2024 16:47:41 +0000 (11:47 -0500)
the btree write buffer path now creates a journal entry directly

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/btree_trans_commit.c
fs/bcachefs/btree_types.h
fs/bcachefs/btree_update.c
fs/bcachefs/btree_update.h

index eeb2787e6f792751cce2e2aae6139f7b88a68c42..db246d00c607a30b825bcdf241663f3b8be3fd4b 100644 (file)
@@ -638,7 +638,6 @@ struct btree_transaction_stats {
        struct bch2_time_stats  lock_hold_times;
        struct mutex            lock;
        unsigned                nr_max_paths;
-       unsigned                wb_updates_size;
        unsigned                journal_entries_size;
        unsigned                max_mem;
        char                    *max_paths_text;
index 6d6963858a830315814cdb0f8f3e0c74332056d4..9946b9b6b5a57ff5dfd155bccc66de66b28a0dd6 100644 (file)
@@ -13,6 +13,7 @@
 #include "error.h"
 #include "extents.h"
 #include "journal.h"
+#include "journal_io.h"
 #include "replicas.h"
 #include "snapshot.h"
 #include "trace.h"
@@ -1369,7 +1370,6 @@ noinline __cold
 void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans)
 {
        struct btree_insert_entry *i;
-       struct btree_write_buffered_key *wb;
 
        prt_printf(buf, "transaction updates for %s journal seq %llu",
               trans->fn, trans->journal_res.seq);
@@ -1394,16 +1394,10 @@ void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans)
                prt_newline(buf);
        }
 
-       trans_for_each_wb_update(trans, wb) {
-               prt_printf(buf, "update: btree=%s wb=1 %pS",
-                      bch2_btree_id_str(wb->btree),
-                      (void *) i->ip_allocated);
-               prt_newline(buf);
-
-               prt_printf(buf, "  new ");
-               bch2_bkey_val_to_text(buf, trans->c, bkey_i_to_s_c(&wb->k));
-               prt_newline(buf);
-       }
+       for (struct jset_entry *e = trans->journal_entries;
+            e != btree_trans_journal_entries_top(trans);
+            e = vstruct_next(e))
+               bch2_journal_entry_to_text(buf, trans->c, e);
 
        printbuf_indent_sub(buf, 2);
 }
@@ -2922,7 +2916,6 @@ struct btree_trans *__bch2_trans_get(struct bch_fs *c, unsigned fn_idx)
 
        if (s) {
                trans->nr_max_paths = s->nr_max_paths;
-               trans->wb_updates_size = s->wb_updates_size;
                trans->journal_entries_size = s->journal_entries_size;
        }
 
index f7d5f840394022ab5995e35642e1fe773fdbb6fb..6bc75bee55c8ca050ad681cce419ce16c9aebec2 100644 (file)
@@ -496,7 +496,7 @@ static inline void *bch2_trans_kmalloc(struct btree_trans *trans, size_t size)
 
 static inline void *bch2_trans_kmalloc_nomemzero(struct btree_trans *trans, size_t size)
 {
-       size = roundup(size, 8);
+       size = round_up(size, 8);
 
        if (likely(trans->mem_top + size <= trans->mem_bytes)) {
                void *p = trans->mem + trans->mem_top;
index e52386fdc7ec92d663fc23830a2022ecc1c52f9f..2078ab50701262d2809a6dda903fe9b06d95fb4b 100644 (file)
@@ -624,7 +624,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
 {
        struct bch_fs *c = trans->c;
        struct btree_insert_entry *i;
-       struct btree_write_buffered_key *wb;
        struct btree_trans_commit_hook *h;
        unsigned u64s = 0;
        int ret;
@@ -743,14 +742,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
                        bkey_copy((struct bkey_i *) entry->start, i->k);
                }
 
-               trans_for_each_wb_update(trans, wb) {
-                       entry = bch2_journal_add_entry(j, &trans->journal_res,
-                                              BCH_JSET_ENTRY_write_buffer_keys,
-                                              wb->btree, 0,
-                                              wb->k.k.u64s);
-                       bkey_copy((struct bkey_i *) entry->start, &wb->k);
-               }
-
                memcpy_u64s_small(journal_res_entry(&c->journal, &trans->journal_res),
                                  trans->journal_entries,
                                  trans->journal_entries_u64s);
@@ -785,13 +776,9 @@ revert_fs_usage:
 static noinline void bch2_drop_overwrites_from_journal(struct btree_trans *trans)
 {
        struct btree_insert_entry *i;
-       struct btree_write_buffered_key *wb;
 
        trans_for_each_update(trans, i)
                bch2_journal_key_overwritten(trans->c, i->btree_id, i->level, i->k->k.p);
-
-       trans_for_each_wb_update(trans, wb)
-               bch2_journal_key_overwritten(trans->c, wb->btree, 0, wb->k.k.p);
 }
 
 static noinline int bch2_trans_commit_bkey_invalid(struct btree_trans *trans,
@@ -993,11 +980,9 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
 {
        struct bch_fs *c = trans->c;
        struct btree_insert_entry *i = NULL;
-       struct btree_write_buffered_key *wb;
        int ret = 0;
 
        if (!trans->nr_updates &&
-           !trans->nr_wb_updates &&
            !trans->journal_entries_u64s)
                goto out_reset;
 
@@ -1064,9 +1049,6 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
                        trans->journal_u64s += jset_u64s(i->old_k.u64s);
        }
 
-       trans_for_each_wb_update(trans, wb)
-               trans->journal_u64s += jset_u64s(wb->k.k.u64s);
-
        if (trans->extra_journal_res) {
                ret = bch2_disk_reservation_add(c, trans->disk_res,
                                trans->extra_journal_res,
index 40e5a004e5c1fc71a75d2e26de8c62d296f7b678..d129c0e468cc5fa6a65fea666791e22a3ff61d16 100644 (file)
@@ -388,8 +388,6 @@ struct btree_trans {
        u8                      fn_idx;
        u8                      nr_sorted;
        u8                      nr_updates;
-       u8                      nr_wb_updates;
-       u8                      wb_updates_size;
        bool                    srcu_held:1;
        bool                    used_mempool:1;
        bool                    in_traverse_all:1;
@@ -424,7 +422,6 @@ struct btree_trans {
        u8                      sorted[BTREE_ITER_MAX + 8];
        struct btree_path       paths[BTREE_ITER_MAX];
        struct btree_insert_entry updates[BTREE_ITER_MAX];
-       struct btree_write_buffered_key *wb_updates;
 
        /* update path: */
        struct btree_trans_commit_hook *hooks;
index 33497e71b3d47c8ad81251e3eb29e0fbbfccba94..ecaf8d6332fc348f13d2871153962102a730e544 100644 (file)
@@ -532,9 +532,9 @@ int __must_check bch2_trans_update(struct btree_trans *trans, struct btree_iter
        return bch2_trans_update_by_path(trans, path, k, flags, _RET_IP_);
 }
 
-static noinline int bch2_btree_insert_clone_trans(struct btree_trans *trans,
-                                                 enum btree_id btree,
-                                                 struct bkey_i *k)
+int bch2_btree_insert_clone_trans(struct btree_trans *trans,
+                                 enum btree_id btree,
+                                 struct bkey_i *k)
 {
        struct bkey_i *n = bch2_trans_kmalloc(trans, bkey_bytes(&k->k));
        int ret = PTR_ERR_OR_ZERO(n);
@@ -573,62 +573,6 @@ struct jset_entry *__bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsi
        return e;
 }
 
-int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
-                                           enum btree_id btree,
-                                           struct bkey_i *k)
-{
-       struct btree_write_buffered_key *i;
-       int ret;
-
-       EBUG_ON(trans->nr_wb_updates > trans->wb_updates_size);
-       EBUG_ON(k->k.u64s > BTREE_WRITE_BUFERED_U64s_MAX);
-
-       if (unlikely(trans->journal_replay_not_finished))
-               return bch2_btree_insert_clone_trans(trans, btree, k);
-
-       trans_for_each_wb_update(trans, i) {
-               if (i->btree == btree && bpos_eq(i->k.k.p, k->k.p)) {
-                       bkey_copy(&i->k, k);
-                       return 0;
-               }
-       }
-
-       if (!trans->wb_updates ||
-           trans->nr_wb_updates == trans->wb_updates_size) {
-               struct btree_write_buffered_key *u;
-
-               if (trans->nr_wb_updates == trans->wb_updates_size) {
-                       struct btree_transaction_stats *s = btree_trans_stats(trans);
-
-                       BUG_ON(trans->wb_updates_size > U8_MAX / 2);
-                       trans->wb_updates_size = max(1, trans->wb_updates_size * 2);
-                       if (s)
-                               s->wb_updates_size = trans->wb_updates_size;
-               }
-
-               u = bch2_trans_kmalloc_nomemzero(trans,
-                                       trans->wb_updates_size *
-                                       sizeof(struct btree_write_buffered_key));
-               ret = PTR_ERR_OR_ZERO(u);
-               if (ret)
-                       return ret;
-
-               if (trans->nr_wb_updates)
-                       memcpy(u, trans->wb_updates, trans->nr_wb_updates *
-                              sizeof(struct btree_write_buffered_key));
-               trans->wb_updates = u;
-       }
-
-       trans->wb_updates[trans->nr_wb_updates] = (struct btree_write_buffered_key) {
-               .btree  = btree,
-       };
-
-       bkey_copy(&trans->wb_updates[trans->nr_wb_updates].k, k);
-       trans->nr_wb_updates++;
-
-       return 0;
-}
-
 int bch2_bkey_get_empty_slot(struct btree_trans *trans, struct btree_iter *iter,
                             enum btree_id btree, struct bpos end)
 {
index 1f2a77bfe461718212975e62fe1821a843e89241..8aec86ca2d200126f07accfd32ff5dcc823c3a90 100644 (file)
@@ -101,8 +101,6 @@ int bch2_bkey_get_empty_slot(struct btree_trans *, struct btree_iter *,
 
 int __must_check bch2_trans_update(struct btree_trans *, struct btree_iter *,
                                   struct bkey_i *, enum btree_update_flags);
-int __must_check bch2_trans_update_buffered(struct btree_trans *,
-                                           enum btree_id, struct bkey_i *);
 
 struct jset_entry *__bch2_trans_jset_entry_alloc(struct btree_trans *, unsigned);
 
@@ -123,6 +121,25 @@ bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsigned u64s)
        return e;
 }
 
+int bch2_btree_insert_clone_trans(struct btree_trans *, enum btree_id, struct bkey_i *);
+
+static inline int __must_check bch2_trans_update_buffered(struct btree_trans *trans,
+                                           enum btree_id btree,
+                                           struct bkey_i *k)
+{
+       if (unlikely(trans->journal_replay_not_finished))
+               return bch2_btree_insert_clone_trans(trans, btree, k);
+
+       struct jset_entry *e = bch2_trans_jset_entry_alloc(trans, jset_u64s(k->k.u64s));
+       int ret = PTR_ERR_OR_ZERO(e);
+       if (ret)
+               return ret;
+
+       journal_entry_init(e, BCH_JSET_ENTRY_write_buffer_keys, btree, 0, k->k.u64s);
+       bkey_copy(e->start, k);
+       return 0;
+}
+
 void bch2_trans_commit_hook(struct btree_trans *,
                            struct btree_trans_commit_hook *);
 int __bch2_trans_commit(struct btree_trans *, unsigned);
@@ -174,11 +191,6 @@ static inline int bch2_trans_commit(struct btree_trans *trans,
             (_i) < (_trans)->updates + (_trans)->nr_updates;           \
             (_i)++)
 
-#define trans_for_each_wb_update(_trans, _i)                           \
-       for ((_i) = (_trans)->wb_updates;                               \
-            (_i) < (_trans)->wb_updates + (_trans)->nr_wb_updates;     \
-            (_i)++)
-
 static inline void bch2_trans_reset_updates(struct btree_trans *trans)
 {
        struct btree_insert_entry *i;
@@ -189,8 +201,6 @@ static inline void bch2_trans_reset_updates(struct btree_trans *trans)
        trans->extra_journal_res        = 0;
        trans->nr_updates               = 0;
        trans->journal_entries_u64s     = 0;
-       trans->nr_wb_updates            = 0;
-       trans->wb_updates               = NULL;
        trans->hooks                    = NULL;
 
        if (trans->fs_usage_deltas) {