srcu: Use export for srcu_struct defined by DEFINE_STATIC_SRCU()
authorAlexander Aring <aahringo@redhat.com>
Wed, 26 Jan 2022 15:03:54 +0000 (10:03 -0500)
committerPaul E. McKenney <paulmck@kernel.org>
Mon, 11 Apr 2022 22:52:29 +0000 (15:52 -0700)
If an srcu_struct structure defined by tree SRCU's DEFINE_STATIC_SRCU()
is used by a module, sparse will give the following diagnostic:

sparse: symbol '__srcu_struct_nodes_srcu' was not declared. Should it be static?

The problem is that a within-module DEFINE_STATIC_SRCU() must define
a non-static srcu_struct because it is exported by referencing it in a
special '__section("___srcu_struct_ptrs")'.  This reference is needed
so that module load and unloading can invoke init_srcu_struct() and
cleanup_srcu_struct(), respectively.  Unfortunately, sparse is unaware of
'__section("___srcu_struct_ptrs")', resulting in the above false-positive
diagnostic.  To avoid this false positive, this commit therefore creates
a prototype of the srcu_struct with an "extern" keyword.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
include/linux/srcutree.h

index 8501b6b4594117566e0d1ea1e37a7af2a221fd67..44e998643f483a397d7938b050618942595a10d4 100644 (file)
@@ -131,6 +131,7 @@ struct srcu_struct {
 #ifdef MODULE
 # define __DEFINE_SRCU(name, is_static)                                        \
        is_static struct srcu_struct name;                              \
+       extern struct srcu_struct * const __srcu_struct_##name;         \
        struct srcu_struct * const __srcu_struct_##name                 \
                __section("___srcu_struct_ptrs") = &name
 #else