From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>,
Anna-Maria Gleixner <anna-maria@linutronix.de>,
LKML <linux-kernel@vger.kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@kernel.org>
Subject: Re: [patch 59/66] rcu: Convert rcutree to hotplug state machine
Date: Fri, 19 Aug 2016 14:14:57 -0700 [thread overview]
Message-ID: <20160819211457.GH3482@linux.vnet.ibm.com> (raw)
In-Reply-To: <20160819201200.warurd7e7t7uiggg@linutronix.de>
On Fri, Aug 19, 2016 at 10:12:00PM +0200, Sebastian Andrzej Siewior wrote:
> On 2016-08-18 11:30:13 [-0700], Paul E. McKenney wrote:
> > > > --- a/kernel/cpu.c
> > > > +++ b/kernel/cpu.c
> > > > @@ -882,6 +882,7 @@ void notify_cpu_starting(unsigned int cpu)
> > > > struct cpuhp_cpu_state *st = per_cpu_ptr(&cpuhp_state, cpu);
> > > > enum cpuhp_state target = min((int)st->target, CPUHP_AP_ONLINE);
> > > >
> > > > + rcu_cpu_starting(cpu); /* All CPU_STARTING notifiers can use RCU. */
> > > > while (st->state < target) {
> > > > struct cpuhp_step *step;
> > >
> > > What happens if something post CPUHP_AP_ONLINE fails and we do a
> > > rollback to 0? Do we need to revert / undo rcu_cpu_starting() doing?
> >
> > Yes, by calling rcu_cleanup_dying_idle_cpu().
>
> Thank you for that :)
No problem! ;-)
> > But please note that rcu_cpu_starting() is invoked from the CPU itself
> > during the onlining process. Is it really possible to fail beyond
> > that point?
>
> "sure". We enter here at CPUHP_BRINGUP_CPU. The next states until
> (approx) CPUHP_AP_ONLINE are currently defined as "can't fail". As you
> see in notify_cpu_starting() the return code of cpuhp_invoke_callback()
> isn't checked and there is no rollback.
> Later, CPUHP_AP_SMPBOOT_THREADS could fail (not in current but from here
> on we no longer the return code). At this point we would return to where
> we started (CPUHP_OFFLINE is most cases). During the rollback we get to
> rcu_cleanup_dying_idle_cpu() via rcu_report_dead() so that is fine.
OK, so any later failure looks to RCU like the CPU came online, then
immediately went offline. Works for me!
> > > > diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
> > > > index 3121242b8579..5e7c1d6a6108 100644
> > > > --- a/kernel/rcu/tree.c
> > > > +++ b/kernel/rcu/tree.c
> > > > @@ -3793,8 +3793,6 @@ rcu_init_percpu_data(int cpu, struct rcu_state *rsp)
> > > > rnp = rdp->mynode;
> > > > mask = rdp->grpmask;
> > > > raw_spin_lock_rcu_node(rnp); /* irqs already disabled. */
> > > > - rnp->qsmaskinitnext |= mask;
> > > > - rnp->expmaskinitnext |= mask;
> > > > if (!rdp->beenonline)
> > > > WRITE_ONCE(rsp->ncpus, READ_ONCE(rsp->ncpus) + 1);
> > > > rdp->beenonline = true; /* We have now been online. */
> > > > @@ -4211,8 +4235,10 @@ void __init rcu_init(void)
> > > > */
> > > > cpu_notifier(rcu_cpu_notify, 0);
> > > > pm_notifier(rcu_pm_notify, 0);
> > > > - for_each_online_cpu(cpu)
> > > > + for_each_online_cpu(cpu) {
> > > > rcu_cpu_notify(NULL, CPU_UP_PREPARE, (void *)(long)cpu);
> > > > + rcu_cpu_starting(cpu);
> > > > + }
> > >
> > > and looking at this from x86-64 then at this point I have CPU0 online
> > > and all other are down (or not yet up). So this is invoked for one CPU
> > > only. And later via hotplug callbacks for the other CPUs.
> >
> > Yes, that is the current situation. The reason for the loop is in
> > case someone clever decides to online other CPUs before RCU initializes
> > itself. No idea how anyone would make that sort of thing work, but I
> > have learned not to underestimate the creativity of the fast-boot guys.
>
> doubt this would work. start_kernel() is invoked from the boot CPU.
> Other CPUs are usually down because the scheduler wasn't up yet (so they
> can't idle in their idle thread nor could they be marked "online" in the
> CPU mask). Later (rest_init() -> kernel_init() ->
> kernel_init_freeable()) there is smp_init() which boots the additional
> CPUs.
Just as there is currently an early boot implementation of printk(),
some crazy person might well create an early boot implementation of the
scheduler that had fixed per-CPU tasks for which blocking is forbidden.
I understand that this is crazy, but much else has been considered crazy
not long before inclusion. PREEMPT_RT, for but one example. ;-)
> > And please do not invoke rcu_cpu_starting() before rcu_init(), at least
> > not without some careful inspection and likely reworking of rcu_init()
> > and the things that it calls.
>
> I did not intend to. I was thinking about moving it to
> CPUHP_AP_RCUTREE_DYING but since the teardown method does not match it
> makes no sense.
Whew!!! ;-)
> Thank you for clarifying the counterpart of rcu_cpu_starting().
Again, no problem!
Thanx, Paul
next prev parent reply other threads:[~2016-08-19 21:14 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-11 12:28 [patch 00/66] cpuhotplug: Convert all priority notifiers to the state machine Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 01/66] x86/vdso: Convert to hotplug " Anna-Maria Gleixner
2016-07-11 18:50 ` Andy Lutomirski
2016-07-11 12:28 ` [patch 02/66] irqchip/gic: " Anna-Maria Gleixner
2016-07-11 14:34 ` Ingo Molnar
2016-07-11 14:46 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 03/66] irqchip/gicv3: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 04/66] irqchip/hip04: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 05/66] irqchip/armada-370-xp: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 06/66] irqchip/bcm2836: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 07/66] ARM: mvebu: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 08/66] perf: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 09/66] perf/x86: Convert the core to the " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 10/66] perf/x86/intel/uncore: Convert to " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 11/66] perf/x86/amd/uncore: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 12/66] perf/x86/amd/ibs: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 14/66] perf/x86/intel/cqm: Convert Intel CQM " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 13/66] perf/x86/intel/rapl: Convert " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 15/66] perf/x86/intel/cstate: Convert Intel CSTATE " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 16/66] blackfin: perf: Convert hotplug notifier to " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 17/66] powerpc: perf: Convert book3s notifier to state machine callbacks Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 18/66] s390: perf: Convert the hotplug notifier to state machine callbacks (Counter) Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 20/66] sh: perf: Convert the hotplug notifiers to state machine callbacks Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 19/66] s390: perf: Convert the hotplug notifier to state machine callbacks (Sampling) Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 21/66] bus: arm-cci: convert to hotplug statemachine Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 22/66] bus: arm-ccn: " Anna-Maria Gleixner
2016-07-12 10:05 ` Pawel Moll
2016-07-12 11:16 ` Pawel Moll
2016-07-12 11:21 ` Sebastian Andrzej Siewior
2016-07-11 12:28 ` [patch 23/66] xtensa: perf: Convert the hotplug notifier to state machine callbacks Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 25/66] perf/x86/amd/power: Convert the hotplug notifier to state machine Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 24/66] perf/x86/amd/power: Change hotplug notifier to a symmetric structure Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 27/66] workqueue: Convert to state machine callbacks Anna-Maria Gleixner
2016-07-11 14:38 ` Ingo Molnar
2016-07-11 14:52 ` Anna-Maria Gleixner
2016-07-12 14:39 ` Tejun Heo
2016-07-11 12:28 ` [patch 26/66] perf: Remove perf cpu notifier code Anna-Maria Gleixner
2016-07-11 14:36 ` Ingo Molnar
2016-07-11 14:50 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 28/66] x86/hpet: Convert to hotplug state machine Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 29/66] powerpc: numa: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 30/66] KVM: x86: Remove superfluous SMP function call Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 31/66] x86/kvm/kvmclock: Convert to hotplug state machine Anna-Maria Gleixner
2016-07-11 14:11 ` Anna-Maria Gleixner
2016-07-11 14:41 ` Paolo Bonzini
2016-07-11 12:28 ` [patch 32/66] x86/apb_timer: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 33/66] arm: Convert VFP hotplug notifiers to " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 34/66] arm: perf: Convert to hotplug " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 36/66] ACPI/processor: avoid STARTING/DYING actions in a more logical way Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 35/66] virt: Convert kvm hotplug to state machine Anna-Maria Gleixner
2016-07-11 14:41 ` Paolo Bonzini
2016-07-11 12:28 ` [patch 37/66] clocksource/arm_arch_timer: Convert to hotplug " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 38/66] clocksource/arm_global_timer: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 40/66] clocksource/exynos_mct: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 39/66] clocksource/dummy_timer: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 41/66] clocksource/metag: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 42/66] clocksource/qcom-timer: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 43/66] clocksource/armada-370-xp: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 44/66] clocksource/atlas7: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 45/66] clocksource/mips-gic: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 47/66] arm: kvm: vgic: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 46/66] leds: trigger: cpu: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 48/66] arm: kvm: arch_timer: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 49/66] metag: perf: " Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 50/66] arm: l2c: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 51/66] arm: twd: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:28 ` [patch 52/66] arm: xen: " Anna-Maria Gleixner
2016-07-11 12:28 ` Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 53/66] MIPS: Loongson-3: Convert oprofile " Anna-Maria Gleixner
2016-07-11 15:57 ` Ralf Baechle
2016-07-11 12:29 ` [patch 55/66] hwtracing: coresight-etm4x: Convert " Anna-Maria Gleixner
2016-07-11 12:29 ` Anna-Maria Gleixner
2016-07-12 15:21 ` Mathieu Poirier
2016-07-12 15:21 ` Mathieu Poirier
2016-07-11 12:29 ` [patch 54/66] hwtracing: coresight-etm3x: " Anna-Maria Gleixner
2016-07-11 12:29 ` Anna-Maria Gleixner
2016-07-12 15:19 ` Mathieu Poirier
2016-07-12 15:19 ` Mathieu Poirier
2016-07-11 12:29 ` [patch 56/66] arm64: armv8 deprecated: " Anna-Maria Gleixner
2016-07-11 12:29 ` Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 57/66] ARC/time: " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 58/66] x86/tboot: " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 59/66] rcu: Convert rcutree " Anna-Maria Gleixner
2016-07-11 18:38 ` Paul E. McKenney
2016-07-12 10:57 ` Anna-Maria Gleixner
2016-07-12 14:23 ` Paul E. McKenney
2016-08-18 17:35 ` Sebastian Andrzej Siewior
2016-08-18 18:30 ` Paul E. McKenney
2016-08-19 20:12 ` Sebastian Andrzej Siewior
2016-08-19 21:14 ` Paul E. McKenney [this message]
2016-07-11 12:29 ` [patch 61/66] timers: Convert " Anna-Maria Gleixner
[not found] ` <20160711122535.775201614-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
2016-07-25 14:56 ` Jon Hunter
2016-07-25 14:56 ` Jon Hunter
[not found] ` <7d37714e-b072-ee90-f14f-364f4fd01f0d-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-07-25 15:35 ` rcochran-hfZtesqFncYOwBW4kG4KsQ
2016-07-25 15:35 ` rcochran
[not found] ` <20160725153543.GB10939-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
2016-07-25 20:46 ` rcochran-hfZtesqFncYOwBW4kG4KsQ
2016-07-25 20:46 ` rcochran
[not found] ` <20160725204648.GA22830-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
2016-07-26 9:23 ` Jon Hunter
2016-07-26 9:23 ` Jon Hunter
2016-07-26 9:20 ` Jon Hunter
2016-07-26 9:20 ` Jon Hunter
2016-07-26 14:15 ` Thomas Gleixner
2016-07-26 18:20 ` Jon Hunter
2016-07-26 18:20 ` Jon Hunter
[not found] ` <0b5a7bb5-6670-606b-e33d-63cd8b0fcedd-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2016-07-26 14:40 ` rcochran-hfZtesqFncYOwBW4kG4KsQ
2016-07-26 14:40 ` rcochran
2016-07-26 18:22 ` Jon Hunter
2016-07-26 18:22 ` Jon Hunter
2016-07-26 15:42 ` rcochran-hfZtesqFncYOwBW4kG4KsQ
2016-07-26 15:42 ` rcochran
[not found] ` <20160726154227.GC23707-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>
2016-07-26 18:16 ` Jon Hunter
2016-07-26 18:16 ` Jon Hunter
2016-07-11 12:29 ` [patch 60/66] hrtimer: " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 62/66] profile: " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 64/66] smp: Convert core " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 63/66] x86/x2apic: Convert to CPU " Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 66/66] cpuhotplug: Remove CPU_STARTING and CPU_DYING notifier Anna-Maria Gleixner
2016-07-11 12:29 ` [patch 65/66] KVM: arm/arm64: vgic-new: Convert to hotplug state machine Anna-Maria Gleixner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160819211457.GH3482@linux.vnet.ibm.com \
--to=paulmck@linux.vnet.ibm.com \
--cc=anna-maria@linutronix.de \
--cc=bigeasy@linutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=sebastian@breakpoint.cc \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.