[Cluster-devel] [PATCH] srcutree: use export for srcu_struct defined by DEFINE_STATIC_SRCU()

Paul E. McKenney paulmck at kernel.org
Wed Jan 26 20:07:03 UTC 2022


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 at redhat.com>

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 at redhat.com>
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 at redhat.com>
    Signed-off-by: Paul E. McKenney <paulmck at kernel.org>

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




More information about the Cluster-devel mailing list