aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2023-07-22 15:25:30 +0100
committerRichard Henderson <richard.henderson@linaro.org>2023-07-31 12:19:13 -0700
commit4c8baa02d36379507afd17bdea87aabe0aa32ed3 (patch)
treea398aa791a4ac7a35743d08baedd2353ee1fb6b8 /util
parent055b86e0f0b4325117055d8d31c49011258f4af3 (diff)
downloadqemu-4c8baa02d36379507afd17bdea87aabe0aa32ed3.zip
qemu-4c8baa02d36379507afd17bdea87aabe0aa32ed3.tar.gz
qemu-4c8baa02d36379507afd17bdea87aabe0aa32ed3.tar.bz2
util/interval-tree: Use qatomic_set_mb in rb_link_node
Ensure that the stores to rb_left and rb_right are complete before inserting the new node into the tree. Otherwise a concurrent reader could see garbage in the new leaf. Cc: qemu-stable@nongnu.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'util')
-rw-r--r--util/interval-tree.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/util/interval-tree.c b/util/interval-tree.c
index 5a0ad21..759562d 100644
--- a/util/interval-tree.c
+++ b/util/interval-tree.c
@@ -128,7 +128,11 @@ static inline void rb_link_node(RBNode *node, RBNode *parent, RBNode **rb_link)
node->rb_parent_color = (uintptr_t)parent;
node->rb_left = node->rb_right = NULL;
- qatomic_set(rb_link, node);
+ /*
+ * Ensure that node is initialized before insertion,
+ * as viewed by a concurrent search.
+ */
+ qatomic_set_mb(rb_link, node);
}
static RBNode *rb_next(RBNode *node)