diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-11-01 03:37:53 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-01-06 19:47:56 -0500 |
commit | 3be23b6e20552c2f57763ea4cdbaa38f38d7e147 (patch) | |
tree | 593540b3b971fa12aef4ca9abcb9ded555e1e09d | |
parent | 5c78fb87ba1a469221e1b8ed39e1e342253ee667 (diff) |
bcachefs: Inlining improvements
- 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>
-rw-r--r-- | fs/bcachefs/backpointers.c | 23 | ||||
-rw-r--r-- | fs/bcachefs/backpointers.h | 26 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 31 | ||||
-rw-r--r-- | fs/bcachefs/checksum.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/checksum.h | 12 |
6 files changed, 52 insertions, 45 deletions
diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c index dace68e208b6..614811eafa59 100644 --- a/fs/bcachefs/backpointers.c +++ b/fs/bcachefs/backpointers.c @@ -9,8 +9,6 @@ #include <linux/mm.h> -#define MAX_EXTENT_COMPRESS_RATIO_SHIFT 10 - /* * Convert from pos in backpointer btree to pos of corresponding bucket in alloc * btree: @@ -43,27 +41,6 @@ static inline struct bpos bucket_pos_to_bp(const struct bch_fs *c, return ret; } -void bch2_extent_ptr_to_bp(struct bch_fs *c, - enum btree_id btree_id, unsigned level, - struct bkey_s_c k, struct extent_ptr_decoded p, - struct bpos *bucket_pos, struct bch_backpointer *bp) -{ - enum bch_data_type data_type = level ? BCH_DATA_btree : BCH_DATA_user; - s64 sectors = level ? btree_sectors(c) : k.k->size; - u32 bucket_offset; - - *bucket_pos = PTR_BUCKET_POS_OFFSET(c, &p.ptr, &bucket_offset); - *bp = (struct bch_backpointer) { - .btree_id = btree_id, - .level = level, - .data_type = data_type, - .bucket_offset = ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) + - p.crc.offset, - .bucket_len = ptr_disk_sectors(sectors, p), - .pos = k.k->p, - }; -} - static bool extent_matches_bp(struct bch_fs *c, enum btree_id btree_id, unsigned level, struct bkey_s_c k, diff --git a/fs/bcachefs/backpointers.h b/fs/bcachefs/backpointers.h index 8c58f9298280..48a48b75c0ac 100644 --- a/fs/bcachefs/backpointers.h +++ b/fs/bcachefs/backpointers.h @@ -2,6 +2,7 @@ #ifndef _BCACHEFS_BACKPOINTERS_BACKGROUND_H #define _BCACHEFS_BACKPOINTERS_BACKGROUND_H +#include "buckets.h" #include "super.h" int bch2_backpointer_invalid(const struct bch_fs *, struct bkey_s_c k, @@ -16,9 +17,28 @@ void bch2_backpointer_swab(struct bkey_s); .swab = bch2_backpointer_swab, \ }) -void bch2_extent_ptr_to_bp(struct bch_fs *, enum btree_id, unsigned, - struct bkey_s_c, struct extent_ptr_decoded, - struct bpos *, struct bch_backpointer *); +#define MAX_EXTENT_COMPRESS_RATIO_SHIFT 10 + +static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, + enum btree_id btree_id, unsigned level, + struct bkey_s_c k, struct extent_ptr_decoded p, + struct bpos *bucket_pos, struct bch_backpointer *bp) +{ + enum bch_data_type data_type = level ? BCH_DATA_btree : BCH_DATA_user; + s64 sectors = level ? btree_sectors(c) : k.k->size; + u32 bucket_offset; + + *bucket_pos = PTR_BUCKET_POS_OFFSET(c, &p.ptr, &bucket_offset); + *bp = (struct bch_backpointer) { + .btree_id = btree_id, + .level = level, + .data_type = data_type, + .bucket_offset = ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) + + p.crc.offset, + .bucket_len = ptr_disk_sectors(sectors, p), + .pos = k.k->p, + }; +} int bch2_bucket_backpointer_del(struct btree_trans *, struct bkey_i_alloc_v4 *, struct bch_backpointer, struct bkey_s_c); diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 04ba6c662d31..7ca1b1042dff 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -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) { diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index 24942ef8ba2e..c5193a9d2c85 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -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) diff --git a/fs/bcachefs/checksum.c b/fs/bcachefs/checksum.c index 3268e8d48603..43d22fe8131b 100644 --- a/fs/bcachefs/checksum.c +++ b/fs/bcachefs/checksum.c @@ -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; diff --git a/fs/bcachefs/checksum.h b/fs/bcachefs/checksum.h index 3d6d13bcfd72..f7ccef7a5520 100644 --- a/fs/bcachefs/checksum.h +++ b/fs/bcachefs/checksum.h @@ -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 *); |