diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-09-26 16:15:17 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-10-03 23:55:30 -0400 |
commit | 243aed1561b6ce17b529160d4fbd435be4a5c926 (patch) | |
tree | 581ee1553b651a139941b94213db0c621e8bb3b0 | |
parent | 839544067f558288395439454909d0d059c012ed (diff) |
bcachefs: Inline bch2_trans_kmalloc() fast path
Small performance optimization.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 39 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 18 |
2 files changed, 35 insertions, 22 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 30a031ca35d8..390758d004fe 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -2667,37 +2667,34 @@ void bch2_trans_copy_iter(struct btree_iter *dst, struct btree_iter *src) dst->key_cache_path = NULL; } -void *bch2_trans_kmalloc(struct btree_trans *trans, size_t size) +void *__bch2_trans_kmalloc(struct btree_trans *trans, size_t size) { unsigned new_top = trans->mem_top + size; + size_t old_bytes = trans->mem_bytes; + size_t new_bytes = roundup_pow_of_two(new_top); + void *new_mem; void *p; trans->mem_max = max(trans->mem_max, new_top); - if (new_top > trans->mem_bytes) { - size_t old_bytes = trans->mem_bytes; - size_t new_bytes = roundup_pow_of_two(new_top); - void *new_mem; + WARN_ON_ONCE(new_bytes > BTREE_TRANS_MEM_MAX); - WARN_ON_ONCE(new_bytes > BTREE_TRANS_MEM_MAX); - - new_mem = krealloc(trans->mem, new_bytes, GFP_NOFS); - if (!new_mem && new_bytes <= BTREE_TRANS_MEM_MAX) { - new_mem = mempool_alloc(&trans->c->btree_trans_mem_pool, GFP_KERNEL); - new_bytes = BTREE_TRANS_MEM_MAX; - kfree(trans->mem); - } + new_mem = krealloc(trans->mem, new_bytes, GFP_NOFS); + if (!new_mem && new_bytes <= BTREE_TRANS_MEM_MAX) { + new_mem = mempool_alloc(&trans->c->btree_trans_mem_pool, GFP_KERNEL); + new_bytes = BTREE_TRANS_MEM_MAX; + kfree(trans->mem); + } - if (!new_mem) - return ERR_PTR(-ENOMEM); + if (!new_mem) + return ERR_PTR(-ENOMEM); - trans->mem = new_mem; - trans->mem_bytes = new_bytes; + trans->mem = new_mem; + trans->mem_bytes = new_bytes; - if (old_bytes) { - trace_and_count(trans->c, trans_restart_mem_realloced, trans, _RET_IP_, new_bytes); - return ERR_PTR(btree_trans_restart(trans, BCH_ERR_transaction_restart_mem_realloced)); - } + if (old_bytes) { + trace_and_count(trans->c, trans_restart_mem_realloced, trans, _RET_IP_, new_bytes); + return ERR_PTR(btree_trans_restart(trans, BCH_ERR_transaction_restart_mem_realloced)); } p = trans->mem + trans->mem_top; diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 9594b1689f20..4ec873aa1f58 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -292,7 +292,23 @@ static inline void set_btree_iter_dontneed(struct btree_iter *iter) iter->path->preserve = false; } -void *bch2_trans_kmalloc(struct btree_trans *, size_t); +void *__bch2_trans_kmalloc(struct btree_trans *, size_t); + +static inline void *bch2_trans_kmalloc(struct btree_trans *trans, size_t size) +{ + unsigned new_top = trans->mem_top + size; + void *p = trans->mem + trans->mem_top; + + if (likely(new_top <= trans->mem_bytes)) { + trans->mem_top += size; + memset(p, 0, size); + return p; + } else { + return __bch2_trans_kmalloc(trans, size); + + } +} + u32 bch2_trans_begin(struct btree_trans *); static inline struct btree * |