diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-05-15 10:54:43 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-05-15 11:14:15 -0400 |
commit | 42b64675464a0e1b6f2652a69d52ddfb91cef9cf (patch) | |
tree | 1a7894fcfe0f018679be113a32bf3c03b62acc22 | |
parent | 958ec4bb839ea689b582c18eb948ee5edc912697 (diff) |
bcachefs: More work to avoid transaction restarts
-rw-r--r-- | fs/bcachefs/acl.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/alloc_background.c | 8 | ||||
-rw-r--r-- | fs/bcachefs/btree_cache.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_gc.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/btree_io.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 53 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 5 | ||||
-rw-r--r-- | fs/bcachefs/btree_update.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_interior.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 31 | ||||
-rw-r--r-- | fs/bcachefs/debug.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/dirent.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/ec.c | 13 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/fs-io.c | 22 | ||||
-rw-r--r-- | fs/bcachefs/fs.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/fsck.c | 21 | ||||
-rw-r--r-- | fs/bcachefs/inode.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/io.c | 10 | ||||
-rw-r--r-- | fs/bcachefs/journal_seq_blacklist.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/migrate.c | 5 | ||||
-rw-r--r-- | fs/bcachefs/move.c | 7 | ||||
-rw-r--r-- | fs/bcachefs/quota.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/recovery.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/sysfs.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/tests.c | 26 | ||||
-rw-r--r-- | fs/bcachefs/xattr.c | 4 | ||||
-rw-r--r-- | include/trace/events/bcachefs.h | 90 |
28 files changed, 189 insertions, 169 deletions
diff --git a/fs/bcachefs/acl.c b/fs/bcachefs/acl.c index e1c7b87d6189..cdcccaad916d 100644 --- a/fs/bcachefs/acl.c +++ b/fs/bcachefs/acl.c @@ -220,7 +220,7 @@ struct posix_acl *bch2_get_acl(struct inode *vinode, int type) struct bkey_s_c_xattr xattr; struct posix_acl *acl = NULL; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); @@ -301,7 +301,7 @@ int bch2_set_acl(struct inode *vinode, struct posix_acl *acl, int type) int ret; mutex_lock(&inode->ei_update_lock); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); if (type == ACL_TYPE_ACCESS && acl) { ret = posix_acl_update_mode(&inode->v, &mode, &acl); diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 0786349fe0dc..617b0ed62865 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -228,7 +228,7 @@ int bch2_alloc_read(struct bch_fs *c, struct journal_keys *journal_keys) unsigned i; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_ALLOC, POS_MIN, 0, k, ret) bch2_mark_key(c, k, true, 0, NULL, 0, @@ -287,7 +287,7 @@ int bch2_alloc_replay_key(struct bch_fs *c, struct bkey_i *k) if (k->k.p.offset >= ca->mi.nbuckets) return 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_ALLOC, k->k.p, BTREE_ITER_INTENT); @@ -332,7 +332,7 @@ int bch2_alloc_write(struct bch_fs *c, unsigned flags, bool *wrote) BUG_ON(BKEY_ALLOC_VAL_U64s_MAX > 8); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_ALLOC, POS_MIN, BTREE_ITER_SLOTS|BTREE_ITER_INTENT); @@ -1031,7 +1031,7 @@ static int bch2_invalidate_buckets(struct bch_fs *c, struct bch_dev *ca) u64 journal_seq = 0; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_ALLOC, POS(ca->dev_idx, 0), diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c index ee85cd8501d7..6a7acd386d1d 100644 --- a/fs/bcachefs/btree_cache.c +++ b/fs/bcachefs/btree_cache.c @@ -730,8 +730,7 @@ retry: goto retry; trans_restart(); - trace_trans_restart_btree_node_reused(c, - iter->trans->ip); + trace_trans_restart_btree_node_reused(iter->trans->ip); return ERR_PTR(-EINTR); } } diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c index 9f0de5cd25ab..637fc0db6751 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -214,7 +214,7 @@ static int bch2_gc_btree(struct bch_fs *c, enum btree_id btree_id, u8 max_stale; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); gc_pos_set(c, gc_pos_btree(btree_id, POS_MIN, 0)); @@ -283,7 +283,7 @@ static int mark_journal_key(struct bch_fs *c, enum btree_id id, if (ret) return ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, id, bkey_start_pos(&insert->k), BTREE_ITER_SLOTS, k, ret) { @@ -1057,7 +1057,7 @@ static int bch2_coalesce_btree(struct bch_fs *c, enum btree_id btree_id) struct btree *merge[GC_MERGE_NODES]; u32 lock_seq[GC_MERGE_NODES]; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); /* * XXX: We don't have a good way of positively matching on sibling nodes diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index fe888c57522a..8b7e05ed066a 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1151,7 +1151,7 @@ static void bch2_btree_node_write_error(struct bch_fs *c, struct btree_iter *iter; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_node_iter(&trans, b->btree_id, b->key.k.p, BTREE_MAX_DEPTH, b->level, 0); diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 2e69a6ca785b..c1458af3a2e3 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -269,8 +269,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, if (unlikely(!ret)) { trans_restart(); - trace_trans_restart_would_deadlock(iter->trans->c, - iter->trans->ip); + trace_trans_restart_would_deadlock(iter->trans->ip); return false; } @@ -1666,7 +1665,7 @@ int bch2_trans_iter_free_on_commit(struct btree_trans *trans, return ret; } -int bch2_trans_realloc_iters(struct btree_trans *trans, +static int bch2_trans_realloc_iters(struct btree_trans *trans, unsigned new_size) { void *new_iters, *new_updates; @@ -1714,18 +1713,13 @@ success: if (trans->iters_live) { trans_restart(); - trace_trans_restart_iters_realloced(trans->c, trans->ip); + trace_trans_restart_iters_realloced(trans->ip, trans->size); return -EINTR; } return 0; } -void bch2_trans_preload_iters(struct btree_trans *trans) -{ - bch2_trans_realloc_iters(trans, BTREE_ITER_MAX); -} - static int btree_trans_iter_alloc(struct btree_trans *trans) { unsigned idx = __ffs64(~trans->iters_linked); @@ -1864,32 +1858,41 @@ struct btree_iter *bch2_trans_copy_iter(struct btree_trans *trans, return &trans->iters[idx]; } -void *bch2_trans_kmalloc(struct btree_trans *trans, - size_t size) +static int bch2_trans_preload_mem(struct btree_trans *trans, size_t size) { - void *ret; - - if (trans->mem_top + size > trans->mem_bytes) { + if (size > trans->mem_bytes) { size_t old_bytes = trans->mem_bytes; - size_t new_bytes = roundup_pow_of_two(trans->mem_top + size); + size_t new_bytes = roundup_pow_of_two(size); void *new_mem = krealloc(trans->mem, new_bytes, GFP_NOFS); if (!new_mem) - return ERR_PTR(-ENOMEM); + return -ENOMEM; trans->mem = new_mem; trans->mem_bytes = new_bytes; if (old_bytes) { trans_restart(); - trace_trans_restart_mem_realloced(trans->c, trans->ip); - return ERR_PTR(-EINTR); + trace_trans_restart_mem_realloced(trans->ip, new_bytes); + return -EINTR; } } - ret = trans->mem + trans->mem_top; + return 0; +} + +void *bch2_trans_kmalloc(struct btree_trans *trans, size_t size) +{ + void *p; + int ret; + + ret = bch2_trans_preload_mem(trans, trans->mem_top + size); + if (ret) + return ERR_PTR(ret); + + p = trans->mem + trans->mem_top; trans->mem_top += size; - return ret; + return p; } inline void bch2_trans_unlink_iters(struct btree_trans *trans, u64 iters) @@ -1936,7 +1939,9 @@ void __bch2_trans_begin(struct btree_trans *trans) bch2_btree_iter_traverse_all(trans); } -void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c) +void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c, + unsigned expected_nr_iters, + size_t expected_mem_bytes) { memset(trans, 0, offsetof(struct btree_trans, iters_onstack)); @@ -1945,6 +1950,12 @@ void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c) trans->size = ARRAY_SIZE(trans->iters_onstack); trans->iters = trans->iters_onstack; trans->updates = trans->updates_onstack; + + if (expected_nr_iters > trans->size) + bch2_trans_realloc_iters(trans, expected_nr_iters); + + if (expected_mem_bytes) + bch2_trans_preload_mem(trans, expected_mem_bytes); } int bch2_trans_exit(struct btree_trans *trans) diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 123bda2314cb..bf0d609b180f 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -259,9 +259,6 @@ static inline int bkey_err(struct bkey_s_c k) /* new multiple iterator interface: */ -int bch2_trans_realloc_iters(struct btree_trans *, unsigned); -void bch2_trans_preload_iters(struct btree_trans *); - int bch2_trans_iter_put(struct btree_trans *, struct btree_iter *); int bch2_trans_iter_free(struct btree_trans *, struct btree_iter *); int bch2_trans_iter_free_on_commit(struct btree_trans *, struct btree_iter *); @@ -304,7 +301,7 @@ static inline void bch2_trans_begin_updates(struct btree_trans *trans) } void *bch2_trans_kmalloc(struct btree_trans *, size_t); -void bch2_trans_init(struct btree_trans *, struct bch_fs *); +void bch2_trans_init(struct btree_trans *, struct bch_fs *, unsigned, size_t); int bch2_trans_exit(struct btree_trans *); #ifdef TRACE_TRANSACTION_RESTARTS diff --git a/fs/bcachefs/btree_update.h b/fs/bcachefs/btree_update.h index 308a92f7c95f..46bc6a1bc63e 100644 --- a/fs/bcachefs/btree_update.h +++ b/fs/bcachefs/btree_update.h @@ -127,7 +127,7 @@ struct btree_insert_entry *bch2_trans_update(struct btree_trans *, struct btree_trans trans; \ int _ret; \ \ - bch2_trans_init(&trans, (_c)); \ + bch2_trans_init(&trans, (_c), 0, 0); \ \ do { \ bch2_trans_begin(&trans); \ diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index a81873a9870b..176055873c30 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -1585,7 +1585,7 @@ int bch2_btree_split_leaf(struct bch_fs *c, struct btree_iter *iter, * instead of locking/reserving all the way to the root: */ if (!bch2_btree_iter_upgrade(iter, U8_MAX)) { - trace_trans_restart_iter_upgrade(c, iter->trans->ip); + trace_trans_restart_iter_upgrade(trans->ip); ret = -EINTR; goto out; } diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index 0a2544a93f4f..b8deaf317651 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -439,7 +439,7 @@ static int bch2_trans_journal_preres_get(struct btree_trans *trans) if (!bch2_trans_relock(trans)) { trans_restart(" (iter relock after journal preres get blocked)"); - trace_trans_restart_journal_preres_get(c, trans->ip); + trace_trans_restart_journal_preres_get(trans->ip); return -EINTR; } @@ -559,7 +559,7 @@ static inline int do_btree_insert_at(struct btree_trans *trans, ret = bch2_trans_mark_update(trans, i, &trans->fs_usage_deltas); if (ret == -EINTR) - trace_trans_restart_mark(c, trans->ip); + trace_trans_restart_mark(trans->ip); if (ret) return ret; } @@ -569,7 +569,7 @@ static inline int do_btree_insert_at(struct btree_trans *trans, if (race_fault()) { ret = -EINTR; trans_restart(" (race)"); - trace_trans_restart_fault_inject(c, trans->ip); + trace_trans_restart_fault_inject(trans->ip); goto out; } @@ -718,7 +718,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, ret == -EINTR || (flags & BTREE_INSERT_NOUNLOCK)) { trans_restart(" (split)"); - trace_trans_restart_btree_node_split(c, trans->ip); + trace_trans_restart_btree_node_split(trans->ip); ret = -EINTR; } break; @@ -738,7 +738,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (iter relock after marking replicas)"); - trace_trans_restart_mark_replicas(c, trans->ip); + trace_trans_restart_mark_replicas(trans->ip); ret = -EINTR; break; case BTREE_INSERT_NEED_JOURNAL_RES: @@ -752,7 +752,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (iter relock after journal res get blocked)"); - trace_trans_restart_journal_res_get(c, trans->ip); + trace_trans_restart_journal_res_get(trans->ip); ret = -EINTR; break; default: @@ -765,7 +765,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, if (ret2) { trans_restart(" (traverse)"); - trace_trans_restart_traverse(c, trans->ip); + trace_trans_restart_traverse(trans->ip); return ret2; } @@ -777,7 +777,7 @@ int bch2_trans_commit_error(struct btree_trans *trans, return 0; trans_restart(" (atomic)"); - trace_trans_restart_atomic(c, trans->ip); + trace_trans_restart_atomic(trans->ip); } return ret; @@ -808,7 +808,7 @@ static int __bch2_trans_commit(struct btree_trans *trans, if (!bch2_btree_iter_upgrade(i->iter, 1)) { trans_restart(" (failed upgrade, locks_want %u uptodate %u)", old_locks_want, old_uptodate); - trace_trans_restart_upgrade(c, trans->ip); + trace_trans_restart_upgrade(trans->ip); ret = -EINTR; goto err; } @@ -974,7 +974,9 @@ int bch2_btree_insert(struct bch_fs *c, enum btree_id id, struct btree_iter *iter; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); +retry: + bch2_trans_begin(&trans); iter = bch2_trans_get_iter(&trans, id, bkey_start_pos(&k->k), BTREE_ITER_INTENT); @@ -982,6 +984,8 @@ int bch2_btree_insert(struct bch_fs *c, enum btree_id id, bch2_trans_update(&trans, BTREE_INSERT_ENTRY(iter, k)); ret = bch2_trans_commit(&trans, disk_res, journal_seq, flags); + if (ret == -EINTR) + goto retry; bch2_trans_exit(&trans); return ret; @@ -1070,8 +1074,11 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id, struct btree_iter *iter; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + /* + * XXX: whether we need mem/more iters depends on whether this btree id + * has triggers + */ + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 512); iter = bch2_trans_get_iter(&trans, id, start, BTREE_ITER_INTENT); diff --git a/fs/bcachefs/debug.c b/fs/bcachefs/debug.c index a22ac8d60bb0..47b8dd74dc62 100644 --- a/fs/bcachefs/debug.c +++ b/fs/bcachefs/debug.c @@ -220,7 +220,7 @@ static ssize_t bch2_read_btree(struct file *file, char __user *buf, if (!i->size) return i->ret; - bch2_trans_init(&trans, i->c); + bch2_trans_init(&trans, i->c, 0, 0); iter = bch2_trans_get_iter(&trans, i->id, i->from, BTREE_ITER_PREFETCH); k = bch2_btree_iter_peek(iter); @@ -274,7 +274,7 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf, if (!i->size || !bkey_cmp(POS_MAX, i->from)) return i->ret; - bch2_trans_init(&trans, i->c); + bch2_trans_init(&trans, i->c, 0, 0); for_each_btree_node(&trans, iter, i->id, i->from, 0, b) { bch2_btree_node_to_text(&PBUF(i->buf), i->c, b); @@ -327,7 +327,7 @@ static ssize_t bch2_read_bfloat_failed(struct file *file, char __user *buf, if (!i->size) return i->ret; - bch2_trans_init(&trans, i->c); + bch2_trans_init(&trans, i->c, 0, 0); iter = bch2_trans_get_iter(&trans, i->id, i->from, BTREE_ITER_PREFETCH); diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c index b379780e703f..11e628876fff 100644 --- a/fs/bcachefs/dirent.c +++ b/fs/bcachefs/dirent.c @@ -312,7 +312,7 @@ u64 bch2_dirent_lookup(struct bch_fs *c, u64 dir_inum, struct bkey_s_c k; u64 inum = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_hash_lookup(&trans, bch2_dirent_hash_desc, hash_info, dir_inum, name, 0); @@ -369,7 +369,7 @@ int bch2_readdir(struct bch_fs *c, struct file *file, if (!dir_emit_dots(file, ctx)) return 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_DIRENTS, POS(inode->v.i_ino, ctx->pos), 0, k, ret) { diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c index e9844702e65b..1ff2a3c17e0b 100644 --- a/fs/bcachefs/ec.c +++ b/fs/bcachefs/ec.c @@ -440,7 +440,7 @@ int bch2_ec_read_extent(struct bch_fs *c, struct bch_read_bio *rbio) if (!buf) return -ENOMEM; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EC, POS(0, stripe_idx), @@ -697,7 +697,7 @@ static int ec_stripe_bkey_insert(struct bch_fs *c, struct bkey_s_c k; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); @@ -764,8 +764,7 @@ static int ec_stripe_update_ptrs(struct bch_fs *c, BKEY_PADDED(k) tmp; int ret = 0, dev, idx; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, bkey_start_pos(pos), @@ -1235,7 +1234,7 @@ int bch2_stripes_write(struct bch_fs *c, unsigned flags, bool *wrote) new_key = kmalloc(255 * sizeof(u64), GFP_KERNEL); BUG_ON(!new_key); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EC, POS_MIN, BTREE_ITER_SLOTS|BTREE_ITER_INTENT); @@ -1271,7 +1270,7 @@ int bch2_stripes_read(struct bch_fs *c, struct journal_keys *journal_keys) if (ret) return ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EC, POS_MIN, 0, k, ret) bch2_mark_key(c, k, true, 0, NULL, 0, 0); @@ -1298,7 +1297,7 @@ int bch2_ec_mem_alloc(struct bch_fs *c, bool gc) size_t i, idx = 0; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EC, POS(0, U64_MAX), 0); diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index 4978471246a5..656de0cfc429 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -1712,7 +1712,7 @@ bool bch2_check_range_allocated(struct bch_fs *c, struct bpos pos, u64 size, end.offset += size; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, pos, BTREE_ITER_SLOTS, k, err) { diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index be051f100fad..81a86664c99e 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -435,8 +435,7 @@ static int bchfs_write_index_update(struct bch_write_op *wop) BUG_ON(k->k.p.inode != inode->v.i_ino); - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 1024); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, @@ -1054,7 +1053,7 @@ int bch2_readpages(struct file *file, struct address_space *mapping, ret = readpages_iter_init(&readpages_iter, mapping, pages, nr_pages); BUG_ON(ret); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, POS_MIN, BTREE_ITER_SLOTS); @@ -1103,7 +1102,7 @@ static void __bchfs_readpage(struct bch_fs *c, struct bch_read_bio *rbio, bio_set_op_attrs(&rbio->bio, REQ_OP_READ, REQ_SYNC); bio_add_page_contig(&rbio->bio, page); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, POS_MIN, BTREE_ITER_SLOTS); @@ -2101,8 +2100,7 @@ static int __bch2_fpunch(struct bch_fs *c, struct bch_inode_info *inode, struct bkey_s_c k; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 1024); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, start, BTREE_ITER_INTENT); @@ -2148,7 +2146,7 @@ static inline int range_has_data(struct bch_fs *c, struct bkey_s_c k; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, start, 0, k, ret) { if (bkey_cmp(bkey_start_pos(k.k), end) >= 0) @@ -2404,8 +2402,7 @@ static long bch2_fcollapse(struct bch_inode_info *inode, if ((offset | len) & (block_bytes(c) - 1)) return -EINVAL; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 256); /* * We need i_mutex to keep the page cache consistent with the extents @@ -2520,8 +2517,7 @@ static long bch2_fallocate(struct bch_inode_info *inode, int mode, unsigned replicas = io_opts(c, inode).data_replicas; int ret; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); inode_lock(&inode->v); inode_dio_wait(&inode->v); @@ -2732,7 +2728,7 @@ static loff_t bch2_seek_data(struct file *file, u64 offset) if (offset >= isize) return -ENXIO; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, POS(inode->v.i_ino, offset >> 9), 0, k, ret) { @@ -2805,7 +2801,7 @@ static loff_t bch2_seek_hole(struct file *file, u64 offset) if (offset >= isize) return -ENXIO; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, POS(inode->v.i_ino, offset >> 9), diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index 16ba7eef2be7..a998a7e19ac1 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -164,7 +164,7 @@ int __must_check bch2_write_inode(struct bch_fs *c, struct bch_inode_unpacked inode_u; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); @@ -355,8 +355,7 @@ __bch2_create(struct bch_inode_info *dir, struct dentry *dentry, if (!tmpfile) mutex_lock(&dir->ei_update_lock); - bch2_trans_init(&trans, c); - bch2_trans_realloc_iters(&trans, 8); + bch2_trans_init(&trans, c, 8, 1024); retry: bch2_trans_begin(&trans); @@ -508,7 +507,7 @@ static int __bch2_link(struct bch_fs *c, int ret; mutex_lock(&inode->ei_update_lock); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 4, 1024); retry: bch2_trans_begin(&trans); @@ -595,7 +594,7 @@ static int bch2_unlink(struct inode *vdir, struct dentry *dentry) int ret; bch2_lock_inodes(dir, inode); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 4, 1024); retry: bch2_trans_begin(&trans); @@ -802,13 +801,13 @@ static int bch2_rename2(struct inode *src_vdir, struct dentry *src_dentry, return ret; } + bch2_trans_init(&trans, c, 8, 2048); + bch2_lock_inodes(i.src_dir, i.dst_dir, i.src_inode, i.dst_inode); - bch2_trans_init(&trans, c); - if (S_ISDIR(i.src_inode->v.i_mode) && inode_attrs_changing(i.dst_dir, i.src_inode)) { ret = -EXDEV; @@ -969,7 +968,7 @@ static int bch2_setattr_nonsize(struct bch_inode_info *inode, struct iattr *iatt if (ret) goto err; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); kfree(acl); @@ -1124,7 +1123,7 @@ static int bch2_fiemap(struct inode *vinode, struct fiemap_extent_info *info, if (start + len < start) return -EINVAL; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, POS(ei->v.i_ino, start >> 9), 0, k, ret) diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c index 980fd2623e33..433552df9049 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -450,8 +450,7 @@ static int check_extents(struct bch_fs *c) u64 i_sectors; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); bch_verbose(c, "checking extents"); @@ -546,8 +545,7 @@ static int check_dirents(struct bch_fs *c) bch_verbose(c, "checking dirents"); - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); hash_check_init(&h); @@ -703,8 +701,7 @@ static int check_xattrs(struct bch_fs *c) hash_check_init(&h); - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_XATTRS, POS(BCACHEFS_ROOT_INO, 0), 0); @@ -917,8 +914,7 @@ static int check_directory_structure(struct bch_fs *c, u64 d_inum; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); bch_verbose(c, "checking directory structure"); @@ -1084,8 +1080,7 @@ static int bch2_gc_walk_dirents(struct bch_fs *c, nlink_table *links, u64 d_inum; int ret; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); inc_link(c, links, range_start, range_end, BCACHEFS_ROOT_INO, false); @@ -1333,8 +1328,7 @@ static int bch2_gc_walk_inodes(struct bch_fs *c, int ret = 0, ret2 = 0; u64 nlinks_pos; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_INODES, POS(range_start, 0), 0); @@ -1458,8 +1452,7 @@ int bch2_fsck_walk_inodes_only(struct bch_fs *c) struct bkey_s_c_inode inode; int ret; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); for_each_btree_key(&trans, iter, BTREE_ID_INODES, POS_MIN, 0, k, ret) { if (k.k->type != KEY_TYPE_inode) diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c index d2748e700028..59ae6d073a33 100644 --- a/fs/bcachefs/inode.c +++ b/fs/bcachefs/inode.c @@ -390,7 +390,7 @@ int bch2_inode_rm(struct bch_fs *c, u64 inode_nr) if (ret) return ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_INODES, POS(inode_nr, 0), BTREE_ITER_SLOTS|BTREE_ITER_INTENT); diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index 12feb622d579..5416492e452a 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -285,7 +285,7 @@ int bch2_write_index_default(struct bch_write_op *op) BUG_ON(bch2_keylist_empty(keys)); bch2_verify_keylist_sorted(keys); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 256); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, bkey_start_pos(&bch2_keylist_front(keys)->k), @@ -1264,7 +1264,7 @@ static void bch2_read_retry_nodecode(struct bch_fs *c, struct bch_read_bio *rbio flags &= ~BCH_READ_LAST_FRAGMENT; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, rbio->pos, BTREE_ITER_SLOTS); @@ -1312,7 +1312,7 @@ static void bch2_read_retry(struct bch_fs *c, struct bch_read_bio *rbio, struct bkey_s_c k; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); flags &= ~BCH_READ_LAST_FRAGMENT; flags |= BCH_READ_MUST_CLONE; @@ -1421,7 +1421,7 @@ static void bch2_rbio_narrow_crcs(struct bch_read_bio *rbio) if (rbio->pick.crc.compression_type) return; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); retry: bch2_trans_begin(&trans); @@ -1859,7 +1859,7 @@ void bch2_read(struct bch_fs *c, struct bch_read_bio *rbio, u64 inode) BCH_READ_USER_MAPPED; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); BUG_ON(rbio->_state); BUG_ON(flags & BCH_READ_NODECODE); diff --git a/fs/bcachefs/journal_seq_blacklist.c b/fs/bcachefs/journal_seq_blacklist.c index 93ee5e889389..231f5da22f45 100644 --- a/fs/bcachefs/journal_seq_blacklist.c +++ b/fs/bcachefs/journal_seq_blacklist.c @@ -257,7 +257,7 @@ void bch2_blacklist_entries_gc(struct work_struct *work) unsigned i, nr, new_nr; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for (i = 0; i < BTREE_ID_NR; i++) { struct btree_iter *iter; diff --git a/fs/bcachefs/migrate.c b/fs/bcachefs/migrate.c index 190b545b5e45..74e17fa92c78 100644 --- a/fs/bcachefs/migrate.c +++ b/fs/bcachefs/migrate.c @@ -41,8 +41,7 @@ static int bch2_dev_usrdata_drop(struct bch_fs *c, unsigned dev_idx, int flags) BKEY_PADDED(key) tmp; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, POS_MIN, BTREE_ITER_PREFETCH); @@ -112,7 +111,7 @@ static int bch2_dev_metadata_drop(struct bch_fs *c, unsigned dev_idx, int flags) if (flags & BCH_FORCE_IF_METADATA_LOST) return -EINVAL; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); closure_init_stack(&cl); for (id = 0; id < BTREE_ID_NR; id++) { diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index d39f5633a824..97890918b829 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -61,8 +61,7 @@ static int bch2_migrate_index_update(struct bch_write_op *op) struct keylist *keys = &op->insert_keys; int ret = 0; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, bkey_start_pos(&bch2_keylist_front(keys)->k), @@ -500,7 +499,7 @@ int bch2_move_data(struct bch_fs *c, INIT_LIST_HEAD(&ctxt.reads); init_waitqueue_head(&ctxt.wait); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); stats->data_type = BCH_DATA_USER; stats->btree_id = BTREE_ID_EXTENTS; @@ -634,7 +633,7 @@ static int bch2_move_btree(struct bch_fs *c, enum data_cmd cmd; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); stats->data_type = BCH_DATA_BTREE; diff --git a/fs/bcachefs/quota.c b/fs/bcachefs/quota.c index 2b0edb6826d1..8a42660cff08 100644 --- a/fs/bcachefs/quota.c +++ b/fs/bcachefs/quota.c @@ -360,7 +360,7 @@ static int bch2_quota_init_type(struct bch_fs *c, enum quota_types type) struct bkey_s_c k; int ret = 0; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_QUOTAS, POS(type, 0), BTREE_ITER_PREFETCH, k, ret) { @@ -432,7 +432,7 @@ int bch2_fs_quota_read(struct bch_fs *c) return ret; } - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_INODES, POS_MIN, BTREE_ITER_PREFETCH, k, ret) { @@ -725,7 +725,7 @@ static int bch2_set_quota(struct super_block *sb, struct kqid qid, bkey_quota_init(&new_quota.k_i); new_quota.k.p = POS(qid.type, from_kqid(&init_user_ns, qid)); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_QUOTAS, new_quota.k.p, BTREE_ITER_SLOTS|BTREE_ITER_INTENT); diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 70fd9a27ae3d..afa7e9ee0fd4 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -213,8 +213,7 @@ static int bch2_extent_replay_key(struct bch_fs *c, struct bkey_i *k) bool split_compressed = false; int ret; - bch2_trans_init(&trans, c); - bch2_trans_preload_iters(&trans); + bch2_trans_init(&trans, c, BTREE_ITER_MAX, 0); retry: bch2_trans_begin(&trans); diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c index c2744c7dd2ba..675706761b12 100644 --- a/fs/bcachefs/sysfs.c +++ b/fs/bcachefs/sysfs.c @@ -262,7 +262,7 @@ static ssize_t bch2_compression_stats(struct bch_fs *c, char *buf) if (!test_bit(BCH_FS_STARTED, &c->flags)) return -EPERM; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_EXTENTS, POS_MIN, 0, k, ret) if (k.k->type == KEY_TYPE_extent) { diff --git a/fs/bcachefs/tests.c b/fs/bcachefs/tests.c index 6c3684d06967..96bca8009da7 100644 --- a/fs/bcachefs/tests.c +++ b/fs/bcachefs/tests.c @@ -34,7 +34,7 @@ static void test_delete(struct bch_fs *c, u64 nr) bkey_cookie_init(&k.k_i); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS, k.k.p, BTREE_ITER_INTENT); @@ -66,7 +66,7 @@ static void test_delete_written(struct bch_fs *c, u64 nr) bkey_cookie_init(&k.k_i); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS, k.k.p, BTREE_ITER_INTENT); @@ -94,7 +94,7 @@ static void test_iterate(struct bch_fs *c, u64 nr) u64 i; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); delete_test_keys(c); @@ -139,7 +139,7 @@ static void test_iterate_extents(struct bch_fs *c, u64 nr) u64 i; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); delete_test_keys(c); @@ -189,7 +189,7 @@ static void test_iterate_slots(struct bch_fs *c, u64 nr) u64 i; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); delete_test_keys(c); @@ -243,7 +243,7 @@ static void test_iterate_slots_extents(struct bch_fs *c, u64 nr) u64 i; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); delete_test_keys(c); @@ -304,7 +304,7 @@ static void test_peek_end(struct bch_fs *c, u64 nr) struct btree_iter *iter; struct bkey_s_c k; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS, POS_MIN, 0); @@ -323,7 +323,7 @@ static void test_peek_end_extents(struct bch_fs *c, u64 nr) struct btree_iter *iter; struct bkey_s_c k; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_trans_get_iter(&trans, BTREE_ID_EXTENTS, POS_MIN, 0); @@ -429,7 +429,7 @@ static void rand_lookup(struct bch_fs *c, u64 nr) struct bkey_s_c k; u64 i; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for (i = 0; i < nr; i++) { iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS, @@ -450,7 +450,7 @@ static void rand_mixed(struct bch_fs *c, u64 nr) int ret; u64 i; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for (i = 0; i < nr; i++) { iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS, @@ -502,7 +502,7 @@ static void seq_insert(struct bch_fs *c, u64 nr) bkey_cookie_init(&insert.k_i); - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_DIRENTS, POS_MIN, BTREE_ITER_SLOTS|BTREE_ITER_INTENT, k, ret) { @@ -525,7 +525,7 @@ static void seq_lookup(struct bch_fs *c, u64 nr) struct bkey_s_c k; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_DIRENTS, POS_MIN, 0, k, ret) ; @@ -539,7 +539,7 @@ static void seq_overwrite(struct bch_fs *c, u64 nr) struct bkey_s_c k; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_DIRENTS, POS_MIN, BTREE_ITER_INTENT, k, ret) { diff --git a/fs/bcachefs/xattr.c b/fs/bcachefs/xattr.c index fd58829a2007..41a9753e919c 100644 --- a/fs/bcachefs/xattr.c +++ b/fs/bcachefs/xattr.c @@ -125,7 +125,7 @@ int bch2_xattr_get(struct bch_fs *c, struct bch_inode_info *inode, struct bkey_s_c_xattr xattr; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); iter = bch2_hash_lookup(&trans, bch2_xattr_hash_desc, &inode->ei_str_hash, inode->v.i_ino, @@ -276,7 +276,7 @@ ssize_t bch2_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size) u64 inum = dentry->d_inode->i_ino; int ret; - bch2_trans_init(&trans, c); + bch2_trans_init(&trans, c, 0, 0); for_each_btree_key(&trans, iter, BTREE_ID_XATTRS, POS(inum, 0), 0, k, ret) { diff --git a/include/trace/events/bcachefs.h b/include/trace/events/bcachefs.h index afd8936e5e45..76673d9ab5bc 100644 --- a/include/trace/events/bcachefs.h +++ b/include/trace/events/bcachefs.h @@ -499,16 +499,14 @@ TRACE_EVENT(copygc, ); DECLARE_EVENT_CLASS(transaction_restart, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip), + TP_PROTO(unsigned long ip), + TP_ARGS(ip), TP_STRUCT__entry( - __array(char, name, 16) __field(unsigned long, ip ) ), TP_fast_assign( - memcpy(__entry->name, c->name, 16); __entry->ip = ip; ), @@ -516,73 +514,97 @@ DECLARE_EVENT_CLASS(transaction_restart, ); DEFINE_EVENT(transaction_restart, trans_restart_btree_node_reused, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_would_deadlock, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); -DEFINE_EVENT(transaction_restart, trans_restart_iters_realloced, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) +TRACE_EVENT(trans_restart_iters_realloced, + TP_PROTO(unsigned long ip, unsigned nr), + TP_ARGS(ip, nr), + + TP_STRUCT__entry( + __field(unsigned long, ip ) + __field(unsigned, nr ) + ), + + TP_fast_assign( + __entry->ip = ip; + __entry->nr = nr; + ), + + TP_printk("%pf nr %u", (void *) __entry->ip, __entry->nr) ); -DEFINE_EVENT(transaction_restart, trans_restart_mem_realloced, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) +TRACE_EVENT(trans_restart_mem_realloced, + TP_PROTO(unsigned long ip, unsigned long bytes), + TP_ARGS(ip, bytes), + + TP_STRUCT__entry( + __field(unsigned long, ip ) + __field(unsigned long, bytes ) + ), + + TP_fast_assign( + __entry->ip = ip; + __entry->bytes = bytes; + ), + + TP_printk("%pf bytes %lu", (void *) __entry->ip, __entry->bytes) ); DEFINE_EVENT(transaction_restart, trans_restart_journal_res_get, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_journal_preres_get, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_mark_replicas, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_fault_inject, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_btree_node_split, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_mark, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_upgrade, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_iter_upgrade, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_traverse, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DEFINE_EVENT(transaction_restart, trans_restart_atomic, - TP_PROTO(struct bch_fs *c, unsigned long ip), - TP_ARGS(c, ip) + TP_PROTO(unsigned long ip), + TP_ARGS(ip) ); DECLARE_EVENT_CLASS(node_lock_fail, |