From: Steven Rostedt <rostedt@goodmis.org>
To: Linux Trace Devel <linux-trace-devel@vger.kernel.org>
Subject: [PATCH] libtracecmd: Have the rbtree check be more elaborate
Date: Fri, 29 May 2026 14:34:11 -0400 [thread overview]
Message-ID: <20260529143411.7ace2f59@fedora> (raw)
From: Steven Rostedt <rostedt@goodmis.org>
Update the check_tree() that verifies the rbtree (when enabled) to be a
little more elaborate to find more errors with the tree.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
lib/trace-cmd/trace-rbtree.c | 76 +++++++++++++++++++-----------------
1 file changed, 41 insertions(+), 35 deletions(-)
diff --git a/lib/trace-cmd/trace-rbtree.c b/lib/trace-cmd/trace-rbtree.c
index a541399a1b4d..b8360900fcc7 100644
--- a/lib/trace-cmd/trace-rbtree.c
+++ b/lib/trace-cmd/trace-rbtree.c
@@ -114,10 +114,48 @@ static int check_node(struct trace_rbtree *tree, struct trace_rbtree_node *node)
goto fail;
}
}
+ if (node->color == RED) {
+ if (node->left && node->left->color == RED)
+ goto fail;
+ if (node->right && node->right->color == RED)
+ goto fail;
+ }
return 0;
fail:
printf("FAILED ON NODE!");
- breakpoint();
+ return -1;
+}
+
+static int check_tree_node(struct trace_rbtree *tree, struct trace_rbtree_node *node,
+ int black)
+{
+ int this_black = black;
+ int left_black;
+ int right_black;
+
+ if (!node)
+ return 0;
+
+ this_black = node->color == BLACK;
+
+ if (check_node(tree, node) < 0)
+ goto fail;
+
+ if (node == node->left || node == node->right)
+ goto fail;
+
+ left_black = check_tree_node(tree, node->left, this_black);
+ right_black = check_tree_node(tree, node->right, this_black);
+
+ if (left_black < 0 || right_black < 0)
+ return -1;
+
+ if (left_black != right_black)
+ goto fail;
+
+ return this_black + left_black;
+fail:
+ printf("FAILED ON NODE!");
return -1;
}
@@ -125,39 +163,7 @@ static void check_tree(struct trace_rbtree *tree)
{
struct trace_rbtree_node *node = tree->node;
- if (node) {
- if (check_node(tree, node))
- return;
- while (node->left) {
- node = node->left;
- if (check_node(tree, node))
- return;
- }
- }
-
- while (node) {
- if (check_node(tree, node))
- return;
- if (node->right) {
- node = node->right;
- if (check_node(tree, node))
- return;
- while (node->left) {
- node = node->left;
- if (check_node(tree, node))
- return;
- }
- continue;
- }
- while (node->parent) {
- if (is_left(node))
- break;
- node = node->parent;
- if (check_node(tree, node))
- return;
- }
- node = node->parent;
- }
+ check_tree_node(tree, node, 0);
}
#else
static inline void check_tree(struct trace_rbtree *tree) { }
@@ -211,8 +217,8 @@ int __hidden tcmd_rbtree_insert(struct trace_rbtree *tree,
}
}
}
- check_tree(tree);
tree->node->color = BLACK;
+ check_tree(tree);
tree->nr_nodes++;
return 0;
}
--
2.53.0
reply other threads:[~2026-05-29 18:34 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260529143411.7ace2f59@fedora \
--to=rostedt@goodmis.org \
--cc=linux-trace-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox