[PATCH 0/3] Catch automatic storage in IDA and Maple Tree definitions

From: Yury Norov

Date: Fri Sep 11 2026 - 18:20:17 EST


A 0day report [1] from the region allocation benchmark exposed a lockdep
initialization bug: a stack-local Maple Tree used MTREE_INIT(), whose
embedded lock has a static initializer. On the first allocation, lockdep
rejected the lock address as a non-static class key and disabled locking
validation. The IDA benchmark had the same issue, masked because it ran
after Maple Tree had already disabled lockdep.

The fix [2] switches the test to using mt_init_flags() and ida_init().
This series adds a compile-time check to the related DEFINE_IDA() and
DEFINE_MTREE() declaration macros to catch the same class of mistake
earlier.

Patch 1 introduces ASSERT_STATIC_STORAGE(). It declares an unused static
pointer initialized with the object's address, requiring that address to
be a valid static initializer. Patches 2 and 3 apply the helper to IDA and
Maple Tree definitions, respectively.

The helper is mirrored in the tools compiler header. The existing automatic
local IDAs and Maple Trees in the userspace radix-tree tests are converted
to runtime initialization. The interval-tree span test keeps its existing
mt_init_flags() call and uses a plain Maple Tree declaration.

For example, an automatic local definition:

void example(void)
{
DEFINE_IDA(ida);
ida_destroy(&ida);
}

now produces:

error: initializer element is not constant
note: in expansion of macro 'ASSERT_STATIC_STORAGE'
note: in expansion of macro 'DEFINE_IDA'

File-scope definitions and static local definitions remain valid.
Automatic local objects should use ida_init(), mt_init(), or
mt_init_flags().

The check is limited to declaration macros. Direct uses of IDA_INIT(),
MTREE_INIT(), and MTREE_INIT_EXT() remain unchanged. The helper cannot be
inserted directly into those initializer expressions because it expands
to a declaration.

Validated by GCC and Clang checks accepting static storage and rejecting
automatic storage The userspace IDR/IDA and Maple Tree test are passed
as well.

[1] https://download.01.org/0day-ci/archive/20260910/202609101106.771b567e-lkp@xxxxxxxxx/
[2] https://lore.kernel.org/all/20260911155244.1406122-1-ynorov@xxxxxxxxxx/

Yury Norov (3):
compiler.h: add ASSERT_STATIC_STORAGE()
idr: assert static storage for DEFINE_IDA()
maple_tree: assert static storage for DEFINE_MTREE()

include/linux/compiler.h | 5 +++++
include/linux/idr.h | 5 ++++-
include/linux/maple_tree.h | 4 +++-
lib/interval_tree_test.c | 2 +-
tools/include/linux/compiler.h | 5 +++++
tools/testing/radix-tree/idr-test.c | 20 +++++++++++++++-----
tools/testing/radix-tree/maple.c | 12 +++++++++---
7 files changed, 42 insertions(+), 11 deletions(-)

--
2.53.0