lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CA+KHdyVegyOM0hGnzCNJe4GgJ5mvu+_KK1dRpUOxFTNvS7oE6g@mail.gmail.com>
Date: Tue, 22 Apr 2025 14:59:07 +0200
From: Uladzislau Rezki <urezki@...il.com>
To: kernel test robot <lkp@...el.com>
Cc: Andrew Morton <akpm@...ux-foundation.org>, oe-kbuild-all@...ts.linux.dev, 
	Linux Memory Management List <linux-mm@...ck.org>, LKML <linux-kernel@...r.kernel.org>, 
	Baoquan He <bhe@...hat.com>, Christoph Hellwig <hch@...radead.org>, 
	Oleksiy Avramchenko <oleksiy.avramchenko@...y.com>
Subject: Re: [PATCH 1/4] lib/test_vmalloc.c: Replace RWSEM to SRCU for setup

Hello!

Fixed by the test_vmalloc.c: Fix compile error with CONFIG_TINY_RCU

--
Vlad Rezki

On Fri, Apr 18, 2025 at 8:13 PM kernel test robot <lkp@...el.com> wrote:
>
> Hi Uladzislau,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on akpm-mm/mm-nonmm-unstable]
> [also build test ERROR on linus/master hch-configfs/for-next v6.15-rc2 next-20250417]
> [cannot apply to akpm-mm/mm-everything]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url:    https://github.com/intel-lab-lkp/linux/commits/Uladzislau-Rezki-Sony/lib-test_vmalloc-c-Allow-built-in-execution/20250418-001446
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-nonmm-unstable
> patch link:    https://lore.kernel.org/r/20250417161216.88318-1-urezki%40gmail.com
> patch subject: [PATCH 1/4] lib/test_vmalloc.c: Replace RWSEM to SRCU for setup
> config: sparc64-randconfig-001-20250419 (https://download.01.org/0day-ci/archive/20250419/202504190146.gTBIrktk-lkp@intel.com/config)
> compiler: sparc64-linux-gcc (GCC) 8.5.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250419/202504190146.gTBIrktk-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@...el.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202504190146.gTBIrktk-lkp@intel.com/
>
> All error/warnings (new ones prefixed by >>):
>
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:69:8: error: redefinition of 'struct srcu_usage'
>     struct srcu_usage {
>            ^~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:52:8: note: originally defined here
>     struct srcu_usage { };
>            ^~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:102:8: error: redefinition of 'struct srcu_struct'
>     struct srcu_struct {
>            ^~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:16:8: note: originally defined here
>     struct srcu_struct {
>            ^~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:149: warning: "__SRCU_USAGE_INIT" redefined
>     #define __SRCU_USAGE_INIT(name)         \
>
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:53: note: this is the location of the previous definition
>     #define __SRCU_USAGE_INIT(name) { }
>
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:167: warning: "__SRCU_STRUCT_INIT" redefined
>     #define __SRCU_STRUCT_INIT(name, usage_name, pcpu_name)      \
>
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:34: note: this is the location of the previous definition
>     #define __SRCU_STRUCT_INIT(name, __ignored, ___ignored)   \
>
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:207: warning: "DEFINE_SRCU" redefined
>     #define DEFINE_SRCU(name)  __DEFINE_SRCU(name, /* not static */)
>
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:46: note: this is the location of the previous definition
>     #define DEFINE_SRCU(name) \
>
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:208: warning: "DEFINE_STATIC_SRCU" redefined
>     #define DEFINE_STATIC_SRCU(name) __DEFINE_SRCU(name, static)
>
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:48: note: this is the location of the previous definition
>     #define DEFINE_STATIC_SRCU(name) \
>
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:210:5: error: conflicting types for '__srcu_read_lock'
>     int __srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp);
>         ^~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:63:19: note: previous definition of '__srcu_read_lock' was here
>     static inline int __srcu_read_lock(struct srcu_struct *ssp)
>                       ^~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:211:6: error: conflicting types for 'synchronize_srcu_expedited'
>     void synchronize_srcu_expedited(struct srcu_struct *ssp);
>          ^~~~~~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:99:20: note: previous definition of 'synchronize_srcu_expedited' was here
>     static inline void synchronize_srcu_expedited(struct srcu_struct *ssp)
>                        ^~~~~~~~~~~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:212:6: error: conflicting types for 'srcu_barrier'
>     void srcu_barrier(struct srcu_struct *ssp);
>          ^~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:104:20: note: previous definition of 'srcu_barrier' was here
>     static inline void srcu_barrier(struct srcu_struct *ssp)
>                        ^~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:213:6: error: conflicting types for 'srcu_torture_stats_print'
>     void srcu_torture_stats_print(struct srcu_struct *ssp, char *tt, char *tf);
>          ^~~~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:113:20: note: previous definition of 'srcu_torture_stats_print' was here
>     static inline void srcu_torture_stats_print(struct srcu_struct *ssp,
>                        ^~~~~~~~~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:217:20: error: conflicting types for '__srcu_ptr_to_ctr'
>     static inline bool __srcu_ptr_to_ctr(struct srcu_struct *ssp, struct srcu_ctr __percpu *scpp)
>                        ^~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:76:20: note: previous definition of '__srcu_ptr_to_ctr' was here
>     static inline bool __srcu_ptr_to_ctr(struct srcu_struct *ssp, struct srcu_ctr __percpu *scpp)
>                        ^~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:224:41: error: conflicting types for '__srcu_ctr_to_ptr'
>     static inline struct srcu_ctr __percpu *__srcu_ctr_to_ptr(struct srcu_struct *ssp, int idx)
>                                             ^~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:81:41: note: previous definition of '__srcu_ctr_to_ptr' was here
>     static inline struct srcu_ctr __percpu *__srcu_ctr_to_ptr(struct srcu_struct *ssp, int idx)
>                                             ^~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:243:41: error: conflicting types for '__srcu_read_lock_fast'
>     static inline struct srcu_ctr __percpu *__srcu_read_lock_fast(struct srcu_struct *ssp)
>                                             ^~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:86:41: note: previous definition of '__srcu_read_lock_fast' was here
>     static inline struct srcu_ctr __percpu *__srcu_read_lock_fast(struct srcu_struct *ssp)
>                                             ^~~~~~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
> >> include/linux/srcutree.h:271:20: error: conflicting types for '__srcu_read_unlock_fast'
>     static inline void __srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)
>                        ^~~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:91:20: note: previous definition of '__srcu_read_unlock_fast' was here
>     static inline void __srcu_read_unlock_fast(struct srcu_struct *ssp, struct srcu_ctr __percpu *scp)
>                        ^~~~~~~~~~~~~~~~~~~~~~~
> >> include/linux/srcutiny.h:96:31: error: static declaration of '__srcu_read_lock' follows non-static declaration
>     #define __srcu_read_lock_lite __srcu_read_lock
>                                   ^~~~~~~~~~~~~~~~
>    include/linux/srcutree.h:291:19: note: in expansion of macro '__srcu_read_lock_lite'
>     static inline int __srcu_read_lock_lite(struct srcu_struct *ssp)
>                       ^~~~~~~~~~~~~~~~~~~~~
>    In file included from lib/test_vmalloc.c:18:
>    include/linux/srcutree.h:210:5: note: previous declaration of '__srcu_read_lock' was here
>     int __srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp);
>         ^~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
> >> include/linux/srcutiny.h:97:33: error: conflicting types for '__srcu_read_unlock'
>     #define __srcu_read_unlock_lite __srcu_read_unlock
>                                     ^~~~~~~~~~~~~~~~~~
>    include/linux/srcutree.h:312:20: note: in expansion of macro '__srcu_read_unlock_lite'
>     static inline void __srcu_read_unlock_lite(struct srcu_struct *ssp, int idx)
>                        ^~~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcu.h:56:6: note: previous declaration of '__srcu_read_unlock' was here
>     void __srcu_read_unlock(struct srcu_struct *ssp, int idx) __releases(ssp);
>          ^~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
> >> include/linux/srcutiny.h:110:56: error: expected identifier or '(' before 'do'
>     #define srcu_check_read_flavor_force(ssp, read_flavor) do { } while (0)
>                                                            ^~
>    include/linux/srcutree.h:324:20: note: in expansion of macro 'srcu_check_read_flavor_force'
>     static inline void srcu_check_read_flavor_force(struct srcu_struct *ssp, int read_flavor)
>                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >> include/linux/srcutiny.h:110:63: error: expected identifier or '(' before 'while'
>     #define srcu_check_read_flavor_force(ssp, read_flavor) do { } while (0)
>                                                                   ^~~~~
>    include/linux/srcutree.h:324:20: note: in expansion of macro 'srcu_check_read_flavor_force'
>     static inline void srcu_check_read_flavor_force(struct srcu_struct *ssp, int read_flavor)
>                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    include/linux/srcutiny.h:109:50: error: expected identifier or '(' before 'do'
>     #define srcu_check_read_flavor(ssp, read_flavor) do { } while (0)
>                                                      ^~
>    include/linux/srcutree.h:336:20: note: in expansion of macro 'srcu_check_read_flavor'
>     static inline void srcu_check_read_flavor(struct srcu_struct *ssp, int read_flavor)
>                        ^~~~~~~~~~~~~~~~~~~~~~
>    include/linux/srcutiny.h:109:57: error: expected identifier or '(' before 'while'
>     #define srcu_check_read_flavor(ssp, read_flavor) do { } while (0)
>                                                             ^~~~~
>    include/linux/srcutree.h:336:20: note: in expansion of macro 'srcu_check_read_flavor'
>     static inline void srcu_check_read_flavor(struct srcu_struct *ssp, int read_flavor)
>                        ^~~~~~~~~~~~~~~~~~~~~~
>    lib/test_vmalloc.c: In function 'test_func':
> >> lib/test_vmalloc.c:460:19: error: passing argument 1 of 'synchronize_srcu' from incompatible pointer type [-Werror=incompatible-pointer-types]
>      synchronize_srcu(&prepare_for_test_srcu);
>                       ^~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/srcu.h:59,
>                     from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcutiny.h:55:43: note: expected 'struct srcu_struct *' but argument is of type 'struct srcu_struct *'
>     void synchronize_srcu(struct srcu_struct *ssp);
>                           ~~~~~~~~~~~~~~~~~~~~^~~
>    lib/test_vmalloc.c: In function 'do_concurrent_test':
> >> lib/test_vmalloc.c:538:23: error: passing argument 1 of 'srcu_read_lock' from incompatible pointer type [-Werror=incompatible-pointer-types]
>      idx = srcu_read_lock(&prepare_for_test_srcu);
>                           ^~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcu.h:247:54: note: expected 'struct srcu_struct *' but argument is of type 'struct srcu_struct *'
>     static inline int srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp)
>                                      ~~~~~~~~~~~~~~~~~~~~^~~
>    lib/test_vmalloc.c:555:19: error: passing argument 1 of 'srcu_read_unlock' from incompatible pointer type [-Werror=incompatible-pointer-types]
>      srcu_read_unlock(&prepare_for_test_srcu, idx);
>                       ^~~~~~~~~~~~~~~~~~~~~~
>    In file included from include/linux/notifier.h:16,
>                     from include/linux/memory_hotplug.h:7,
>                     from include/linux/mmzone.h:1494,
>                     from include/linux/gfp.h:7,
>                     from include/linux/umh.h:4,
>                     from include/linux/kmod.h:9,
>                     from include/linux/module.h:17,
>                     from lib/test_vmalloc.c:9:
>    include/linux/srcu.h:397:57: note: expected 'struct srcu_struct *' but argument is of type 'struct srcu_struct *'
>     static inline void srcu_read_unlock(struct srcu_struct *ssp, int idx)
>                                         ~~~~~~~~~~~~~~~~~~~~^~~
>    cc1: some warnings being treated as errors
> ..
>
>
> vim +69 include/linux/srcutree.h
>
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   65
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   66  /*
> 95433f7263011e Paul E. McKenney        2023-03-16   67   * Per-SRCU-domain structure, update-side data linked from srcu_struct.
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   68   */
> 95433f7263011e Paul E. McKenney        2023-03-16  @69  struct srcu_usage {
> 2ec303113d9789 Paul E. McKenney        2022-01-21   70          struct srcu_node *node;                 /* Combining tree. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   71          struct srcu_node *level[RCU_NUM_LVLS + 1];
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   72                                                  /* First node at each level. */
> 994f706872e6ce Paul E. McKenney        2022-01-24   73          int srcu_size_state;                    /* Small-to-big transition state. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   74          struct mutex srcu_cb_mutex;             /* Serialize CB preparation. */
> 994f706872e6ce Paul E. McKenney        2022-01-24   75          spinlock_t __private lock;              /* Protect counters and size state. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   76          struct mutex srcu_gp_mutex;             /* Serialize GP work. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   77          unsigned long srcu_gp_seq;              /* Grace-period seq #. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   78          unsigned long srcu_gp_seq_needed;       /* Latest gp_seq needed. */
> 1e9a038b7fe9a8 Paul E. McKenney        2017-04-24   79          unsigned long srcu_gp_seq_needed_exp;   /* Furthest future exp GP. */
> 282d8998e9979c Paul E. McKenney        2022-03-08   80          unsigned long srcu_gp_start;            /* Last GP start timestamp (jiffies) */
> 22607d66bbc3e8 Paul E. McKenney        2017-04-25   81          unsigned long srcu_last_gp_end;         /* Last GP end timestamp (ns) */
> 9f2e91d94c9155 Paul E. McKenney        2022-01-27   82          unsigned long srcu_size_jiffies;        /* Current contention-measurement interval. */
> 9f2e91d94c9155 Paul E. McKenney        2022-01-27   83          unsigned long srcu_n_lock_retries;      /* Contention events in current interval. */
> 282d8998e9979c Paul E. McKenney        2022-03-08   84          unsigned long srcu_n_exp_nodelay;       /* # expedited no-delays in current GP phase. */
> 46470cf85d2b61 Paul E. McKenney        2022-01-27   85          bool sda_is_static;                     /* May ->sda be passed to free_percpu()? */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   86          unsigned long srcu_barrier_seq;         /* srcu_barrier seq #. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   87          struct mutex srcu_barrier_mutex;        /* Serialize barrier ops. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   88          struct completion srcu_barrier_completion;
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   89                                                  /* Awaken barrier rq at end. */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   90          atomic_t srcu_barrier_cpu_cnt;          /* # CPUs not yet posting a */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   91                                                  /*  callback for the barrier */
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   92                                                  /*  operation. */
> 282d8998e9979c Paul E. McKenney        2022-03-08   93          unsigned long reschedule_jiffies;
> 282d8998e9979c Paul E. McKenney        2022-03-08   94          unsigned long reschedule_count;
> d8be81735aa894 Paul E. McKenney        2017-03-25   95          struct delayed_work work;
> fd1b3f8e097b7f Paul E. McKenney        2023-03-17   96          struct srcu_struct *srcu_ssp;
> 95433f7263011e Paul E. McKenney        2023-03-16   97  };
> 95433f7263011e Paul E. McKenney        2023-03-16   98
> da915ad5cf25b5 Paul E. McKenney        2017-04-05   99  /*
> da915ad5cf25b5 Paul E. McKenney        2017-04-05  100   * Per-SRCU-domain structure, similar in function to rcu_state.
> da915ad5cf25b5 Paul E. McKenney        2017-04-05  101   */
> d8be81735aa894 Paul E. McKenney        2017-03-25 @102  struct srcu_struct {
> 795e7efec6ea7e Paul E. McKenney        2024-12-19  103          struct srcu_ctr __percpu *srcu_ctrp;
> da915ad5cf25b5 Paul E. McKenney        2017-04-05  104          struct srcu_data __percpu *sda;         /* Per-CPU srcu_data array. */
> d8be81735aa894 Paul E. McKenney        2017-03-25  105          struct lockdep_map dep_map;
> 95433f7263011e Paul E. McKenney        2023-03-16  106          struct srcu_usage *srcu_sup;            /* Update-side data. */
> d8be81735aa894 Paul E. McKenney        2017-03-25  107  };
> d8be81735aa894 Paul E. McKenney        2017-03-25  108
> e15a19306004b3 Pingfan Liu             2023-01-04  109  // Values for size state variable (->srcu_size_state).  Once the state
> e15a19306004b3 Pingfan Liu             2023-01-04  110  // has been set to SRCU_SIZE_ALLOC, the grace-period code advances through
> e15a19306004b3 Pingfan Liu             2023-01-04  111  // this state machine one step per grace period until the SRCU_SIZE_BIG state
> e15a19306004b3 Pingfan Liu             2023-01-04  112  // is reached.  Otherwise, the state machine remains in the SRCU_SIZE_SMALL
> e15a19306004b3 Pingfan Liu             2023-01-04  113  // state indefinitely.
> e15a19306004b3 Pingfan Liu             2023-01-04  114  #define SRCU_SIZE_SMALL         0       // No srcu_node combining tree, ->node == NULL
> e15a19306004b3 Pingfan Liu             2023-01-04  115  #define SRCU_SIZE_ALLOC         1       // An srcu_node tree is being allocated, initialized,
> e15a19306004b3 Pingfan Liu             2023-01-04  116                                          //  and then referenced by ->node.  It will not be used.
> e15a19306004b3 Pingfan Liu             2023-01-04  117  #define SRCU_SIZE_WAIT_BARRIER  2       // The srcu_node tree starts being used by everything
> e15a19306004b3 Pingfan Liu             2023-01-04  118                                          //  except call_srcu(), especially by srcu_barrier().
> e15a19306004b3 Pingfan Liu             2023-01-04  119                                          //  By the end of this state, all CPUs and threads
> e15a19306004b3 Pingfan Liu             2023-01-04  120                                          //  are aware of this tree's existence.
> e15a19306004b3 Pingfan Liu             2023-01-04  121  #define SRCU_SIZE_WAIT_CALL     3       // The srcu_node tree starts being used by call_srcu().
> e15a19306004b3 Pingfan Liu             2023-01-04  122                                          //  By the end of this state, all of the call_srcu()
> e15a19306004b3 Pingfan Liu             2023-01-04  123                                          //  invocations that were running on a non-boot CPU
> e15a19306004b3 Pingfan Liu             2023-01-04  124                                          //  and using the boot CPU's callback queue will have
> e15a19306004b3 Pingfan Liu             2023-01-04  125                                          //  completed.
> e15a19306004b3 Pingfan Liu             2023-01-04  126  #define SRCU_SIZE_WAIT_CBS1     4       // Don't trust the ->srcu_have_cbs[] grace-period
> e15a19306004b3 Pingfan Liu             2023-01-04  127  #define SRCU_SIZE_WAIT_CBS2     5       //  sequence elements or the ->srcu_data_have_cbs[]
> e15a19306004b3 Pingfan Liu             2023-01-04  128  #define SRCU_SIZE_WAIT_CBS3     6       //  CPU-bitmask elements until all four elements of
> e15a19306004b3 Pingfan Liu             2023-01-04  129  #define SRCU_SIZE_WAIT_CBS4     7       //  each array have been initialized.
> e15a19306004b3 Pingfan Liu             2023-01-04  130  #define SRCU_SIZE_BIG           8       // The srcu_node combining tree is fully initialized
> e15a19306004b3 Pingfan Liu             2023-01-04  131                                          //  and all aspects of it are being put to use.
> 994f706872e6ce Paul E. McKenney        2022-01-24  132
> da915ad5cf25b5 Paul E. McKenney        2017-04-05  133  /* Values for state variable (bottom bits of ->srcu_gp_seq). */
> d8be81735aa894 Paul E. McKenney        2017-03-25  134  #define SRCU_STATE_IDLE         0
> d8be81735aa894 Paul E. McKenney        2017-03-25  135  #define SRCU_STATE_SCAN1        1
> d8be81735aa894 Paul E. McKenney        2017-03-25  136  #define SRCU_STATE_SCAN2        2
> d8be81735aa894 Paul E. McKenney        2017-03-25  137
> 29bc83e4d90546 JP Kobryn               2024-07-15  138  /*
> 29bc83e4d90546 JP Kobryn               2024-07-15  139   * Values for initializing gp sequence fields. Higher values allow wrap arounds to
> 29bc83e4d90546 JP Kobryn               2024-07-15  140   * occur earlier.
> 29bc83e4d90546 JP Kobryn               2024-07-15  141   * The second value with state is useful in the case of static initialization of
> 29bc83e4d90546 JP Kobryn               2024-07-15  142   * srcu_usage where srcu_gp_seq_needed is expected to have some state value in its
> 29bc83e4d90546 JP Kobryn               2024-07-15  143   * lower bits (or else it will appear to be already initialized within
> 29bc83e4d90546 JP Kobryn               2024-07-15  144   * the call check_init_srcu_struct()).
> 29bc83e4d90546 JP Kobryn               2024-07-15  145   */
> 29bc83e4d90546 JP Kobryn               2024-07-15  146  #define SRCU_GP_SEQ_INITIAL_VAL ((0UL - 100UL) << RCU_SEQ_CTR_SHIFT)
> 29bc83e4d90546 JP Kobryn               2024-07-15  147  #define SRCU_GP_SEQ_INITIAL_VAL_WITH_STATE (SRCU_GP_SEQ_INITIAL_VAL - 1)
> 29bc83e4d90546 JP Kobryn               2024-07-15  148
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17 @149  #define __SRCU_USAGE_INIT(name)                                                                 \
> d8be81735aa894 Paul E. McKenney        2017-03-25  150  {                                                                                               \
> d633198088bd9e Paul E. McKenney        2017-10-10  151          .lock = __SPIN_LOCK_UNLOCKED(name.lock),                                                \
> 29bc83e4d90546 JP Kobryn               2024-07-15  152          .srcu_gp_seq = SRCU_GP_SEQ_INITIAL_VAL,                                                 \
> 29bc83e4d90546 JP Kobryn               2024-07-15  153          .srcu_gp_seq_needed = SRCU_GP_SEQ_INITIAL_VAL_WITH_STATE,                               \
> 29bc83e4d90546 JP Kobryn               2024-07-15  154          .srcu_gp_seq_needed_exp = SRCU_GP_SEQ_INITIAL_VAL,                                      \
> 4e6ea4ef56f942 Paul E. McKenney        2018-08-14  155          .work = __DELAYED_WORK_INITIALIZER(name.work, NULL, 0),                                 \
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17  156  }
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17  157
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17  158  #define __SRCU_STRUCT_INIT_COMMON(name, usage_name)                                             \
> 95433f7263011e Paul E. McKenney        2023-03-16  159          .srcu_sup = &usage_name,                                                                \
> f4d01a259374ef Paul E. McKenney        2023-03-17  160          __SRCU_DEP_MAP_INIT(name)
> f4d01a259374ef Paul E. McKenney        2023-03-17  161
> 95433f7263011e Paul E. McKenney        2023-03-16  162  #define __SRCU_STRUCT_INIT_MODULE(name, usage_name)                                             \
> f4d01a259374ef Paul E. McKenney        2023-03-17  163  {                                                                                               \
> 95433f7263011e Paul E. McKenney        2023-03-16  164          __SRCU_STRUCT_INIT_COMMON(name, usage_name)                                             \
> d8be81735aa894 Paul E. McKenney        2017-03-25  165  }
> d8be81735aa894 Paul E. McKenney        2017-03-25  166
> 95433f7263011e Paul E. McKenney        2023-03-16 @167  #define __SRCU_STRUCT_INIT(name, usage_name, pcpu_name)                                         \
> f4d01a259374ef Paul E. McKenney        2023-03-17  168  {                                                                                               \
> f4d01a259374ef Paul E. McKenney        2023-03-17  169          .sda = &pcpu_name,                                                                      \
> 795e7efec6ea7e Paul E. McKenney        2024-12-19  170          .srcu_ctrp = &pcpu_name.srcu_ctrs[0],                                                   \
> 95433f7263011e Paul E. McKenney        2023-03-16  171          __SRCU_STRUCT_INIT_COMMON(name, usage_name)                                             \
> d8be81735aa894 Paul E. McKenney        2017-03-25  172  }
> d8be81735aa894 Paul E. McKenney        2017-03-25  173
> d8be81735aa894 Paul E. McKenney        2017-03-25  174  /*
> d8be81735aa894 Paul E. McKenney        2017-03-25  175   * Define and initialize a srcu struct at build time.
> d8be81735aa894 Paul E. McKenney        2017-03-25  176   * Do -not- call init_srcu_struct() nor cleanup_srcu_struct() on it.
> d8be81735aa894 Paul E. McKenney        2017-03-25  177   *
> d8be81735aa894 Paul E. McKenney        2017-03-25  178   * Note that although DEFINE_STATIC_SRCU() hides the name from other
> d8be81735aa894 Paul E. McKenney        2017-03-25  179   * files, the per-CPU variable rules nevertheless require that the
> d8be81735aa894 Paul E. McKenney        2017-03-25  180   * chosen name be globally unique.  These rules also prohibit use of
> d8be81735aa894 Paul E. McKenney        2017-03-25  181   * DEFINE_STATIC_SRCU() within a function.  If these rules are too
> d8be81735aa894 Paul E. McKenney        2017-03-25  182   * restrictive, declare the srcu_struct manually.  For example, in
> d8be81735aa894 Paul E. McKenney        2017-03-25  183   * each file:
> d8be81735aa894 Paul E. McKenney        2017-03-25  184   *
> d8be81735aa894 Paul E. McKenney        2017-03-25  185   *      static struct srcu_struct my_srcu;
> d8be81735aa894 Paul E. McKenney        2017-03-25  186   *
> d8be81735aa894 Paul E. McKenney        2017-03-25  187   * Then, before the first use of each my_srcu, manually initialize it:
> d8be81735aa894 Paul E. McKenney        2017-03-25  188   *
> d8be81735aa894 Paul E. McKenney        2017-03-25  189   *      init_srcu_struct(&my_srcu);
> d8be81735aa894 Paul E. McKenney        2017-03-25  190   *
> d8be81735aa894 Paul E. McKenney        2017-03-25  191   * See include/linux/percpu-defs.h for the rules on per-CPU variables.
> d8be81735aa894 Paul E. McKenney        2017-03-25  192   */
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  193  #ifdef MODULE
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  194  # define __DEFINE_SRCU(name, is_static)                                                         \
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17  195          static struct srcu_usage name##_srcu_usage = __SRCU_USAGE_INIT(name##_srcu_usage);      \
> 95433f7263011e Paul E. McKenney        2023-03-16  196          is_static struct srcu_struct name = __SRCU_STRUCT_INIT_MODULE(name, name##_srcu_usage); \
> db8f1471c61336 Alexander Aring         2022-01-26  197          extern struct srcu_struct * const __srcu_struct_##name;                                 \
> 056b89e7e69974 Joel Fernandes (Google  2019-04-11  198)         struct srcu_struct * const __srcu_struct_##name                                         \
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  199                  __section("___srcu_struct_ptrs") = &name
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  200  #else
> d8be81735aa894 Paul E. McKenney        2017-03-25  201  # define __DEFINE_SRCU(name, is_static)                                                         \
> da915ad5cf25b5 Paul E. McKenney        2017-04-05  202          static DEFINE_PER_CPU(struct srcu_data, name##_srcu_data);                              \
> 03200b5ca3b4d4 Paul E. McKenney        2023-03-17  203          static struct srcu_usage name##_srcu_usage = __SRCU_USAGE_INIT(name##_srcu_usage);      \
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  204          is_static struct srcu_struct name =                                                     \
> 95433f7263011e Paul E. McKenney        2023-03-16  205                  __SRCU_STRUCT_INIT(name, name##_srcu_usage, name##_srcu_data)
> fe15b50cdeeebd Paul E. McKenney        2019-04-05  206  #endif
> d8be81735aa894 Paul E. McKenney        2017-03-25 @207  #define DEFINE_SRCU(name)               __DEFINE_SRCU(name, /* not static */)
> d8be81735aa894 Paul E. McKenney        2017-03-25 @208  #define DEFINE_STATIC_SRCU(name)        __DEFINE_SRCU(name, static)
> d8be81735aa894 Paul E. McKenney        2017-03-25  209
> 443971156cebfc Paul E. McKenney        2025-01-13 @210  int __srcu_read_lock(struct srcu_struct *ssp) __acquires(ssp);
> aacb5d91ab1bfb Paul E. McKenney        2018-10-28 @211  void synchronize_srcu_expedited(struct srcu_struct *ssp);
> aacb5d91ab1bfb Paul E. McKenney        2018-10-28 @212  void srcu_barrier(struct srcu_struct *ssp);
> aacb5d91ab1bfb Paul E. McKenney        2018-10-28 @213  void srcu_torture_stats_print(struct srcu_struct *ssp, char *tt, char *tf);
> d8be81735aa894 Paul E. McKenney        2017-03-25  214
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  215  // Converts a per-CPU pointer to an ->srcu_ctrs[] array element to that
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  216  // element's index.
> f4bde41dd19db5 Paul E. McKenney        2025-01-08 @217  static inline bool __srcu_ptr_to_ctr(struct srcu_struct *ssp, struct srcu_ctr __percpu *scpp)
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  218  {
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  219          return scpp - &ssp->sda->srcu_ctrs[0];
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  220  }
> f4bde41dd19db5 Paul E. McKenney        2025-01-08  221
> 4937096b579a36 Paul E. McKenney        2025-01-08  222  // Converts an integer to a per-CPU pointer to the corresponding
> 4937096b579a36 Paul E. McKenney        2025-01-08  223  // ->srcu_ctrs[] array element.
> 4937096b579a36 Paul E. McKenney        2025-01-08 @224  static inline struct srcu_ctr __percpu *__srcu_ctr_to_ptr(struct srcu_struct *ssp, int idx)
> 4937096b579a36 Paul E. McKenney        2025-01-08  225  {
> 4937096b579a36 Paul E. McKenney        2025-01-08  226          return &ssp->sda->srcu_ctrs[idx];
> 4937096b579a36 Paul E. McKenney        2025-01-08  227  }
> 4937096b579a36 Paul E. McKenney        2025-01-08  228
> c4020620528e4e Paul E. McKenney        2025-01-09  229  /*
> c4020620528e4e Paul E. McKenney        2025-01-09  230   * Counts the new reader in the appropriate per-CPU element of the
> c4020620528e4e Paul E. McKenney        2025-01-09  231   * srcu_struct.  Returns a pointer that must be passed to the matching
> c4020620528e4e Paul E. McKenney        2025-01-09  232   * srcu_read_unlock_fast().
> c4020620528e4e Paul E. McKenney        2025-01-09  233   *
> 3cec27453db49a Paul E. McKenney        2025-01-28  234   * Note that both this_cpu_inc() and atomic_long_inc() are RCU read-side
> 3cec27453db49a Paul E. McKenney        2025-01-28  235   * critical sections either because they disables interrupts, because they
> 3cec27453db49a Paul E. McKenney        2025-01-28  236   * are a single instruction, or because they are a read-modify-write atomic
> 3cec27453db49a Paul E. McKenney        2025-01-28  237   * operation, depending on the whims of the architecture.
> 3cec27453db49a Paul E. McKenney        2025-01-28  238   *
> 3cec27453db49a Paul E. McKenney        2025-01-28  239   * This means that __srcu_read_lock_fast() is not all that fast
> 3cec27453db49a Paul E. McKenney        2025-01-28  240   * on architectures that support NMIs but do not supply NMI-safe
> 3cec27453db49a Paul E. McKenney        2025-01-28  241   * implementations of this_cpu_inc().
> c4020620528e4e Paul E. McKenney        2025-01-09  242   */
> c4020620528e4e Paul E. McKenney        2025-01-09 @243  static inline struct srcu_ctr __percpu *__srcu_read_lock_fast(struct srcu_struct *ssp)
> c4020620528e4e Paul E. McKenney        2025-01-09  244  {
> c4020620528e4e Paul E. McKenney        2025-01-09  245          struct srcu_ctr __percpu *scp = READ_ONCE(ssp->srcu_ctrp);
> c4020620528e4e Paul E. McKenney        2025-01-09  246
> c4020620528e4e Paul E. McKenney        2025-01-09  247          RCU_LOCKDEP_WARN(!rcu_is_watching(), "RCU must be watching srcu_read_lock_fast().");
> 3cec27453db49a Paul E. McKenney        2025-01-28  248          if (!IS_ENABLED(CONFIG_NEED_SRCU_NMI_SAFE))
> c4020620528e4e Paul E. McKenney        2025-01-09  249                  this_cpu_inc(scp->srcu_locks.counter); /* Y */
> 3cec27453db49a Paul E. McKenney        2025-01-28  250          else
> 3cec27453db49a Paul E. McKenney        2025-01-28  251                  atomic_long_inc(raw_cpu_ptr(&scp->srcu_locks));  /* Z */
> c4020620528e4e Paul E. McKenney        2025-01-09  252          barrier(); /* Avoid leaking the critical section. */
> c4020620528e4e Paul E. McKenney        2025-01-09  253          return scp;
> c4020620528e4e Paul E. McKenney        2025-01-09  254  }
> c4020620528e4e Paul E. McKenney        2025-01-09  255
>
> --
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki



-- 
Uladzislau Rezki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ