Message ID | 20220822021520.6996-7-kernelfans@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > In order to support parallel, rcu_state.n_online_cpus should be > atomic_dec() > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> I have to ask... What testing have you subjected this patch to? Thanx, Paul > Cc: "Paul E. McKenney" <paulmck@kernel.org> > Cc: Frederic Weisbecker <frederic@kernel.org> > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > Cc: Josh Triplett <josh@joshtriplett.org> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > Cc: Joel Fernandes <joel@joelfernandes.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Steven Price <steven.price@arm.com> > Cc: "Peter Zijlstra > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > To: linux-kernel@vger.kernel.org > To: rcu@vger.kernel.org > --- > kernel/cpu.c | 1 + > kernel/rcu/tree.c | 3 ++- > 2 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/kernel/cpu.c b/kernel/cpu.c > index 1261c3f3be51..90debbe28e85 100644 > --- a/kernel/cpu.c > +++ b/kernel/cpu.c > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > .name = "RCU/tree:prepare", > .startup.single = rcutree_prepare_cpu, > .teardown.single = rcutree_dead_cpu, > + .support_kexec_parallel = true, > }, > /* > * On the tear-down path, timers_dead_cpu() must be invoked > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index 79aea7df4345..07d31e16c65e 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > return 0; > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > /* Adjust any no-longer-needed kthreads. */ > rcu_boost_kthread_setaffinity(rnp, -1); > // Stop-machine done, so allow nohz_full to disable tick. > -- > 2.31.1 >
On Sun, Aug 21, 2022 at 10:16 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > In order to support parallel, rcu_state.n_online_cpus should be > atomic_dec() What does Parallel mean? Is that some kexec terminology? Thanks, - Joel > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > Cc: "Paul E. McKenney" <paulmck@kernel.org> > Cc: Frederic Weisbecker <frederic@kernel.org> > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > Cc: Josh Triplett <josh@joshtriplett.org> > Cc: Steven Rostedt <rostedt@goodmis.org> > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > Cc: Joel Fernandes <joel@joelfernandes.org> > Cc: Thomas Gleixner <tglx@linutronix.de> > Cc: Steven Price <steven.price@arm.com> > Cc: "Peter Zijlstra > Cc: Mark Rutland <mark.rutland@arm.com> > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > To: linux-kernel@vger.kernel.org > To: rcu@vger.kernel.org > --- > kernel/cpu.c | 1 + > kernel/rcu/tree.c | 3 ++- > 2 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/kernel/cpu.c b/kernel/cpu.c > index 1261c3f3be51..90debbe28e85 100644 > --- a/kernel/cpu.c > +++ b/kernel/cpu.c > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > .name = "RCU/tree:prepare", > .startup.single = rcutree_prepare_cpu, > .teardown.single = rcutree_dead_cpu, > + .support_kexec_parallel = true, > }, > /* > * On the tear-down path, timers_dead_cpu() must be invoked > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > index 79aea7df4345..07d31e16c65e 100644 > --- a/kernel/rcu/tree.c > +++ b/kernel/rcu/tree.c > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > return 0; > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > /* Adjust any no-longer-needed kthreads. */ > rcu_boost_kthread_setaffinity(rnp, -1); > // Stop-machine done, so allow nohz_full to disable tick. > -- > 2.31.1 >
On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > In order to support parallel, rcu_state.n_online_cpus should be > > atomic_dec() > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > I have to ask... What testing have you subjected this patch to? > This patch subjects to [1]. The series aims to enable kexec-reboot in parallel on all cpu. As a result, the involved RCU part is expected to support parallel. [1]: https://lore.kernel.org/linux-arm-kernel/20220822021520.6996-3-kernelfans@gmail.com/T/#mf62352138d7b040fdb583ba66f8cd0ed1e145feb Thanks, Pingfan > Thanx, Paul > > > Cc: "Paul E. McKenney" <paulmck@kernel.org> > > Cc: Frederic Weisbecker <frederic@kernel.org> > > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > > Cc: Josh Triplett <josh@joshtriplett.org> > > Cc: Steven Rostedt <rostedt@goodmis.org> > > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > > Cc: Joel Fernandes <joel@joelfernandes.org> > > Cc: Thomas Gleixner <tglx@linutronix.de> > > Cc: Steven Price <steven.price@arm.com> > > Cc: "Peter Zijlstra > > Cc: Mark Rutland <mark.rutland@arm.com> > > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > > To: linux-kernel@vger.kernel.org > > To: rcu@vger.kernel.org > > --- > > kernel/cpu.c | 1 + > > kernel/rcu/tree.c | 3 ++- > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/kernel/cpu.c b/kernel/cpu.c > > index 1261c3f3be51..90debbe28e85 100644 > > --- a/kernel/cpu.c > > +++ b/kernel/cpu.c > > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > > .name = "RCU/tree:prepare", > > .startup.single = rcutree_prepare_cpu, > > .teardown.single = rcutree_dead_cpu, > > + .support_kexec_parallel = true, > > }, > > /* > > * On the tear-down path, timers_dead_cpu() must be invoked > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index 79aea7df4345..07d31e16c65e 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > > return 0; > > > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > > /* Adjust any no-longer-needed kthreads. */ > > rcu_boost_kthread_setaffinity(rnp, -1); > > // Stop-machine done, so allow nohz_full to disable tick. > > -- > > 2.31.1 > >
On Mon, Aug 22, 2022 at 02:08:38PM -0400, Joel Fernandes wrote: > On Sun, Aug 21, 2022 at 10:16 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > > > In order to support parallel, rcu_state.n_online_cpus should be > > atomic_dec() > > What does Parallel mean? Is that some kexec terminology? > 'Parallel' means concurrent. It is not a kexec terminology, instead, should be SMP. Thanks, Pingfan > Thanks, > > - Joel > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > Cc: "Paul E. McKenney" <paulmck@kernel.org> > > Cc: Frederic Weisbecker <frederic@kernel.org> > > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > > Cc: Josh Triplett <josh@joshtriplett.org> > > Cc: Steven Rostedt <rostedt@goodmis.org> > > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > > Cc: Joel Fernandes <joel@joelfernandes.org> > > Cc: Thomas Gleixner <tglx@linutronix.de> > > Cc: Steven Price <steven.price@arm.com> > > Cc: "Peter Zijlstra > > Cc: Mark Rutland <mark.rutland@arm.com> > > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > > To: linux-kernel@vger.kernel.org > > To: rcu@vger.kernel.org > > --- > > kernel/cpu.c | 1 + > > kernel/rcu/tree.c | 3 ++- > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/kernel/cpu.c b/kernel/cpu.c > > index 1261c3f3be51..90debbe28e85 100644 > > --- a/kernel/cpu.c > > +++ b/kernel/cpu.c > > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > > .name = "RCU/tree:prepare", > > .startup.single = rcutree_prepare_cpu, > > .teardown.single = rcutree_dead_cpu, > > + .support_kexec_parallel = true, > > }, > > /* > > * On the tear-down path, timers_dead_cpu() must be invoked > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > index 79aea7df4345..07d31e16c65e 100644 > > --- a/kernel/rcu/tree.c > > +++ b/kernel/rcu/tree.c > > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > > return 0; > > > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > > /* Adjust any no-longer-needed kthreads. */ > > rcu_boost_kthread_setaffinity(rnp, -1); > > // Stop-machine done, so allow nohz_full to disable tick. > > -- > > 2.31.1 > >
On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > In order to support parallel, rcu_state.n_online_cpus should be > > > atomic_dec() > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > I have to ask... What testing have you subjected this patch to? > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > parallel on all cpu. As a result, the involved RCU part is expected to > support parallel. I understand (and even sympathize with) the expectation. But results sometimes diverge from expectations. There have been implicit assumptions in RCU about only one CPU going offline at a time, and I am not sure that all of them have been addressed. Concurrent CPU onlining has been looked at recently here: https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be atomic, which is good. Did you look through the rest of RCU's CPU-offline code paths and related code paths? > [1]: https://lore.kernel.org/linux-arm-kernel/20220822021520.6996-3-kernelfans@gmail.com/T/#mf62352138d7b040fdb583ba66f8cd0ed1e145feb Perhaps I am more blind than usual today, but I am not seeing anything in this patch describing the testing. At this point, I am thinking in terms of making rcutorture test concurrent CPU offlining. Thoughts? Thanx, Paul > Thanks, > > Pingfan > > > > Thanx, Paul > > > > > Cc: "Paul E. McKenney" <paulmck@kernel.org> > > > Cc: Frederic Weisbecker <frederic@kernel.org> > > > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > > > Cc: Josh Triplett <josh@joshtriplett.org> > > > Cc: Steven Rostedt <rostedt@goodmis.org> > > > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > > > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > > > Cc: Joel Fernandes <joel@joelfernandes.org> > > > Cc: Thomas Gleixner <tglx@linutronix.de> > > > Cc: Steven Price <steven.price@arm.com> > > > Cc: "Peter Zijlstra > > > Cc: Mark Rutland <mark.rutland@arm.com> > > > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > > > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > > > To: linux-kernel@vger.kernel.org > > > To: rcu@vger.kernel.org > > > --- > > > kernel/cpu.c | 1 + > > > kernel/rcu/tree.c | 3 ++- > > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > > > diff --git a/kernel/cpu.c b/kernel/cpu.c > > > index 1261c3f3be51..90debbe28e85 100644 > > > --- a/kernel/cpu.c > > > +++ b/kernel/cpu.c > > > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > > > .name = "RCU/tree:prepare", > > > .startup.single = rcutree_prepare_cpu, > > > .teardown.single = rcutree_dead_cpu, > > > + .support_kexec_parallel = true, > > > }, > > > /* > > > * On the tear-down path, timers_dead_cpu() must be invoked > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > > index 79aea7df4345..07d31e16c65e 100644 > > > --- a/kernel/rcu/tree.c > > > +++ b/kernel/rcu/tree.c > > > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > > > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > > > return 0; > > > > > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > > > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > > > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > > > /* Adjust any no-longer-needed kthreads. */ > > > rcu_boost_kthread_setaffinity(rnp, -1); > > > // Stop-machine done, so allow nohz_full to disable tick. > > > -- > > > 2.31.1 > > >
On Mon, Aug 22, 2022 at 9:56 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > On Mon, Aug 22, 2022 at 02:08:38PM -0400, Joel Fernandes wrote: > > On Sun, Aug 21, 2022 at 10:16 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > atomic_dec() > > > > What does Parallel mean? Is that some kexec terminology? > > > > 'Parallel' means concurrent. It is not a kexec terminology, instead, > should be SMP. Ah ok! Makes sense. Apologies to be the word-police here, but you probably could reword it to "In order to support parallel offlining" or some such. - Joel > > Thanks, > > Pingfan > > > > Thanks, > > > > - Joel > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > Cc: "Paul E. McKenney" <paulmck@kernel.org> > > > Cc: Frederic Weisbecker <frederic@kernel.org> > > > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > > > Cc: Josh Triplett <josh@joshtriplett.org> > > > Cc: Steven Rostedt <rostedt@goodmis.org> > > > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > > > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > > > Cc: Joel Fernandes <joel@joelfernandes.org> > > > Cc: Thomas Gleixner <tglx@linutronix.de> > > > Cc: Steven Price <steven.price@arm.com> > > > Cc: "Peter Zijlstra > > > Cc: Mark Rutland <mark.rutland@arm.com> > > > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > > > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > > > To: linux-kernel@vger.kernel.org > > > To: rcu@vger.kernel.org > > > --- > > > kernel/cpu.c | 1 + > > > kernel/rcu/tree.c | 3 ++- > > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > > > diff --git a/kernel/cpu.c b/kernel/cpu.c > > > index 1261c3f3be51..90debbe28e85 100644 > > > --- a/kernel/cpu.c > > > +++ b/kernel/cpu.c > > > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > > > .name = "RCU/tree:prepare", > > > .startup.single = rcutree_prepare_cpu, > > > .teardown.single = rcutree_dead_cpu, > > > + .support_kexec_parallel = true, > > > }, > > > /* > > > * On the tear-down path, timers_dead_cpu() must be invoked > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > > index 79aea7df4345..07d31e16c65e 100644 > > > --- a/kernel/rcu/tree.c > > > +++ b/kernel/rcu/tree.c > > > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > > > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > > > return 0; > > > > > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > > > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > > > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > > > /* Adjust any no-longer-needed kthreads. */ > > > rcu_boost_kthread_setaffinity(rnp, -1); > > > // Stop-machine done, so allow nohz_full to disable tick. > > > -- > > > 2.31.1 > > >
On Tue, Aug 23, 2022 at 11:14 AM Joel Fernandes <joel@joelfernandes.org> wrote: > > On Mon, Aug 22, 2022 at 9:56 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > > > On Mon, Aug 22, 2022 at 02:08:38PM -0400, Joel Fernandes wrote: > > > On Sun, Aug 21, 2022 at 10:16 PM Pingfan Liu <kernelfans@gmail.com> wrote: > > > > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > atomic_dec() > > > > > > What does Parallel mean? Is that some kexec terminology? > > > > > > > 'Parallel' means concurrent. It is not a kexec terminology, instead, > > should be SMP. > > Ah ok! Makes sense. Apologies to be the word-police here, but you > probably could reword it to "In order to support parallel offlining" > or some such. > Thanks for your advice. It is a good English lesson, which can give more productivity in the community. Thanks, Pingfan > - Joel > > > > > > > Thanks, > > > > Pingfan > > > > > > > Thanks, > > > > > > - Joel > > > > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > Cc: "Paul E. McKenney" <paulmck@kernel.org> > > > > Cc: Frederic Weisbecker <frederic@kernel.org> > > > > Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> > > > > Cc: Josh Triplett <josh@joshtriplett.org> > > > > Cc: Steven Rostedt <rostedt@goodmis.org> > > > > Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> > > > > Cc: Lai Jiangshan <jiangshanlai@gmail.com> > > > > Cc: Joel Fernandes <joel@joelfernandes.org> > > > > Cc: Thomas Gleixner <tglx@linutronix.de> > > > > Cc: Steven Price <steven.price@arm.com> > > > > Cc: "Peter Zijlstra > > > > Cc: Mark Rutland <mark.rutland@arm.com> > > > > Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > > > > Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> > > > > To: linux-kernel@vger.kernel.org > > > > To: rcu@vger.kernel.org > > > > --- > > > > kernel/cpu.c | 1 + > > > > kernel/rcu/tree.c | 3 ++- > > > > 2 files changed, 3 insertions(+), 1 deletion(-) > > > > > > > > diff --git a/kernel/cpu.c b/kernel/cpu.c > > > > index 1261c3f3be51..90debbe28e85 100644 > > > > --- a/kernel/cpu.c > > > > +++ b/kernel/cpu.c > > > > @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { > > > > .name = "RCU/tree:prepare", > > > > .startup.single = rcutree_prepare_cpu, > > > > .teardown.single = rcutree_dead_cpu, > > > > + .support_kexec_parallel = true, > > > > }, > > > > /* > > > > * On the tear-down path, timers_dead_cpu() must be invoked > > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > > > > index 79aea7df4345..07d31e16c65e 100644 > > > > --- a/kernel/rcu/tree.c > > > > +++ b/kernel/rcu/tree.c > > > > @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) > > > > if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) > > > > return 0; > > > > > > > > - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); > > > > + /* Hot remove path allows parallel, while Hot add races against remove on lock */ > > > > + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); > > > > /* Adjust any no-longer-needed kthreads. */ > > > > rcu_boost_kthread_setaffinity(rnp, -1); > > > > // Stop-machine done, so allow nohz_full to disable tick. > > > > -- > > > > 2.31.1 > > > >
On 8/22/22, Pingfan Liu <kernelfans@gmail.com> wrote: > On Mon, Aug 22, 2022 at 02:08:38PM -0400, Joel Fernandes wrote: >> On Sun, Aug 21, 2022 at 10:16 PM Pingfan Liu <kernelfans@gmail.com> >> wrote: >> > >> > In order to support parallel, rcu_state.n_online_cpus should be >> > atomic_dec() >> >> What does Parallel mean? Is that some kexec terminology? >> > > 'Parallel' means concurrent. It is not a kexec terminology, instead, > should be SMP. Only sort of. See section A.6 of Paul 's book: http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html Jason
On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > atomic_dec() > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > > > I have to ask... What testing have you subjected this patch to? > > > > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > > parallel on all cpu. As a result, the involved RCU part is expected to > > support parallel. > > I understand (and even sympathize with) the expectation. But results > sometimes diverge from expectations. There have been implicit assumptions > in RCU about only one CPU going offline at a time, and I am not sure > that all of them have been addressed. Concurrent CPU onlining has > been looked at recently here: > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > atomic, which is good. Did you look through the rest of RCU's CPU-offline > code paths and related code paths? > I went through those codes at a shallow level, especially at each cpuhp_step hook in the RCU system. But as you pointed out, there are implicit assumptions about only one CPU going offline at a time, I will chew the google doc which you share. Then I can come to a final result. > > [1]: https://lore.kernel.org/linux-arm-kernel/20220822021520.6996-3-kernelfans@gmail.com/T/#mf62352138d7b040fdb583ba66f8cd0ed1e145feb > > Perhaps I am more blind than usual today, but I am not seeing anything > in this patch describing the testing. At this point, I am thinking in > terms of making rcutorture test concurrent CPU offlining parallel > Yes, testing results are more convincing in this area. After making clear the implicit assumptions, I will write some code to bridge my code and rcutorture test. Since the series is a little different from parallel cpu offlining. It happens after all devices are torn down, and there is no way to rollback. > Thoughts? > Need a deeper dive into this field. Hope to bring out something soon. Thanks, Pingfan
On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > > On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > > atomic_dec() > > > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > > > > > I have to ask... What testing have you subjected this patch to? > > > > > > > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > > > parallel on all cpu. As a result, the involved RCU part is expected to > > > support parallel. > > > > I understand (and even sympathize with) the expectation. But results > > sometimes diverge from expectations. There have been implicit assumptions > > in RCU about only one CPU going offline at a time, and I am not sure > > that all of them have been addressed. Concurrent CPU onlining has > > been looked at recently here: > > > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > > You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > atomic, which is good. Did you look through the rest of RCU's CPU-offline > > code paths and related code paths? > > I went through those codes at a shallow level, especially at each > cpuhp_step hook in the RCU system. And that is fine, at least as a first step. > But as you pointed out, there are implicit assumptions about only one > CPU going offline at a time, I will chew the google doc which you > share. Then I can come to a final result. Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, and rcu_boost_kthread_setaffinity() seems to need some help. As it stands, it appears that concurrent invocations of this function from the CPU-offline path will cause all but the last outgoing CPU's bit to be (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). This should not be difficult to fix, for example, by maintaining a separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing CPUs for that rcu_node structure. (Similar in structure to the ->qsmask field.) There are probably more where that one came from. ;-) > > > [1]: https://lore.kernel.org/linux-arm-kernel/20220822021520.6996-3-kernelfans@gmail.com/T/#mf62352138d7b040fdb583ba66f8cd0ed1e145feb > > > > Perhaps I am more blind than usual today, but I am not seeing anything > > in this patch describing the testing. At this point, I am thinking in > > terms of making rcutorture test concurrent CPU offlining parallel > > Yes, testing results are more convincing in this area. > > After making clear the implicit assumptions, I will write some code to > bridge my code and rcutorture test. Since the series is a little > different from parallel cpu offlining. It happens after all devices > are torn down, and there is no way to rollback. Very good, looking forward to seeing what you come up with! > > Thoughts? > > Need a deeper dive into this field. Hope to bring out something soon. Again, looking forward to seeing what you find! Thanx, Paul
On 8/24/2022 12:20 PM, Paul E. McKenney wrote: > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: >> On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: >>> >>> On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: >>>> On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: >>>>> On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: >>>>>> In order to support parallel, rcu_state.n_online_cpus should be >>>>>> atomic_dec() >>>>>> >>>>>> Signed-off-by: Pingfan Liu <kernelfans@gmail.com> >>>>> >>>>> I have to ask... What testing have you subjected this patch to? >>>>> >>>> >>>> This patch subjects to [1]. The series aims to enable kexec-reboot in >>>> parallel on all cpu. As a result, the involved RCU part is expected to >>>> support parallel. >>> >>> I understand (and even sympathize with) the expectation. But results >>> sometimes diverge from expectations. There have been implicit assumptions >>> in RCU about only one CPU going offline at a time, and I am not sure >>> that all of them have been addressed. Concurrent CPU onlining has >>> been looked at recently here: >>> >>> https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing >>> >>> You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be >>> atomic, which is good. Did you look through the rest of RCU's CPU-offline >>> code paths and related code paths? >> >> I went through those codes at a shallow level, especially at each >> cpuhp_step hook in the RCU system. > > And that is fine, at least as a first step. > >> But as you pointed out, there are implicit assumptions about only one >> CPU going offline at a time, I will chew the google doc which you >> share. Then I can come to a final result. > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > and rcu_boost_kthread_setaffinity() seems to need some help. As it > stands, it appears that concurrent invocations of this function from the > CPU-offline path will cause all but the last outgoing CPU's bit to be > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > This should not be difficult to fix, for example, by maintaining a > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > CPUs for that rcu_node structure. (Similar in structure to the > ->qsmask field.) > > There are probably more where that one came from. ;-) Should rcutree_dying_cpu() access to rnp->qsmask have a READ_ONCE() ? I was thinking grace period initialization or qs reporting paths racing with that. Its just tracing, still :) Thanks, - Joel
On Wed, Aug 24, 2022 at 01:26:01PM -0400, Joel Fernandes wrote: > > > On 8/24/2022 12:20 PM, Paul E. McKenney wrote: > > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > >> On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > >>> > >>> On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > >>>> On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > >>>>> On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > >>>>>> In order to support parallel, rcu_state.n_online_cpus should be > >>>>>> atomic_dec() > >>>>>> > >>>>>> Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > >>>>> > >>>>> I have to ask... What testing have you subjected this patch to? > >>>>> > >>>> > >>>> This patch subjects to [1]. The series aims to enable kexec-reboot in > >>>> parallel on all cpu. As a result, the involved RCU part is expected to > >>>> support parallel. > >>> > >>> I understand (and even sympathize with) the expectation. But results > >>> sometimes diverge from expectations. There have been implicit assumptions > >>> in RCU about only one CPU going offline at a time, and I am not sure > >>> that all of them have been addressed. Concurrent CPU onlining has > >>> been looked at recently here: > >>> > >>> https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > >>> > >>> You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > >>> atomic, which is good. Did you look through the rest of RCU's CPU-offline > >>> code paths and related code paths? > >> > >> I went through those codes at a shallow level, especially at each > >> cpuhp_step hook in the RCU system. > > > > And that is fine, at least as a first step. > > > >> But as you pointed out, there are implicit assumptions about only one > >> CPU going offline at a time, I will chew the google doc which you > >> share. Then I can come to a final result. > > > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > > and rcu_boost_kthread_setaffinity() seems to need some help. As it > > stands, it appears that concurrent invocations of this function from the > > CPU-offline path will cause all but the last outgoing CPU's bit to be > > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > > > This should not be difficult to fix, for example, by maintaining a > > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > > CPUs for that rcu_node structure. (Similar in structure to the > > ->qsmask field.) > > > > There are probably more where that one came from. ;-) > > Should rcutree_dying_cpu() access to rnp->qsmask have a READ_ONCE() ? I was > thinking grace period initialization or qs reporting paths racing with that. Its > just tracing, still :) Looks like it should be regardless of Pingfan's patches, given that the grace-period kthread might report a quiescent state concurrently. Good catch! Thanx, Paul
On Wed, Aug 24, 2022 at 3:21 PM Paul E. McKenney <paulmck@kernel.org> wrote: > > On Wed, Aug 24, 2022 at 01:26:01PM -0400, Joel Fernandes wrote: > > > > > > On 8/24/2022 12:20 PM, Paul E. McKenney wrote: > > > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > > >> On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > >>> > > >>> On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > >>>> On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > >>>>> On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > >>>>>> In order to support parallel, rcu_state.n_online_cpus should be > > >>>>>> atomic_dec() > > >>>>>> > > >>>>>> Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > >>>>> > > >>>>> I have to ask... What testing have you subjected this patch to? > > >>>>> > > >>>> > > >>>> This patch subjects to [1]. The series aims to enable kexec-reboot in > > >>>> parallel on all cpu. As a result, the involved RCU part is expected to > > >>>> support parallel. > > >>> > > >>> I understand (and even sympathize with) the expectation. But results > > >>> sometimes diverge from expectations. There have been implicit assumptions > > >>> in RCU about only one CPU going offline at a time, and I am not sure > > >>> that all of them have been addressed. Concurrent CPU onlining has > > >>> been looked at recently here: > > >>> > > >>> https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > >>> > > >>> You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > >>> atomic, which is good. Did you look through the rest of RCU's CPU-offline > > >>> code paths and related code paths? > > >> > > >> I went through those codes at a shallow level, especially at each > > >> cpuhp_step hook in the RCU system. > > > > > > And that is fine, at least as a first step. > > > > > >> But as you pointed out, there are implicit assumptions about only one > > >> CPU going offline at a time, I will chew the google doc which you > > >> share. Then I can come to a final result. > > > > > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > > > and rcu_boost_kthread_setaffinity() seems to need some help. As it > > > stands, it appears that concurrent invocations of this function from the > > > CPU-offline path will cause all but the last outgoing CPU's bit to be > > > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > > > > > This should not be difficult to fix, for example, by maintaining a > > > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > > > CPUs for that rcu_node structure. (Similar in structure to the > > > ->qsmask field.) > > > > > > There are probably more where that one came from. ;-) > > > > Should rcutree_dying_cpu() access to rnp->qsmask have a READ_ONCE() ? I was > > thinking grace period initialization or qs reporting paths racing with that. Its > > just tracing, still :) > > Looks like it should be regardless of Pingfan's patches, given that > the grace-period kthread might report a quiescent state concurrently. Thanks for confirming, I'll queue it into my next revision of the series. - Joel
On Wed, Aug 24, 2022 at 06:54:01PM -0400, Joel Fernandes wrote: > On Wed, Aug 24, 2022 at 3:21 PM Paul E. McKenney <paulmck@kernel.org> wrote: > > > > On Wed, Aug 24, 2022 at 01:26:01PM -0400, Joel Fernandes wrote: > > > > > > > > > On 8/24/2022 12:20 PM, Paul E. McKenney wrote: > > > > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > > > >> On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > >>> > > > >>> On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > > >>>> On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > >>>>> On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > >>>>>> In order to support parallel, rcu_state.n_online_cpus should be > > > >>>>>> atomic_dec() > > > >>>>>> > > > >>>>>> Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > >>>>> > > > >>>>> I have to ask... What testing have you subjected this patch to? > > > >>>>> > > > >>>> > > > >>>> This patch subjects to [1]. The series aims to enable kexec-reboot in > > > >>>> parallel on all cpu. As a result, the involved RCU part is expected to > > > >>>> support parallel. > > > >>> > > > >>> I understand (and even sympathize with) the expectation. But results > > > >>> sometimes diverge from expectations. There have been implicit assumptions > > > >>> in RCU about only one CPU going offline at a time, and I am not sure > > > >>> that all of them have been addressed. Concurrent CPU onlining has > > > >>> been looked at recently here: > > > >>> > > > >>> https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > >>> > > > >>> You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > > >>> atomic, which is good. Did you look through the rest of RCU's CPU-offline > > > >>> code paths and related code paths? > > > >> > > > >> I went through those codes at a shallow level, especially at each > > > >> cpuhp_step hook in the RCU system. > > > > > > > > And that is fine, at least as a first step. > > > > > > > >> But as you pointed out, there are implicit assumptions about only one > > > >> CPU going offline at a time, I will chew the google doc which you > > > >> share. Then I can come to a final result. > > > > > > > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > > > > and rcu_boost_kthread_setaffinity() seems to need some help. As it > > > > stands, it appears that concurrent invocations of this function from the > > > > CPU-offline path will cause all but the last outgoing CPU's bit to be > > > > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > > > > > > > This should not be difficult to fix, for example, by maintaining a > > > > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > > > > CPUs for that rcu_node structure. (Similar in structure to the > > > > ->qsmask field.) > > > > > > > > There are probably more where that one came from. ;-) > > > > > > Should rcutree_dying_cpu() access to rnp->qsmask have a READ_ONCE() ? I was > > > thinking grace period initialization or qs reporting paths racing with that. Its > > > just tracing, still :) > > > > Looks like it should be regardless of Pingfan's patches, given that > > the grace-period kthread might report a quiescent state concurrently. > > Thanks for confirming, I'll queue it into my next revision of the series. Sounds good! Thanx, Paul
On Wed, Aug 24, 2022 at 09:20:50AM -0700, Paul E. McKenney wrote: > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > > On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > > > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > > > atomic_dec() > > > > > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > > > > > > > I have to ask... What testing have you subjected this patch to? > > > > > > > > > > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > > > > parallel on all cpu. As a result, the involved RCU part is expected to > > > > support parallel. > > > > > > I understand (and even sympathize with) the expectation. But results > > > sometimes diverge from expectations. There have been implicit assumptions > > > in RCU about only one CPU going offline at a time, and I am not sure > > > that all of them have been addressed. Concurrent CPU onlining has > > > been looked at recently here: > > > > > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > > > > You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > > atomic, which is good. Did you look through the rest of RCU's CPU-offline > > > code paths and related code paths? > > > > I went through those codes at a shallow level, especially at each > > cpuhp_step hook in the RCU system. > > And that is fine, at least as a first step. > > > But as you pointed out, there are implicit assumptions about only one > > CPU going offline at a time, I will chew the google doc which you > > share. Then I can come to a final result. > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > and rcu_boost_kthread_setaffinity() seems to need some help. As it > stands, it appears that concurrent invocations of this function from the > CPU-offline path will cause all but the last outgoing CPU's bit to be > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > This should not be difficult to fix, for example, by maintaining a > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > CPUs for that rcu_node structure. (Similar in structure to the > ->qsmask field.) > > There are probably more where that one came from. ;-) And here is one more from this week's session. The calls to tick_dep_set() and tick_dep_clear() use atomic operations, but they operate on a global variable. This means that the first call to rcutree_offline_cpu() would enable the tick and the first call to rcutree_dead_cpu() would disable the tick. This might be OK, but it is at the very least bad practice. There needs to be a counter mediating these calls. For more detail, please see the Google document: https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing Thanx, Paul > > > > [1]: https://lore.kernel.org/linux-arm-kernel/20220822021520.6996-3-kernelfans@gmail.com/T/#mf62352138d7b040fdb583ba66f8cd0ed1e145feb > > > > > > Perhaps I am more blind than usual today, but I am not seeing anything > > > in this patch describing the testing. At this point, I am thinking in > > > terms of making rcutorture test concurrent CPU offlining parallel > > > > Yes, testing results are more convincing in this area. > > > > After making clear the implicit assumptions, I will write some code to > > bridge my code and rcutorture test. Since the series is a little > > different from parallel cpu offlining. It happens after all devices > > are torn down, and there is no way to rollback. > > Very good, looking forward to seeing what you come up with! > > > > Thoughts? > > > > Need a deeper dive into this field. Hope to bring out something soon. > > Again, looking forward to seeing what you find! > > Thanx, Paul
On Thu, Sep 1, 2022 at 12:15 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > On Wed, Aug 24, 2022 at 09:20:50AM -0700, Paul E. McKenney wrote: > > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > > > On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > > On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > > > > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > > > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > > > > atomic_dec() > > > > > > > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > > > > > > > > > I have to ask... What testing have you subjected this patch to? > > > > > > > > > > > > > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > > > > > parallel on all cpu. As a result, the involved RCU part is expected to > > > > > support parallel. > > > > > > > > I understand (and even sympathize with) the expectation. But results > > > > sometimes diverge from expectations. There have been implicit assumptions > > > > in RCU about only one CPU going offline at a time, and I am not sure > > > > that all of them have been addressed. Concurrent CPU onlining has > > > > been looked at recently here: > > > > > > > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > > > > > > You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > > > atomic, which is good. Did you look through the rest of RCU's CPU-offline > > > > code paths and related code paths? > > > > > > I went through those codes at a shallow level, especially at each > > > cpuhp_step hook in the RCU system. > > > > And that is fine, at least as a first step. > > > > > But as you pointed out, there are implicit assumptions about only one > > > CPU going offline at a time, I will chew the google doc which you > > > share. Then I can come to a final result. > > > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > > and rcu_boost_kthread_setaffinity() seems to need some help. As it > > stands, it appears that concurrent invocations of this function from the > > CPU-offline path will cause all but the last outgoing CPU's bit to be > > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > > > This should not be difficult to fix, for example, by maintaining a > > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > > CPUs for that rcu_node structure. (Similar in structure to the > > ->qsmask field.) > > Sorry to reply late, since I am interrupted by some other things. I have took a different way and posted a series ([PATCH 1/3] rcu: remove redundant cpu affinity setting during teardown) for that on https://lore.kernel.org/rcu/20220905033852.18988-1-kernelfans@gmail.com/T/#t Besides, for the integration of the concurrency cpu hot-removing into the rcu torture test, I begin to do it. > > There are probably more where that one came from. ;-) > > And here is one more from this week's session. > Thanks for the update. > The calls to tick_dep_set() and tick_dep_clear() use atomic operations, > but they operate on a global variable. This means that the first call > to rcutree_offline_cpu() would enable the tick and the first call to > rcutree_dead_cpu() would disable the tick. This might be OK, but it > is at the very least bad practice. There needs to be a counter > mediating these calls. > I will see what I can do here. > For more detail, please see the Google document: > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > Have read it and hope that both online and offline concurrency can come to true in near future. Thanks, Pingfan
On Mon, Sep 05, 2022 at 11:53:52AM +0800, Pingfan Liu wrote: > On Thu, Sep 1, 2022 at 12:15 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > > On Wed, Aug 24, 2022 at 09:20:50AM -0700, Paul E. McKenney wrote: > > > On Wed, Aug 24, 2022 at 09:53:11PM +0800, Pingfan Liu wrote: > > > > On Tue, Aug 23, 2022 at 11:01 AM Paul E. McKenney <paulmck@kernel.org> wrote: > > > > > On Tue, Aug 23, 2022 at 09:50:56AM +0800, Pingfan Liu wrote: > > > > > > On Sun, Aug 21, 2022 at 07:45:28PM -0700, Paul E. McKenney wrote: > > > > > > > On Mon, Aug 22, 2022 at 10:15:16AM +0800, Pingfan Liu wrote: > > > > > > > > In order to support parallel, rcu_state.n_online_cpus should be > > > > > > > > atomic_dec() > > > > > > > > > > > > > > > > Signed-off-by: Pingfan Liu <kernelfans@gmail.com> > > > > > > > > > > > > > > I have to ask... What testing have you subjected this patch to? > > > > > > > > > > > > > > > > > > > This patch subjects to [1]. The series aims to enable kexec-reboot in > > > > > > parallel on all cpu. As a result, the involved RCU part is expected to > > > > > > support parallel. > > > > > > > > > > I understand (and even sympathize with) the expectation. But results > > > > > sometimes diverge from expectations. There have been implicit assumptions > > > > > in RCU about only one CPU going offline at a time, and I am not sure > > > > > that all of them have been addressed. Concurrent CPU onlining has > > > > > been looked at recently here: > > > > > > > > > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > > > > > > > > You did us atomic_dec() to make rcu_state.n_online_cpus decrementing be > > > > > atomic, which is good. Did you look through the rest of RCU's CPU-offline > > > > > code paths and related code paths? > > > > > > > > I went through those codes at a shallow level, especially at each > > > > cpuhp_step hook in the RCU system. > > > > > > And that is fine, at least as a first step. > > > > > > > But as you pointed out, there are implicit assumptions about only one > > > > CPU going offline at a time, I will chew the google doc which you > > > > share. Then I can come to a final result. > > > > > > Boqun Feng, Neeraj Upadhyay, Uladzislau Rezki, and I took a quick look, > > > and rcu_boost_kthread_setaffinity() seems to need some help. As it > > > stands, it appears that concurrent invocations of this function from the > > > CPU-offline path will cause all but the last outgoing CPU's bit to be > > > (incorrectly) set in the cpumask_var_t passed to set_cpus_allowed_ptr(). > > > > > > This should not be difficult to fix, for example, by maintaining a > > > separate per-leaf-rcu_node-structure bitmask of the concurrently outgoing > > > CPUs for that rcu_node structure. (Similar in structure to the > > > ->qsmask field.) > > > > > Sorry to reply late, since I am interrupted by some other things. > I have took a different way and posted a series ([PATCH 1/3] rcu: > remove redundant cpu affinity setting during teardown) for that on > https://lore.kernel.org/rcu/20220905033852.18988-1-kernelfans@gmail.com/T/#t And I took patch #3, thank you! #1 allows the kthread to run on the outgoing CPU, which is to be avoided, and #2 depends on #1. > Besides, for the integration of the concurrency cpu hot-removing into > the rcu torture test, I begin to do it. Very good! I am looking forward to seeing what you come up with. > > > There are probably more where that one came from. ;-) > > > > And here is one more from this week's session. > > Thanks for the update. > > > The calls to tick_dep_set() and tick_dep_clear() use atomic operations, > > but they operate on a global variable. This means that the first call > > to rcutree_offline_cpu() would enable the tick and the first call to > > rcutree_dead_cpu() would disable the tick. This might be OK, but it > > is at the very least bad practice. There needs to be a counter > > mediating these calls. > > I will see what I can do here. > > > For more detail, please see the Google document: > > > > https://docs.google.com/document/d/1jymsaCPQ1PUDcfjIKm0UIbVdrJAaGX-6cXrmcfm0PRU/edit?usp=sharing > > > > Have read it and hope that both online and offline concurrency can > come to true in near future. Indeed, I suspect that a lot of people would like to see faster kexec! Thanx, Paul
diff --git a/kernel/cpu.c b/kernel/cpu.c index 1261c3f3be51..90debbe28e85 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -1872,6 +1872,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { .name = "RCU/tree:prepare", .startup.single = rcutree_prepare_cpu, .teardown.single = rcutree_dead_cpu, + .support_kexec_parallel = true, }, /* * On the tear-down path, timers_dead_cpu() must be invoked diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 79aea7df4345..07d31e16c65e 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -2168,7 +2168,8 @@ int rcutree_dead_cpu(unsigned int cpu) if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) return 0; - WRITE_ONCE(rcu_state.n_online_cpus, rcu_state.n_online_cpus - 1); + /* Hot remove path allows parallel, while Hot add races against remove on lock */ + atomic_dec((atomic_t *)&rcu_state.n_online_cpus); /* Adjust any no-longer-needed kthreads. */ rcu_boost_kthread_setaffinity(rnp, -1); // Stop-machine done, so allow nohz_full to disable tick.
In order to support parallel, rcu_state.n_online_cpus should be atomic_dec() Signed-off-by: Pingfan Liu <kernelfans@gmail.com> Cc: "Paul E. McKenney" <paulmck@kernel.org> Cc: Frederic Weisbecker <frederic@kernel.org> Cc: Neeraj Upadhyay <quic_neeraju@quicinc.com> Cc: Josh Triplett <josh@joshtriplett.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Cc: Lai Jiangshan <jiangshanlai@gmail.com> Cc: Joel Fernandes <joel@joelfernandes.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Steven Price <steven.price@arm.com> Cc: "Peter Zijlstra Cc: Mark Rutland <mark.rutland@arm.com> Cc: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Cc: "Jason A. Donenfeld" <Jason@zx2c4.com> To: linux-kernel@vger.kernel.org To: rcu@vger.kernel.org --- kernel/cpu.c | 1 + kernel/rcu/tree.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-)