bcachefs: Inline bch2_trans_kmalloc() fast path
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 26 Sep 2022 20:15:17 +0000 (16:15 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:42 +0000 (17:09 -0400)
Small performance optimization.

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

index d58e29acfda3998be9ea699d42ac68136c9bae8e..30e7f07e3fa82b9852f0b2acce2d817b637d37ec 100644 (file)
@@ -2668,37 +2668,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;
index 04b6773d6e109b1322c94121d728956c39199991..1be7c8883101f9ac0c0f8b0221df8f47017d31e6 100644 (file)
@@ -328,7 +328,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 *