bcachefs: Set preallocated transaction mem to avoid restarts
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 16 Nov 2020 01:52:55 +0000 (20:52 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:47 +0000 (17:08 -0400)
this will reduce transaction restarts, from observation of tracepoints.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/fs.c

index 007d696566608f8f510c6499d1ec09307c2184e6..6eebbadcef45d833888ba27c8a34ee063a96334d 100644 (file)
@@ -2370,8 +2370,12 @@ void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c,
         */
        bch2_trans_alloc_iters(trans, c);
 
-       if (expected_mem_bytes)
-               bch2_trans_preload_mem(trans, expected_mem_bytes);
+       if (expected_mem_bytes) {
+               expected_mem_bytes = roundup_pow_of_two(expected_mem_bytes);
+               trans->mem = kmalloc(expected_mem_bytes, GFP_KERNEL);
+               if (trans->mem)
+                       trans->mem_bytes = expected_mem_bytes;
+       }
 
        trans->srcu_idx = srcu_read_lock(&c->btree_trans_barrier);
 
index c1f822b96c48aeb5db7d26db9057bd6e395cd8c0..0a83d9fdecd157bb678e07230d07156d0bb6ea6a 100644 (file)
@@ -523,6 +523,7 @@ static void btree_update_nodes_written(struct btree_update *as)
 {
        struct bch_fs *c = as->c;
        struct btree *b = as->b;
+       struct btree_trans trans;
        u64 journal_seq = 0;
        unsigned i;
        int ret;
@@ -540,14 +541,16 @@ static void btree_update_nodes_written(struct btree_update *as)
         * journal reclaim does btree updates when flushing bkey_cached entries,
         * which may require allocations as well.
         */
-       ret = bch2_trans_do(c, &as->disk_res, &journal_seq,
-                           BTREE_INSERT_NOFAIL|
-                           BTREE_INSERT_USE_RESERVE|
-                           BTREE_INSERT_USE_ALLOC_RESERVE|
-                           BTREE_INSERT_NOCHECK_RW|
-                           BTREE_INSERT_JOURNAL_RECLAIM|
-                           BTREE_INSERT_JOURNAL_RESERVED,
-                           btree_update_nodes_written_trans(&trans, as));
+       bch2_trans_init(&trans, c, 0, 512);
+       ret = __bch2_trans_do(&trans, &as->disk_res, &journal_seq,
+                             BTREE_INSERT_NOFAIL|
+                             BTREE_INSERT_USE_RESERVE|
+                             BTREE_INSERT_USE_ALLOC_RESERVE|
+                             BTREE_INSERT_NOCHECK_RW|
+                             BTREE_INSERT_JOURNAL_RECLAIM|
+                             BTREE_INSERT_JOURNAL_RESERVED,
+                             btree_update_nodes_written_trans(&trans, as));
+       bch2_trans_exit(&trans);
        BUG_ON(ret && !bch2_journal_error(&c->journal));
 
        if (b) {
index 231a5433577f149a155245f93746842bb4b608bd..480469784152a6a3f0803d192f4fad518da05788 100644 (file)
@@ -278,7 +278,8 @@ __bch2_create(struct mnt_idmap *idmap,
        if (!tmpfile)
                mutex_lock(&dir->ei_update_lock);
 
-       bch2_trans_init(&trans, c, 8, 1024);
+       bch2_trans_init(&trans, c, 8,
+                       2048 + (!tmpfile ? dentry->d_name.len : 0));
 retry:
        bch2_trans_begin(&trans);