CC: [email protected] CC: [email protected] CC: [email protected] TO: "Paul E. McKenney" <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git dev.2021.12.09b head: 0f1825f9df5a83cfeca5f1ecce96633223bf78d2 commit: ca34220fecf856ef7521c912a8812f2c1ea53ab3 [35/37] rcu: Rework rcu_barrier() and callback-migration logic :::::: branch date: 2 days ago :::::: commit date: 2 days ago config: x86_64-randconfig-c007-20211214 (https://download.01.org/0day-ci/archive/20211217/[email protected]/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project b6a2ddb6c8ac29412b1361810972e15221fa021c) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git/commit/?id=ca34220fecf856ef7521c912a8812f2c1ea53ab3 git remote add paulmck-rcu https://git.kernel.org/pub/scm/linux/kernel/git/paulmck/linux-rcu.git git fetch --no-tags paulmck-rcu dev.2021.12.09b git checkout ca34220fecf856ef7521c912a8812f2c1ea53ab3 # save the config file to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) kernel/bpf/cgroup.c:535:54: note: Passing null pointer value via 4th parameter 'link' ret = __cgroup_bpf_attach(cgrp, prog, replace_prog, link, type, flags); ^~~~ kernel/bpf/cgroup.c:535:8: note: Calling '__cgroup_bpf_attach' ret = __cgroup_bpf_attach(cgrp, prog, replace_prog, link, type, flags); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:447:8: note: Assuming the condition is false if (((flags & BPF_F_ALLOW_OVERRIDE) && (flags & BPF_F_ALLOW_MULTI)) || ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:447:38: note: Left side of '&&' is false if (((flags & BPF_F_ALLOW_OVERRIDE) && (flags & BPF_F_ALLOW_MULTI)) || ^ kernel/bpf/cgroup.c:448:8: note: Assuming the condition is false ((flags & BPF_F_REPLACE) && !(flags & BPF_F_ALLOW_MULTI))) ^~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:448:31: note: Left side of '&&' is false ((flags & BPF_F_REPLACE) && !(flags & BPF_F_ALLOW_MULTI))) ^ kernel/bpf/cgroup.c:451:6: note: 'link' is null if (link && (prog || replace_prog)) ^~~~ kernel/bpf/cgroup.c:451:11: note: Left side of '&&' is false if (link && (prog || replace_prog)) ^ kernel/bpf/cgroup.c:454:2: note: Taking false branch if (!!replace_prog != !!(flags & BPF_F_REPLACE)) ^ kernel/bpf/cgroup.c:459:6: note: 'atype' is >= 0 if (atype < 0) ^~~~~ kernel/bpf/cgroup.c:459:2: note: Taking false branch if (atype < 0) ^ kernel/bpf/cgroup.c:464:6: note: Assuming the condition is false if (!hierarchy_allows_attach(cgrp, atype)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:464:2: note: Taking false branch if (!hierarchy_allows_attach(cgrp, atype)) ^ kernel/bpf/cgroup.c:467:6: note: Assuming the condition is false if (!list_empty(progs) && cgrp->bpf.flags[atype] != saved_flags) ^~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:467:25: note: Left side of '&&' is false if (!list_empty(progs) && cgrp->bpf.flags[atype] != saved_flags) ^ kernel/bpf/cgroup.c:474:6: note: Assuming the condition is false if (prog_list_length(progs) >= BPF_CGROUP_MAX_PROGS) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:474:2: note: Taking false branch if (prog_list_length(progs) >= BPF_CGROUP_MAX_PROGS) ^ kernel/bpf/cgroup.c:479:6: note: Calling 'IS_ERR' if (IS_ERR(pl)) ^~~~~~~~~~ include/linux/err.h:36:9: note: Assuming the condition is false return IS_ERR_VALUE((unsigned long)ptr); ^ include/linux/err.h:22:34: note: expanded from macro 'IS_ERR_VALUE' #define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO) ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/compiler.h:78:42: note: expanded from macro 'unlikely' # define unlikely(x) __builtin_expect(!!(x), 0) ^ include/linux/err.h:36:2: note: Returning zero, which participates in a condition later return IS_ERR_VALUE((unsigned long)ptr); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/bpf/cgroup.c:479:6: note: Returning from 'IS_ERR' if (IS_ERR(pl)) ^~~~~~~~~~ kernel/bpf/cgroup.c:479:2: note: Taking false branch if (IS_ERR(pl)) ^ kernel/bpf/cgroup.c:483:11: note: '?' condition is false prog ? : link->link.prog, cgrp)) ^ kernel/bpf/cgroup.c:483:20: note: Dereference of null pointer prog ? : link->link.prog, cgrp)) ^~~~~~~~~~~~~~~ Suppressed 1 warnings (1 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 1 warning generated. kernel/irq/matrix.c:289:25: warning: Value stored to 'end' during its initialization is never read [clang-analyzer-deadcode.DeadStores] unsigned int bit, cpu, end = m->alloc_end; ^~~ ~~~~~~~~~~~~ kernel/irq/matrix.c:289:25: note: Value stored to 'end' during its initialization is never read unsigned int bit, cpu, end = m->alloc_end; ^~~ ~~~~~~~~~~~~ 6 warnings generated. kernel/rcu/tree.c:2393:19: warning: Value stored to 'rnp' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct rcu_node *rnp = rdp->mynode; ^~~ ~~~~~~~~~~~ kernel/rcu/tree.c:2393:19: note: Value stored to 'rnp' during its initialization is never read struct rcu_node *rnp = rdp->mynode; ^~~ ~~~~~~~~~~~ kernel/rcu/tree.c:2458:19: warning: Value stored to 'rnp' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct rcu_node *rnp = rdp->mynode; /* Outgoing CPU's rdp & rnp. */ ^~~ ~~~~~~~~~~~ kernel/rcu/tree.c:2458:19: note: Value stored to 'rnp' during its initialization is never read struct rcu_node *rnp = rdp->mynode; /* Outgoing CPU's rdp & rnp. */ ^~~ ~~~~~~~~~~~ >> kernel/rcu/tree.c:4090:2: warning: Value stored to 'lseq' is never read >> [clang-analyzer-deadcode.DeadStores] lseq = rcu_state.barrier_sequence; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/rcu/tree.c:4090:2: note: Value stored to 'lseq' is never read lseq = rcu_state.barrier_sequence; ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ Suppressed 3 warnings (2 in non-user code, 1 with check filters). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 with check filters). 6 warnings generated. Suppressed 6 warnings (6 with check filters). 3 warnings generated. kernel/time/ntp.c:293:29: warning: The result of the left shift is undefined because the left operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult] return div64_long(offset64 << (NTP_SCALE_SHIFT - SHIFT_FLL), secs); ^ kernel/time/ntp.c:767:6: note: Assuming the condition is false if (txc->modes & ADJ_ADJTIME) { ^~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:767:2: note: Taking false branch if (txc->modes & ADJ_ADJTIME) { ^ kernel/time/ntp.c:781:7: note: Assuming field 'modes' is not equal to 0 if (txc->modes) { ^~~~~~~~~~ kernel/time/ntp.c:781:3: note: Taking true branch if (txc->modes) { ^ kernel/time/ntp.c:788:4: note: Calling 'process_adjtimex_modes' process_adjtimex_modes(txc, time_tai); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:712:6: note: Assuming the condition is false if (txc->modes & ADJ_STATUS) ^~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:712:2: note: Taking false branch if (txc->modes & ADJ_STATUS) ^ kernel/time/ntp.c:715:6: note: Assuming the condition is false if (txc->modes & ADJ_NANO) ^~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:715:2: note: Taking false branch if (txc->modes & ADJ_NANO) ^ kernel/time/ntp.c:718:6: note: Assuming the condition is false if (txc->modes & ADJ_MICRO) ^~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:718:2: note: Taking false branch if (txc->modes & ADJ_MICRO) ^ kernel/time/ntp.c:721:6: note: Assuming the condition is false if (txc->modes & ADJ_FREQUENCY) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:721:2: note: Taking false branch if (txc->modes & ADJ_FREQUENCY) { ^ kernel/time/ntp.c:729:6: note: Assuming the condition is false if (txc->modes & ADJ_MAXERROR) ^~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:729:2: note: Taking false branch if (txc->modes & ADJ_MAXERROR) ^ kernel/time/ntp.c:732:6: note: Assuming the condition is false if (txc->modes & ADJ_ESTERROR) ^~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:732:2: note: Taking false branch if (txc->modes & ADJ_ESTERROR) ^ kernel/time/ntp.c:735:6: note: Assuming the condition is false if (txc->modes & ADJ_TIMECONST) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:735:2: note: Taking false branch if (txc->modes & ADJ_TIMECONST) { ^ kernel/time/ntp.c:743:6: note: Assuming the condition is false if (txc->modes & ADJ_TAI && ^~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:743:27: note: Left side of '&&' is false if (txc->modes & ADJ_TAI && ^ kernel/time/ntp.c:747:6: note: Assuming the condition is true if (txc->modes & ADJ_OFFSET) ^~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:747:2: note: Taking true branch if (txc->modes & ADJ_OFFSET) ^ kernel/time/ntp.c:748:3: note: Calling 'ntp_update_offset' ntp_update_offset(txc->offset); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:302:6: note: Assuming the condition is false if (!(time_status & STA_PLL)) ^~~~~~~~~~~~~~~~~~~~~~~~ kernel/time/ntp.c:302:2: note: Taking false branch if (!(time_status & STA_PLL)) ^ kernel/time/ntp.c:305:6: note: Assuming the condition is false vim +/lseq +4090 kernel/rcu/tree.c ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4058 dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4059 /** dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4060 * rcu_barrier - Wait until all in-flight call_rcu() callbacks complete. dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4061 * dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4062 * Note that this primitive does not necessarily wait for an RCU grace period dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4063 * to complete. For example, if there are no RCU callbacks queued anywhere dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4064 * in the system, then rcu_barrier() is within its rights to return dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4065 * immediately, without waiting for anything, much less an RCU grace period. d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4066 */ dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4067 void rcu_barrier(void) d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4068 { 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4069 uintptr_t cpu; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4070 unsigned long flags; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4071 unsigned long gseq; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4072 unsigned long lseq; b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4073 struct rcu_data *rdp; ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4074 unsigned long s = rcu_seq_snap(&rcu_state.barrier_sequence); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4075 dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4076 rcu_barrier_trace(TPS("Begin"), -1, s); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4077 e74f4c4564455c9 kernel/rcutree.c Paul E. McKenney 2009-10-06 4078 /* Take mutex to serialize concurrent rcu_barrier() requests. */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4079 mutex_lock(&rcu_state.barrier_mutex); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4080 4f525a528b9e755 kernel/rcu/tree.c Paul E. McKenney 2015-06-26 4081 /* Did someone else do our work for us? */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4082 if (rcu_seq_done(&rcu_state.barrier_sequence, s)) { ae788da94567b1c kernel/rcu/tree.c Paul E. McKenney 2021-12-10 4083 rcu_barrier_trace(TPS("EarlyExit"), -1, rcu_state.barrier_sequence); cf3a9c4842b1e09 kernel/rcutree.c Paul E. McKenney 2012-05-29 4084 smp_mb(); /* caller's subsequent code after above check. */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4085 mutex_unlock(&rcu_state.barrier_mutex); cf3a9c4842b1e09 kernel/rcutree.c Paul E. McKenney 2012-05-29 4086 return; cf3a9c4842b1e09 kernel/rcutree.c Paul E. McKenney 2012-05-29 4087 } cf3a9c4842b1e09 kernel/rcutree.c Paul E. McKenney 2012-05-29 4088 4f525a528b9e755 kernel/rcu/tree.c Paul E. McKenney 2015-06-26 4089 /* Mark the start of the barrier operation. */ ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 @4090 lseq = rcu_state.barrier_sequence; ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4091 rcu_seq_start(&rcu_state.barrier_sequence); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4092 gseq = rcu_state.barrier_sequence; dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4093 rcu_barrier_trace(TPS("Inc1"), -1, rcu_state.barrier_sequence); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4094 d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4095 /* 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4096 * Initialize the count to two rather than to zero in order 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4097 * to avoid a too-soon return to zero in case of an immediate 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4098 * invocation of the just-enqueued callback (or preemption of 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4099 * this task). Exclude CPU-hotplug operations to ensure that no 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4100 * offline non-offloaded CPU has callbacks queued. d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4101 */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4102 init_completion(&rcu_state.barrier_completion); 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4103 atomic_set(&rcu_state.barrier_cpu_count, 2); d3dd95a8853f1d5 kernel/rcu/tree.c Sebastian Andrzej Siewior 2021-08-03 4104 cpus_read_lock(); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4105 b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4106 /* 1331e7a1bbe1f11 kernel/rcutree.c Paul E. McKenney 2012-08-02 4107 * Force each CPU with callbacks to register a new callback. 1331e7a1bbe1f11 kernel/rcutree.c Paul E. McKenney 2012-08-02 4108 * When that callback is invoked, we will know that all of the 1331e7a1bbe1f11 kernel/rcutree.c Paul E. McKenney 2012-08-02 4109 * corresponding CPU's preceding callbacks have been invoked. b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4110 */ 3fbfbf7a3b66ec4 kernel/rcutree.c Paul E. McKenney 2012-08-19 4111 for_each_possible_cpu(cpu) { da1df50d16171f4 kernel/rcu/tree.c Paul E. McKenney 2018-07-03 4112 rdp = per_cpu_ptr(&rcu_data, cpu); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4113 retry: ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4114 if (READ_ONCE(rdp->barrier_seq_snap) == gseq) ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4115 continue; ae788da94567b1c kernel/rcu/tree.c Paul E. McKenney 2021-12-10 4116 if (!rcu_segcblist_n_cbs(&rdp->cblist)) { ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4117 raw_spin_lock_irqsave(&rdp->barrier_lock, flags); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4118 WRITE_ONCE(rdp->barrier_seq_snap, gseq); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4119 raw_spin_unlock_irqrestore(&rdp->barrier_lock, flags); ae788da94567b1c kernel/rcu/tree.c Paul E. McKenney 2021-12-10 4120 rcu_barrier_trace(TPS("NQ"), cpu, rcu_state.barrier_sequence); ce5215c1342c6c8 kernel/rcu/tree.c Paul E. McKenney 2019-04-12 4121 continue; ae788da94567b1c kernel/rcu/tree.c Paul E. McKenney 2021-12-10 4122 } ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4123 if (rcu_rdp_cpu_online(rdp)) { ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4124 if (smp_call_function_single(cpu, rcu_barrier_handler, (void *)cpu, 1)) { ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4125 schedule_timeout_uninterruptible(1); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4126 goto retry; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4127 } ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4128 WARN_ON_ONCE(READ_ONCE(rdp->barrier_seq_snap) != gseq); ae788da94567b1c kernel/rcu/tree.c Paul E. McKenney 2021-12-10 4129 rcu_barrier_trace(TPS("OnlineQ"), cpu, rcu_state.barrier_sequence); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4130 continue; b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4131 } ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4132 if (!rcu_barrier_entrain_if_ofl(rdp)) { ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4133 schedule_timeout_uninterruptible(1); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4134 goto retry; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4135 } ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4136 WARN_ON_ONCE(READ_ONCE(rdp->barrier_seq_snap) != gseq); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4137 rcu_barrier_trace(TPS("OfflineNoCBQ"), cpu, rcu_state.barrier_sequence); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4138 } d3dd95a8853f1d5 kernel/rcu/tree.c Sebastian Andrzej Siewior 2021-08-03 4139 cpus_read_unlock(); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4140 b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4141 /* b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4142 * Now that we have an rcu_barrier_callback() callback on each b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4143 * CPU, and thus each counted, remove the initial count. b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4144 */ 127e29815b4b220 kernel/rcu/tree.c Paul E. McKenney 2020-02-11 4145 if (atomic_sub_and_test(2, &rcu_state.barrier_cpu_count)) ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4146 complete(&rcu_state.barrier_completion); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4147 b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4148 /* Wait for all rcu_barrier_callback() callbacks to be invoked. */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4149 wait_for_completion(&rcu_state.barrier_completion); b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4150 4f525a528b9e755 kernel/rcu/tree.c Paul E. McKenney 2015-06-26 4151 /* Mark the end of the barrier operation. */ dd46a7882c2c200 kernel/rcu/tree.c Paul E. McKenney 2018-07-10 4152 rcu_barrier_trace(TPS("Inc2"), -1, rcu_state.barrier_sequence); ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4153 rcu_seq_end(&rcu_state.barrier_sequence); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4154 gseq = rcu_state.barrier_sequence; ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4155 for_each_possible_cpu(cpu) { ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4156 rdp = per_cpu_ptr(&rcu_data, cpu); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4157 ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4158 WRITE_ONCE(rdp->barrier_seq_snap, gseq); ca34220fecf856e kernel/rcu/tree.c Paul E. McKenney 2021-12-14 4159 } 4f525a528b9e755 kernel/rcu/tree.c Paul E. McKenney 2015-06-26 4160 b1420f1c8bfc30e kernel/rcutree.c Paul E. McKenney 2012-03-01 4161 /* Other rcu_barrier() invocations can now safely proceed. */ ec9f5835f74cba5 kernel/rcu/tree.c Paul E. McKenney 2018-07-05 4162 mutex_unlock(&rcu_state.barrier_mutex); d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4163 } 45975c7d21a1c0a kernel/rcu/tree.c Paul E. McKenney 2018-07-02 4164 EXPORT_SYMBOL_GPL(rcu_barrier); d0ec774cb2599c8 kernel/rcutree.c Paul E. McKenney 2009-10-06 4165 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
