bcachefs: Make btree_node_type_needs_gc() cheaper
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 20 Oct 2019 04:24:51 +0000 (00:24 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:30 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_types.h
fs/bcachefs/btree_update.h
fs/bcachefs/btree_update_leaf.c

index 7d3c6670e30fb57246aa5a88243ecfcf5cda4714..48ebc886aaa265e66eacb6cb0ec2b5c3a8cf8bab 100644 (file)
@@ -460,19 +460,22 @@ static inline bool btree_node_is_extents(struct btree *b)
        return btree_node_type_is_extents(btree_node_type(b));
 }
 
+#define BTREE_NODE_TYPE_HAS_TRIGGERS                   \
+       ((1U << BKEY_TYPE_EXTENTS)|                     \
+        (1U << BKEY_TYPE_ALLOC)|                       \
+        (1U << BKEY_TYPE_INODES)|                      \
+        (1U << BKEY_TYPE_REFLINK)|                     \
+        (1U << BKEY_TYPE_EC)|                          \
+        (1U << BKEY_TYPE_BTREE))
+
+#define BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS             \
+       ((1U << BKEY_TYPE_EXTENTS)|                     \
+        (1U << BKEY_TYPE_INODES)|                      \
+        (1U << BKEY_TYPE_REFLINK))
+
 static inline bool btree_node_type_needs_gc(enum btree_node_type type)
 {
-       switch (type) {
-       case BKEY_TYPE_ALLOC:
-       case BKEY_TYPE_BTREE:
-       case BKEY_TYPE_EXTENTS:
-       case BKEY_TYPE_INODES:
-       case BKEY_TYPE_EC:
-       case BKEY_TYPE_REFLINK:
-               return true;
-       default:
-               return false;
-       }
+       return BTREE_NODE_TYPE_HAS_TRIGGERS & (1U << type);
 }
 
 struct btree_root {
index 49f4d24d56ff9d749cc23df2ff62bf2b9fd14721..db18527a239f09094b9e3f2f90fa08dfb1db6ca9 100644 (file)
@@ -27,7 +27,6 @@ enum {
        __BTREE_INSERT_JOURNAL_RESERVED,
        __BTREE_INSERT_NOMARK_OVERWRITES,
        __BTREE_INSERT_NOMARK,
-       __BTREE_INSERT_MARK_INMEM,
        __BTREE_INSERT_NO_CLEAR_REPLICAS,
        __BTREE_INSERT_BUCKET_INVALIDATE,
        __BTREE_INSERT_NOWAIT,
@@ -68,9 +67,6 @@ enum {
 /* Don't call mark new key at all: */
 #define BTREE_INSERT_NOMARK            (1 << __BTREE_INSERT_NOMARK)
 
-/* Don't mark transactionally: */
-#define BTREE_INSERT_MARK_INMEM                (1 << __BTREE_INSERT_MARK_INMEM)
-
 #define BTREE_INSERT_NO_CLEAR_REPLICAS (1 << __BTREE_INSERT_NO_CLEAR_REPLICAS)
 
 #define BTREE_INSERT_BUCKET_INVALIDATE (1 << __BTREE_INSERT_BUCKET_INVALIDATE)
index 139e8e8711f01a0617788bc1729b5def6cbe09f1..0b9b573a0d723b214c66c3a0b05b0114d936d65c 100644 (file)
@@ -426,20 +426,16 @@ static inline void do_btree_insert_one(struct btree_trans *trans,
        btree_insert_key_leaf(trans, insert);
 }
 
-static inline bool update_triggers_transactional(struct btree_trans *trans,
-                                                struct btree_insert_entry *i)
+static inline bool update_has_trans_triggers(struct btree_insert_entry *i)
 {
-       return likely(!(trans->flags & BTREE_INSERT_MARK_INMEM)) &&
-               (i->iter->btree_id == BTREE_ID_EXTENTS ||
-                i->iter->btree_id == BTREE_ID_INODES ||
-                i->iter->btree_id == BTREE_ID_REFLINK);
+       return BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS & (1U << i->iter->btree_id);
 }
 
-static inline bool update_has_triggers(struct btree_trans *trans,
-                                      struct btree_insert_entry *i)
+static inline bool update_has_nontrans_triggers(struct btree_insert_entry *i)
 {
-       return likely(!(trans->flags & BTREE_INSERT_NOMARK)) &&
-               btree_node_type_needs_gc(i->iter->btree_id);
+       return (BTREE_NODE_TYPE_HAS_TRIGGERS &
+               ~BTREE_NODE_TYPE_HAS_TRANS_TRIGGERS) &
+               (1U << i->iter->btree_id);
 }
 
 /*
@@ -465,8 +461,8 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
         * updates as we're walking it:
         */
        trans_for_each_update(trans, i)
-               if (update_has_triggers(trans, i) &&
-                   update_triggers_transactional(trans, i)) {
+               if (likely(!(trans->flags & BTREE_INSERT_NOMARK)) &&
+                   update_has_trans_triggers(i)) {
                        ret = bch2_trans_mark_update(trans, i->iter, i->k);
                        if (ret == -EINTR)
                                trace_trans_restart_mark(trans->ip);
@@ -551,8 +547,8 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
        }
 
        trans_for_each_update(trans, i)
-               if (update_has_triggers(trans, i) &&
-                   !update_triggers_transactional(trans, i))
+               if (likely(!(trans->flags & BTREE_INSERT_NOMARK)) &&
+                   update_has_nontrans_triggers(i))
                        bch2_mark_update(trans, i, &fs_usage->u, mark_flags);
 
        if (fs_usage && trans->fs_usage_deltas)