From: Yury Norov <ynorov@nvidia.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: "Yury Norov" <ynorov@nvidia.com>,
"Jason A. Donenfeld" <Jason@zx2c4.com>,
"Andrew Lunn" <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Matthew Wilcox" <willy@infradead.org>,
"Peter Zijlstra" <peterz@infradead.org>,
"Ingo Molnar" <mingo@redhat.com>, "Will Deacon" <will@kernel.org>,
"Boqun Feng" <boqun@kernel.org>,
"Waiman Long" <longman@redhat.com>,
"Dennis Zhou" <dennis@kernel.org>, "Tejun Heo" <tj@kernel.org>,
"Christoph Lameter" <cl@gentwo.org>,
"Paul E. McKenney" <paulmck@kernel.org>,
"Frederic Weisbecker" <frederic@kernel.org>,
"Neeraj Upadhyay" <neeraj.upadhyay@kernel.org>,
"Joel Fernandes" <joelagnelf@nvidia.com>,
"Josh Triplett" <josh@joshtriplett.org>,
"Uladzislau Rezki" <urezki@gmail.com>,
"Steven Rostedt" <rostedt@goodmis.org>,
"Mathieu Desnoyers" <mathieu.desnoyers@efficios.com>,
"Lai Jiangshan" <jiangshanlai@gmail.com>,
Zqiang <qiang.zhang@linux.dev>, "Onur Özkan" <work@onurozkan.dev>,
"Kees Cook" <kees@kernel.org>,
"Joel Granados" <joel.granados@kernel.org>,
"Anna-Maria Behnsen" <anna-maria@linutronix.de>,
"Thomas Gleixner" <tglx@kernel.org>,
"Juri Lelli" <juri.lelli@redhat.com>,
"Vincent Guittot" <vincent.guittot@linaro.org>,
"Dietmar Eggemann" <dietmar.eggemann@arm.com>,
"Ben Segall" <bsegall@google.com>, "Mel Gorman" <mgorman@suse.de>,
"Valentin Schneider" <vschneid@redhat.com>,
"K Prateek Nayak" <kprateek.nayak@amd.com>,
"Mike Rapoport" <rppt@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
"Lorenzo Stoakes" <ljs@kernel.org>,
"Vlastimil Babka" <vbabka@kernel.org>,
"Jann Horn" <jannh@google.com>,
"Pedro Falcato" <pfalcato@suse.de>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Jason Wang" <jasowangio@gmail.com>,
"Xuan Zhuo" <xuanzhuo@linux.alibaba.com>,
"Eugenio Pérez" <eperezma@redhat.com>,
"Sebastian Andrzej Siewior" <bigeasy@linutronix.de>,
"Clark Williams" <clrkwllms@kernel.org>,
"Nathan Chancellor" <nathan@kernel.org>,
"Nick Desaulniers" <ndesaulniers@google.com>,
"Bill Wendling" <morbo@google.com>,
"Justin Stitt" <justinstitt@google.com>,
linuxppc-dev@lists.ozlabs.org, linux-kernel@vger.kernel.org,
wireguard@lists.zx2c4.com, netdev@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
rcu@vger.kernel.org, virtualization@lists.linux.dev,
linux-rt-devel@lists.linux.dev, llvm@lists.linux.dev,
"Yury Norov" <yury.norov@gmail.com>
Subject: [PATCH 09/17] radix-tree: require static storage for RADIX_TREE()
Date: Mon, 14 Sep 2026 23:13:24 -0400 [thread overview]
Message-ID: <20260915031334.1194975-4-ynorov@nvidia.com> (raw)
In-Reply-To: <20260915030336.1192299-1-ynorov@nvidia.com>
RADIX_TREE() uses the static XArray initializer. Enforce static storage
for this declaration wrapper, consistently with DEFINE_XARRAY_FLAGS()
and DEFINE_IDR(). Leave RADIX_TREE_INIT() unchanged for embedded objects.
Normal radix-tree operations use external synchronization rather than the
embedded XArray lock, so this is declaration-contract enforcement rather
than a fix for a lockdep failure in normal radix-tree operations.
Convert the thirteen automatic roots in the userspace tests and benchmark
to plain declarations followed by INIT_RADIX_TREE(), preserving their
allocation flags.
Assisted-by: OpenAI Codex
Signed-off-by: Yury Norov <ynorov@nvidia.com>
---
include/linux/radix-tree.h | 4 +++-
tools/testing/radix-tree/benchmark.c | 4 +++-
tools/testing/radix-tree/main.c | 16 +++++++++++----
tools/testing/radix-tree/regression3.c | 4 +++-
tools/testing/radix-tree/tag_check.c | 28 +++++++++++++++++++-------
5 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
index 057edc4cbb6e..dc3795f4cb1f 100644
--- a/include/linux/radix-tree.h
+++ b/include/linux/radix-tree.h
@@ -8,6 +8,7 @@
#ifndef _LINUX_RADIX_TREE_H
#define _LINUX_RADIX_TREE_H
+#include <linux/compiler.h>
#include <linux/bitops.h>
#include <linux/gfp_types.h>
#include <linux/list.h>
@@ -79,7 +80,8 @@ static inline bool radix_tree_is_internal_node(void *ptr)
#define RADIX_TREE_INIT(name, mask) XARRAY_INIT(name, mask)
#define RADIX_TREE(name, mask) \
- struct radix_tree_root name = RADIX_TREE_INIT(name, mask)
+ struct radix_tree_root name = RADIX_TREE_INIT(name, mask); \
+ ASSERT_STATIC_STORAGE(name)
#define INIT_RADIX_TREE(root, mask) xa_init_flags(root, mask)
diff --git a/tools/testing/radix-tree/benchmark.c b/tools/testing/radix-tree/benchmark.c
index 523c79f22ed3..57ab92e6cd77 100644
--- a/tools/testing/radix-tree/benchmark.c
+++ b/tools/testing/radix-tree/benchmark.c
@@ -114,9 +114,11 @@ static void benchmark_delete(struct radix_tree_root *root,
static void benchmark_size(unsigned long size, unsigned long step)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
long long normal, tagged;
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
+
benchmark_insert(&tree, size, step);
benchmark_tagging(&tree, size, step);
diff --git a/tools/testing/radix-tree/main.c b/tools/testing/radix-tree/main.c
index f2cbc8e5b97c..6f0f8eaa044d 100644
--- a/tools/testing/radix-tree/main.c
+++ b/tools/testing/radix-tree/main.c
@@ -15,7 +15,9 @@
void __gang_check(unsigned long middle, long down, long up, int chunk, int hop)
{
long idx;
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
middle = 1 << 30;
@@ -78,7 +80,9 @@ void big_gang_check(bool long_run)
void add_and_check(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
item_insert(&tree, 44);
item_check_present(&tree, 44);
@@ -89,7 +93,9 @@ void add_and_check(void)
void dynamic_height_check(void)
{
int i;
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
tree_verify_min_height(&tree, 0);
item_insert(&tree, 42);
@@ -155,11 +161,13 @@ void check_copied_tags(struct radix_tree_root *tree, unsigned long start, unsign
void copy_tag_check(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
unsigned long idx[ITEMS];
unsigned long start, end, count = 0, tagged, cur, tmp;
int i;
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
+
// printf("generating radix tree indices...\n");
start = rand();
end = rand();
diff --git a/tools/testing/radix-tree/regression3.c b/tools/testing/radix-tree/regression3.c
index 9f9a3b280f56..dc235bff0063 100644
--- a/tools/testing/radix-tree/regression3.c
+++ b/tools/testing/radix-tree/regression3.c
@@ -28,13 +28,15 @@
void regression3_test(void)
{
- RADIX_TREE(root, GFP_KERNEL);
+ struct radix_tree_root root;
void *ptr0 = (void *)4ul;
void *ptr = (void *)8ul;
struct radix_tree_iter iter;
void **slot;
bool first;
+ INIT_RADIX_TREE(&root, GFP_KERNEL);
+
printv(1, "running regression test 3 (should take milliseconds)\n");
radix_tree_insert(&root, 0, ptr0);
diff --git a/tools/testing/radix-tree/tag_check.c b/tools/testing/radix-tree/tag_check.c
index f898957b1a19..51c0f0d6152c 100644
--- a/tools/testing/radix-tree/tag_check.c
+++ b/tools/testing/radix-tree/tag_check.c
@@ -42,7 +42,9 @@ __simple_checks(struct radix_tree_root *tree, unsigned long index, int tag)
void simple_checks(void)
{
unsigned long index;
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
for (index = 0; index < 10000; index++) {
__simple_checks(&tree, index, 0);
@@ -61,7 +63,9 @@ void simple_checks(void)
*/
static void extend_checks(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
item_insert(&tree, 43);
assert(item_tag_get(&tree, 43, 0) == 0);
@@ -90,7 +94,9 @@ static void contract_checks(void)
{
struct item *item;
int tmp;
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
tmp = 1<<RADIX_TREE_MAP_SHIFT;
item_insert(&tree, tmp);
@@ -271,9 +277,11 @@ static void do_thrash(struct radix_tree_root *tree, char *thrash_state, int tag)
static void thrash_tags(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
char *thrash_state;
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
+
thrash_state = malloc(THRASH_SIZE);
memset(thrash_state, 0, THRASH_SIZE);
@@ -286,7 +294,9 @@ static void thrash_tags(void)
static void leak_check(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
item_insert(&tree, 1000000);
item_delete(&tree, 1000000);
@@ -295,7 +305,9 @@ static void leak_check(void)
static void __leak_check(void)
{
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
+
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
printv(2, "%d: nr_allocated=%d\n", __LINE__, nr_allocated);
item_insert(&tree, 1000000);
@@ -309,10 +321,12 @@ static void __leak_check(void)
static void single_check(void)
{
struct item *items[BATCH];
- RADIX_TREE(tree, GFP_KERNEL);
+ struct radix_tree_root tree;
int ret;
unsigned long first = 0;
+ INIT_RADIX_TREE(&tree, GFP_KERNEL);
+
item_insert(&tree, 0);
item_tag_set(&tree, 0, 0);
ret = radix_tree_gang_lookup_tag(&tree, (void **)items, 0, BATCH, 0);
--
2.53.0
next prev parent reply other threads:[~2026-09-15 3:14 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-15 3:03 [PATCH 00/17] Treewide: enforce static storage for object initializers Yury Norov
2026-09-15 3:03 ` [PATCH 01/17] locking/mutex: assert static storage for DEFINE_MUTEX() Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 8:23 ` Peter Zijlstra
2026-09-15 15:54 ` Yury Norov
2026-09-15 3:03 ` [PATCH 02/17] locking/rtmutex: assert static storage for DEFINE_RT_MUTEX() Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:03 ` [PATCH 03/17] locking/rwsem: assert static storage for semaphore definitions Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:03 ` [PATCH 04/17] locking/semaphore: assert static storage for DEFINE_SEMAPHORE() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:03 ` [PATCH 05/17] locking/seqlock: assert static storage for DEFINE_SEQLOCK() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 06/17] sched: assert static storage for wait queue and completion declarations Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 07/17] xarray: assert static storage for DEFINE_XARRAY_FLAGS() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 08/17] idr: enforce the static-storage contract of DEFINE_IDR() Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:13 ` Yury Norov [this message]
2026-09-15 3:25 ` [PATCH 09/17] radix-tree: require static storage for RADIX_TREE() sashiko-bot
2026-09-15 3:13 ` [PATCH 10/17] klist: assert static storage for DEFINE_KLIST() Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 11/17] workqueue: assert static storage for work declarations Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 12/17] timers: assert static storage for DEFINE_TIMER() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-29 18:50 ` Thomas Gleixner
2026-09-15 3:13 ` [PATCH 13/17] kthread: assert static storage for delayed work declarations Yury Norov
2026-09-15 3:25 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 14/17] ratelimit: assert static storage for DEFINE_RATELIMIT_STATE() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 15/17] notifier: assert static storage for locking notifier heads Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-15 3:13 ` [PATCH 16/17] rcu: assert static storage for RCU sync and SRCU definitions Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-10-07 18:41 ` Joel Fernandes
2026-10-07 18:48 ` Yury Norov
2026-10-07 18:58 ` Joel Fernandes
2026-09-15 3:13 ` [PATCH 17/17] sysctl: assert static storage for DEFINE_CTL_TABLE_POLL() Yury Norov
2026-09-15 3:26 ` sashiko-bot
2026-09-18 7:21 ` Joel Granados
2026-09-15 6:14 ` [PATCH 00/17] Treewide: enforce static storage for object initializers Andrew Morton
2026-09-15 9:24 ` David Laight
2026-09-15 15:53 ` Yury Norov
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=20260915031334.1194975-4-ynorov@nvidia.com \
--to=ynorov@nvidia.com \
--cc=Jason@zx2c4.com \
--cc=akpm@linux-foundation.org \
--cc=andrew+netdev@lunn.ch \
--cc=anna-maria@linutronix.de \
--cc=bigeasy@linutronix.de \
--cc=boqun@kernel.org \
--cc=bsegall@google.com \
--cc=cl@gentwo.org \
--cc=clrkwllms@kernel.org \
--cc=davem@davemloft.net \
--cc=dennis@kernel.org \
--cc=dietmar.eggemann@arm.com \
--cc=edumazet@google.com \
--cc=eperezma@redhat.com \
--cc=frederic@kernel.org \
--cc=jannh@google.com \
--cc=jasowangio@gmail.com \
--cc=jiangshanlai@gmail.com \
--cc=joel.granados@kernel.org \
--cc=joelagnelf@nvidia.com \
--cc=josh@joshtriplett.org \
--cc=juri.lelli@redhat.com \
--cc=justinstitt@google.com \
--cc=kees@kernel.org \
--cc=kprateek.nayak@amd.com \
--cc=kuba@kernel.org \
--cc=liam@infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-rt-devel@lists.linux.dev \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=ljs@kernel.org \
--cc=llvm@lists.linux.dev \
--cc=longman@redhat.com \
--cc=mathieu.desnoyers@efficios.com \
--cc=mgorman@suse.de \
--cc=mingo@redhat.com \
--cc=morbo@google.com \
--cc=mst@redhat.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=neeraj.upadhyay@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=paulmck@kernel.org \
--cc=peterz@infradead.org \
--cc=pfalcato@suse.de \
--cc=qiang.zhang@linux.dev \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=rppt@kernel.org \
--cc=tglx@kernel.org \
--cc=tj@kernel.org \
--cc=urezki@gmail.com \
--cc=vbabka@kernel.org \
--cc=vincent.guittot@linaro.org \
--cc=virtualization@lists.linux.dev \
--cc=vschneid@redhat.com \
--cc=will@kernel.org \
--cc=willy@infradead.org \
--cc=wireguard@lists.zx2c4.com \
--cc=work@onurozkan.dev \
--cc=xuanzhuo@linux.alibaba.com \
--cc=yury.norov@gmail.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.