DEFINE_IDR() is documented as defining a statically allocated IDR. Enforce
that contract with ASSERT_STATIC_STORAGE(), matching DEFINE_IDA().

Normal IDR operations use external synchronization and do not acquire the
embedded XArray lock. This change enforces the declaration API contract;
it does not fix a lockdep failure in ordinary IDR operations.

Convert the seven automatic IDRs in the userspace tests to plain
declarations and runtime initialization. Two already use idr_init_base().
Keep direct IDR_INIT() and IDR_INIT_BASE() initializers unchanged.

Assisted-by: OpenAI Codex
Signed-off-by: Yury Norov <[email protected]>
---
 include/linux/idr.h                 |  4 +++-
 tools/testing/radix-tree/idr-test.c | 29 ++++++++++++++++++++---------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/include/linux/idr.h b/include/linux/idr.h
index e2a4b6298511..d0393b7fe985 100644
--- a/include/linux/idr.h
+++ b/include/linux/idr.h
@@ -55,7 +55,9 @@ struct idr {
  * An IDR defined using this macro is ready for use with no additional
  * initialisation required.  It contains no IDs.
  */
-#define DEFINE_IDR(name)       struct idr name = IDR_INIT(name)
+#define DEFINE_IDR(name) \
+       struct idr name = IDR_INIT(name);       \
+       ASSERT_STATIC_STORAGE(name)
 
 /**
  * idr_get_cursor - Return the current position of the cyclic allocator
diff --git a/tools/testing/radix-tree/idr-test.c 
b/tools/testing/radix-tree/idr-test.c
index 6fcba5b5870b..4668c6a4f6ea 100644
--- a/tools/testing/radix-tree/idr-test.c
+++ b/tools/testing/radix-tree/idr-test.c
@@ -33,7 +33,9 @@ void item_idr_remove(struct idr *idr, int id)
 void idr_alloc_test(void)
 {
        unsigned long i;
-       DEFINE_IDR(idr);
+       struct idr idr;
+
+       idr_init(&idr);
 
        assert(idr_alloc_cyclic(&idr, DUMMY_PTR, 0, 0x4000, GFP_KERNEL) == 0);
        assert(idr_alloc_cyclic(&idr, DUMMY_PTR, 0x3ffd, 0x4000, GFP_KERNEL) == 
0x3ffd);
@@ -79,7 +81,9 @@ void idr_alloc2_test(void)
 
 void idr_replace_test(void)
 {
-       DEFINE_IDR(idr);
+       struct idr idr;
+
+       idr_init(&idr);
 
        idr_alloc(&idr, (void *)-1, 10, 11, GFP_KERNEL);
        idr_replace(&idr, &idr, 10);
@@ -96,7 +100,9 @@ void idr_replace_test(void)
 void idr_null_test(void)
 {
        int i;
-       DEFINE_IDR(idr);
+       struct idr idr;
+
+       idr_init(&idr);
 
        assert(idr_is_empty(&idr));
 
@@ -150,7 +156,9 @@ void idr_null_test(void)
 void idr_nowait_test(void)
 {
        unsigned int i;
-       DEFINE_IDR(idr);
+       struct idr idr;
+
+       idr_init(&idr);
 
        idr_preload(GFP_KERNEL);
 
@@ -169,11 +177,11 @@ void idr_get_next_test(int base)
 {
        unsigned long i;
        int nextid;
-       DEFINE_IDR(idr);
-       idr_init_base(&idr, base);
-
+       struct idr idr;
        int indices[] = {4, 7, 9, 15, 65, 128, 1000, 99999, 0};
 
+       idr_init_base(&idr, base);
+
        for(i = 0; indices[i]; i++) {
                struct item *item = item_create(indices[i], 0);
                assert(idr_alloc(&idr, item, indices[i], indices[i+1],
@@ -229,7 +237,8 @@ void idr_u32_test1(struct idr *idr, u32 handle)
 
 void idr_u32_test(int base)
 {
-       DEFINE_IDR(idr);
+       struct idr idr;
+
        idr_init_base(&idr, base);
        idr_u32_test1(&idr, 10);
        idr_u32_test1(&idr, 0x7fffffff);
@@ -360,7 +369,9 @@ void idr_find_test(void)
 void idr_checks(void)
 {
        unsigned long i;
-       DEFINE_IDR(idr);
+       struct idr idr;
+
+       idr_init(&idr);
 
        for (i = 0; i < 10000; i++) {
                struct item *item = item_create(i, 0);
-- 
2.53.0


Reply via email to