On Wed, Jan 26, 2022 at 10:03:54AM -0500, Alexander Aring wrote: > This patch fixes a sparse issue if DEFINE_STATIC_SRCU() of srcutree is > used by a module. Sparse will show: > > sparse: symbol '__srcu_struct_nodes_srcu' was not declared. Should it be static? > > The problem is here that the DEFINE_STATIC_SRCU() of srcutree uses > __DEFINE_SRCU() and define a non-static srcu_struct. This srcu_struct > will be exported by inserting it in a special module section > '__section("___srcu_struct_ptrs")'. During load/unloading srcutree runs > their init/cleanup functionality. It seems sparse does not understand > this connection. To avoid the sparse warning we make a prototype of the > exported srcu_struct with an export keyword. This way we tell the > that the srcu_struct might be used outside of the module. > > Signed-off-by: Alexander Aring <aahringo@xxxxxxxxxx> Queued for further review and testing, thank you!!! As usual, I could not resist the urge to wordsmith a bit. Could you please check below in case I messed something up? Thanx, Paul ------------------------------------------------------------------------ commit fa92d727f94486195e12dc782fec17d103072101 Author: Alexander Aring <aahringo@xxxxxxxxxx> Date: Wed Jan 26 10:03:54 2022 -0500 srcutree: Use export for srcu_struct defined by DEFINE_STATIC_SRCU() 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@xxxxxxxxxx> Signed-off-by: Paul E. McKenney <paulmck@xxxxxxxxxx> diff --git a/include/linux/srcutree.h b/include/linux/srcutree.h index 8501b6b459411..44e998643f483 100644 --- a/include/linux/srcutree.h +++ b/include/linux/srcutree.h @@ -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