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

Alexander Aring aahringo at redhat.com
Wed Jan 26 20:25:10 UTC 2022


Hi,

On Wed, Jan 26, 2022 at 3:13 PM Paul E. McKenney <paulmck at kernel.org> wrote:
>
> 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.
>

perfect, thanks.

- Alex




More information about the Cluster-devel mailing list