Commit 67997234 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: kill btree_trans->wb_updates

the btree write buffer path now creates a journal entry directly
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 002c76dc
...@@ -638,7 +638,6 @@ struct btree_transaction_stats { ...@@ -638,7 +638,6 @@ struct btree_transaction_stats {
struct bch2_time_stats lock_hold_times; struct bch2_time_stats lock_hold_times;
struct mutex lock; struct mutex lock;
unsigned nr_max_paths; unsigned nr_max_paths;
unsigned wb_updates_size;
unsigned journal_entries_size; unsigned journal_entries_size;
unsigned max_mem; unsigned max_mem;
char *max_paths_text; char *max_paths_text;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "error.h" #include "error.h"
#include "extents.h" #include "extents.h"
#include "journal.h" #include "journal.h"
#include "journal_io.h"
#include "replicas.h" #include "replicas.h"
#include "snapshot.h" #include "snapshot.h"
#include "trace.h" #include "trace.h"
...@@ -1369,7 +1370,6 @@ noinline __cold ...@@ -1369,7 +1370,6 @@ noinline __cold
void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans) void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans)
{ {
struct btree_insert_entry *i; struct btree_insert_entry *i;
struct btree_write_buffered_key *wb;
prt_printf(buf, "transaction updates for %s journal seq %llu", prt_printf(buf, "transaction updates for %s journal seq %llu",
trans->fn, trans->journal_res.seq); trans->fn, trans->journal_res.seq);
...@@ -1394,16 +1394,10 @@ void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans) ...@@ -1394,16 +1394,10 @@ void bch2_trans_updates_to_text(struct printbuf *buf, struct btree_trans *trans)
prt_newline(buf); prt_newline(buf);
} }
trans_for_each_wb_update(trans, wb) { for (struct jset_entry *e = trans->journal_entries;
prt_printf(buf, "update: btree=%s wb=1 %pS", e != btree_trans_journal_entries_top(trans);
bch2_btree_id_str(wb->btree), e = vstruct_next(e))
(void *) i->ip_allocated); bch2_journal_entry_to_text(buf, trans->c, e);
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);
}
printbuf_indent_sub(buf, 2); printbuf_indent_sub(buf, 2);
} }
...@@ -2922,7 +2916,6 @@ struct btree_trans *__bch2_trans_get(struct bch_fs *c, unsigned fn_idx) ...@@ -2922,7 +2916,6 @@ struct btree_trans *__bch2_trans_get(struct bch_fs *c, unsigned fn_idx)
if (s) { if (s) {
trans->nr_max_paths = s->nr_max_paths; trans->nr_max_paths = s->nr_max_paths;
trans->wb_updates_size = s->wb_updates_size;
trans->journal_entries_size = s->journal_entries_size; trans->journal_entries_size = s->journal_entries_size;
} }
......
...@@ -496,7 +496,7 @@ static inline void *bch2_trans_kmalloc(struct btree_trans *trans, size_t size) ...@@ -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) 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)) { if (likely(trans->mem_top + size <= trans->mem_bytes)) {
void *p = trans->mem + trans->mem_top; void *p = trans->mem + trans->mem_top;
......
...@@ -624,7 +624,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags, ...@@ -624,7 +624,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct btree_insert_entry *i; struct btree_insert_entry *i;
struct btree_write_buffered_key *wb;
struct btree_trans_commit_hook *h; struct btree_trans_commit_hook *h;
unsigned u64s = 0; unsigned u64s = 0;
int ret; int ret;
...@@ -743,14 +742,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags, ...@@ -743,14 +742,6 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
bkey_copy((struct bkey_i *) entry->start, i->k); 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), memcpy_u64s_small(journal_res_entry(&c->journal, &trans->journal_res),
trans->journal_entries, trans->journal_entries,
trans->journal_entries_u64s); trans->journal_entries_u64s);
...@@ -785,13 +776,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags, ...@@ -785,13 +776,9 @@ bch2_trans_commit_write_locked(struct btree_trans *trans, unsigned flags,
static noinline void bch2_drop_overwrites_from_journal(struct btree_trans *trans) static noinline void bch2_drop_overwrites_from_journal(struct btree_trans *trans)
{ {
struct btree_insert_entry *i; struct btree_insert_entry *i;
struct btree_write_buffered_key *wb;
trans_for_each_update(trans, i) trans_for_each_update(trans, i)
bch2_journal_key_overwritten(trans->c, i->btree_id, i->level, i->k->k.p); 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, 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) ...@@ -993,11 +980,9 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
struct btree_insert_entry *i = NULL; struct btree_insert_entry *i = NULL;
struct btree_write_buffered_key *wb;
int ret = 0; int ret = 0;
if (!trans->nr_updates && if (!trans->nr_updates &&
!trans->nr_wb_updates &&
!trans->journal_entries_u64s) !trans->journal_entries_u64s)
goto out_reset; goto out_reset;
...@@ -1064,9 +1049,6 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags) ...@@ -1064,9 +1049,6 @@ int __bch2_trans_commit(struct btree_trans *trans, unsigned flags)
trans->journal_u64s += jset_u64s(i->old_k.u64s); 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) { if (trans->extra_journal_res) {
ret = bch2_disk_reservation_add(c, trans->disk_res, ret = bch2_disk_reservation_add(c, trans->disk_res,
trans->extra_journal_res, trans->extra_journal_res,
......
...@@ -388,8 +388,6 @@ struct btree_trans { ...@@ -388,8 +388,6 @@ struct btree_trans {
u8 fn_idx; u8 fn_idx;
u8 nr_sorted; u8 nr_sorted;
u8 nr_updates; u8 nr_updates;
u8 nr_wb_updates;
u8 wb_updates_size;
bool srcu_held:1; bool srcu_held:1;
bool used_mempool:1; bool used_mempool:1;
bool in_traverse_all:1; bool in_traverse_all:1;
...@@ -424,7 +422,6 @@ struct btree_trans { ...@@ -424,7 +422,6 @@ struct btree_trans {
u8 sorted[BTREE_ITER_MAX + 8]; u8 sorted[BTREE_ITER_MAX + 8];
struct btree_path paths[BTREE_ITER_MAX]; struct btree_path paths[BTREE_ITER_MAX];
struct btree_insert_entry updates[BTREE_ITER_MAX]; struct btree_insert_entry updates[BTREE_ITER_MAX];
struct btree_write_buffered_key *wb_updates;
/* update path: */ /* update path: */
struct btree_trans_commit_hook *hooks; struct btree_trans_commit_hook *hooks;
......
...@@ -532,7 +532,7 @@ int __must_check bch2_trans_update(struct btree_trans *trans, struct btree_iter ...@@ -532,7 +532,7 @@ 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_); return bch2_trans_update_by_path(trans, path, k, flags, _RET_IP_);
} }
static noinline int bch2_btree_insert_clone_trans(struct btree_trans *trans, int bch2_btree_insert_clone_trans(struct btree_trans *trans,
enum btree_id btree, enum btree_id btree,
struct bkey_i *k) struct bkey_i *k)
{ {
...@@ -573,62 +573,6 @@ struct jset_entry *__bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsi ...@@ -573,62 +573,6 @@ struct jset_entry *__bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsi
return e; 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, int bch2_bkey_get_empty_slot(struct btree_trans *trans, struct btree_iter *iter,
enum btree_id btree, struct bpos end) enum btree_id btree, struct bpos end)
{ {
......
...@@ -101,8 +101,6 @@ int bch2_bkey_get_empty_slot(struct btree_trans *, struct btree_iter *, ...@@ -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 *, int __must_check bch2_trans_update(struct btree_trans *, struct btree_iter *,
struct bkey_i *, enum btree_update_flags); 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); 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) ...@@ -123,6 +121,25 @@ bch2_trans_jset_entry_alloc(struct btree_trans *trans, unsigned u64s)
return e; 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 *, void bch2_trans_commit_hook(struct btree_trans *,
struct btree_trans_commit_hook *); struct btree_trans_commit_hook *);
int __bch2_trans_commit(struct btree_trans *, unsigned); int __bch2_trans_commit(struct btree_trans *, unsigned);
...@@ -174,11 +191,6 @@ static inline int bch2_trans_commit(struct btree_trans *trans, ...@@ -174,11 +191,6 @@ static inline int bch2_trans_commit(struct btree_trans *trans,
(_i) < (_trans)->updates + (_trans)->nr_updates; \ (_i) < (_trans)->updates + (_trans)->nr_updates; \
(_i)++) (_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) static inline void bch2_trans_reset_updates(struct btree_trans *trans)
{ {
struct btree_insert_entry *i; struct btree_insert_entry *i;
...@@ -189,8 +201,6 @@ static inline void bch2_trans_reset_updates(struct btree_trans *trans) ...@@ -189,8 +201,6 @@ static inline void bch2_trans_reset_updates(struct btree_trans *trans)
trans->extra_journal_res = 0; trans->extra_journal_res = 0;
trans->nr_updates = 0; trans->nr_updates = 0;
trans->journal_entries_u64s = 0; trans->journal_entries_u64s = 0;
trans->nr_wb_updates = 0;
trans->wb_updates = NULL;
trans->hooks = NULL; trans->hooks = NULL;
if (trans->fs_usage_deltas) { if (trans->fs_usage_deltas) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment