bcachefs: Inlining improvements
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 1 Nov 2022 07:37:53 +0000 (03:37 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:45 +0000 (17:09 -0400)
 - Don't call into bch2_encrypt_bio() when we're not encrypting
 - Pull slowpath out of trans_lock_write()
 - Make sure bc2h_trans_journal_res_get() gets inlined.

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

index cbba0b79fdb8137fff04e70da5f96e5fc6a9c581..4a9476e8399efbbb8526692dbbf4501c8897d548 100644 (file)
@@ -1160,7 +1160,7 @@ int __must_check bch2_btree_path_traverse(struct btree_trans *trans,
                btree_path_traverse_one(trans, path, flags, _RET_IP_);
 }
 
-static void btree_path_copy(struct btree_trans *trans, struct btree_path *dst,
+static inline void btree_path_copy(struct btree_trans *trans, struct btree_path *dst,
                            struct btree_path *src)
 {
        unsigned i, offset = offsetof(struct btree_path, pos);
@@ -1189,6 +1189,7 @@ static struct btree_path *btree_path_clone(struct btree_trans *trans, struct btr
        return new;
 }
 
+__flatten
 struct btree_path *__bch2_btree_path_make_mut(struct btree_trans *trans,
                         struct btree_path *path, bool intent)
 {
index 8cc271030be62027819d29d1fd185326f30aaf6d..7cd3d56a8d7be79a5a0e6a20722656b59715460a 100644 (file)
@@ -291,7 +291,7 @@ bch2_trans_journal_preres_get_cold(struct btree_trans *trans, unsigned u64s,
        return 0;
 }
 
-static inline int bch2_trans_journal_res_get(struct btree_trans *trans,
+static __always_inline int bch2_trans_journal_res_get(struct btree_trans *trans,
                                             unsigned flags)
 {
        struct bch_fs *c = trans->c;
@@ -729,33 +729,34 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
        return ret;
 }
 
+static noinline int trans_lock_write_fail(struct btree_trans *trans, struct btree_insert_entry *i)
+{
+       while (--i >= trans->updates) {
+               if (same_leaf_as_prev(trans, i))
+                       continue;
+
+               bch2_btree_node_unlock_write(trans, i->path, insert_l(i)->b);
+       }
+
+       trace_and_count(trans->c, trans_restart_would_deadlock_write, trans);
+       return btree_trans_restart(trans, BCH_ERR_transaction_restart_would_deadlock_write);
+}
+
 static inline int trans_lock_write(struct btree_trans *trans)
 {
        struct btree_insert_entry *i;
-       int ret;
 
        trans_for_each_update(trans, i) {
                if (same_leaf_as_prev(trans, i))
                        continue;
 
-               ret = bch2_btree_node_lock_write(trans, i->path, &insert_l(i)->b->c);
-               if (ret)
-                       goto fail;
+               if (bch2_btree_node_lock_write(trans, i->path, &insert_l(i)->b->c))
+                       return trans_lock_write_fail(trans, i);
 
                bch2_btree_node_prep_for_write(trans, i->path, insert_l(i)->b);
        }
 
        return 0;
-fail:
-       while (--i >= trans->updates) {
-               if (same_leaf_as_prev(trans, i))
-                       continue;
-
-               bch2_btree_node_unlock_write_inlined(trans, i->path, insert_l(i)->b);
-       }
-
-       trace_and_count(trans->c, trans_restart_would_deadlock_write, trans);
-       return btree_trans_restart(trans, BCH_ERR_transaction_restart_would_deadlock_write);
 }
 
 static noinline void bch2_drop_overwrites_from_journal(struct btree_trans *trans)
index 3268e8d48603372f6f6178e346393edb068ede7c..43d22fe8131b00d720ed58702da1696577027f1b 100644 (file)
@@ -316,7 +316,7 @@ struct bch_csum bch2_checksum_bio(struct bch_fs *c, unsigned type,
        return __bch2_checksum_bio(c, type, nonce, bio, &iter);
 }
 
-int bch2_encrypt_bio(struct bch_fs *c, unsigned type,
+int __bch2_encrypt_bio(struct bch_fs *c, unsigned type,
                     struct nonce nonce, struct bio *bio)
 {
        struct bio_vec bv;
index 3d6d13bcfd72ec1dd2683eac57dbe11d5028655b..f7ccef7a55201985fbf03a4c937e26a3fd24cac2 100644 (file)
@@ -61,8 +61,16 @@ int bch2_rechecksum_bio(struct bch_fs *, struct bio *, struct bversion,
                        struct bch_extent_crc_unpacked *,
                        unsigned, unsigned, unsigned);
 
-int bch2_encrypt_bio(struct bch_fs *, unsigned,
-                    struct nonce, struct bio *);
+int __bch2_encrypt_bio(struct bch_fs *, unsigned,
+                      struct nonce, struct bio *);
+
+static inline int bch2_encrypt_bio(struct bch_fs *c, unsigned type,
+                                  struct nonce nonce, struct bio *bio)
+{
+       return bch2_csum_type_is_encryption(type)
+               ? __bch2_encrypt_bio(c, type, nonce, bio)
+               : 0;
+}
 
 int bch2_decrypt_sb_key(struct bch_fs *, struct bch_sb_field_crypt *,
                        struct bch_key *);