* [PATCH v2 10/52] arm, kvm: Fix CPU hotplug callback registration
[not found] <20140214074750.22701.47330.stgit@srivatsabhat.in.ibm.com>
@ 2014-02-14 7:51 ` Srivatsa S. Bhat
2014-02-14 10:29 ` Paolo Bonzini
2014-02-14 7:55 ` [PATCH v2 29/52] x86, " Srivatsa S. Bhat
1 sibling, 1 reply; 4+ messages in thread
From: Srivatsa S. Bhat @ 2014-02-14 7:51 UTC (permalink / raw)
To: paulus, oleg, mingo, rusty, peterz, tglx, akpm
Cc: linux-arch, ego, walken, Russell King, kvm, Gleb Natapov, rjw,
linux-kernel, kvmarm, linux-arm-kernel, Srivatsa S. Bhat, tj,
Paolo Bonzini, paulmck, Ingo Molnar, Christoffer Dall
Subsystems that want to register CPU hotplug callbacks, as well as perform
initialization for the CPUs that are already online, often do it as shown
below:
get_online_cpus();
for_each_online_cpu(cpu)
init_cpu(cpu);
register_cpu_notifier(&foobar_cpu_notifier);
put_online_cpus();
This is wrong, since it is prone to ABBA deadlocks involving the
cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently
with CPU hotplug operations).
Instead, the correct and race-free way of performing the callback
registration is:
cpu_notifier_register_begin();
for_each_online_cpu(cpu)
init_cpu(cpu);
/* Note the use of the double underscored version of the API */
__register_cpu_notifier(&foobar_cpu_notifier);
cpu_notifier_register_done();
Fix the kvm code in arm by using this latter form of callback registration.
Cc: Christoffer Dall <christoffer.dall@linaro.org>
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: kvmarm@lists.cs.columbia.edu
Cc: kvm@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---
arch/arm/kvm/arm.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 1d8248e..147b917 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -1050,21 +1050,26 @@ int kvm_arch_init(void *opaque)
}
}
+ cpu_notifier_register_begin();
+
err = init_hyp_mode();
if (err)
goto out_err;
- err = register_cpu_notifier(&hyp_init_cpu_nb);
+ err = __register_cpu_notifier(&hyp_init_cpu_nb);
if (err) {
kvm_err("Cannot register HYP init CPU notifier (%d)\n", err);
goto out_err;
}
+ cpu_notifier_register_done();
+
hyp_cpu_pm_init();
kvm_coproc_table_init();
return 0;
out_err:
+ cpu_notifier_register_done();
return err;
}
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 29/52] x86, kvm: Fix CPU hotplug callback registration
[not found] <20140214074750.22701.47330.stgit@srivatsabhat.in.ibm.com>
2014-02-14 7:51 ` [PATCH v2 10/52] arm, kvm: Fix CPU hotplug callback registration Srivatsa S. Bhat
@ 2014-02-14 7:55 ` Srivatsa S. Bhat
2014-02-14 10:29 ` Paolo Bonzini
1 sibling, 1 reply; 4+ messages in thread
From: Srivatsa S. Bhat @ 2014-02-14 7:55 UTC (permalink / raw)
To: paulus, oleg, mingo, rusty, peterz, tglx, akpm
Cc: paulmck, tj, walken, ego, linux, rjw, linux-kernel, linux-arch,
srivatsa.bhat, Gleb Natapov, Paolo Bonzini, Thomas Gleixner,
Ingo Molnar, H. Peter Anvin, x86, kvm, Srivatsa S. Bhat
Subsystems that want to register CPU hotplug callbacks, as well as perform
initialization for the CPUs that are already online, often do it as shown
below:
get_online_cpus();
for_each_online_cpu(cpu)
init_cpu(cpu);
register_cpu_notifier(&foobar_cpu_notifier);
put_online_cpus();
This is wrong, since it is prone to ABBA deadlocks involving the
cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently
with CPU hotplug operations).
Instead, the correct and race-free way of performing the callback
registration is:
cpu_notifier_register_begin();
for_each_online_cpu(cpu)
init_cpu(cpu);
/* Note the use of the double underscored version of the API */
__register_cpu_notifier(&foobar_cpu_notifier);
cpu_notifier_register_done();
Fix the kvm code in x86 by using this latter form of callback registration.
Cc: Gleb Natapov <gleb@kernel.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: kvm@vger.kernel.org
Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---
arch/x86/kvm/x86.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 39c28f09..0166923 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -5365,7 +5365,8 @@ static void kvm_timer_init(void)
int cpu;
max_tsc_khz = tsc_khz;
- register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
+
+ cpu_notifier_register_begin();
if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {
#ifdef CONFIG_CPU_FREQ
struct cpufreq_policy policy;
@@ -5382,6 +5383,10 @@ static void kvm_timer_init(void)
pr_debug("kvm: max_tsc_khz = %ld\n", max_tsc_khz);
for_each_online_cpu(cpu)
smp_call_function_single(cpu, tsc_khz_changed, NULL, 1);
+
+ __register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
+ cpu_notifier_register_done();
+
}
static DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu);
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 10/52] arm, kvm: Fix CPU hotplug callback registration
2014-02-14 7:51 ` [PATCH v2 10/52] arm, kvm: Fix CPU hotplug callback registration Srivatsa S. Bhat
@ 2014-02-14 10:29 ` Paolo Bonzini
0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2014-02-14 10:29 UTC (permalink / raw)
To: Srivatsa S. Bhat, paulus, oleg, mingo, rusty, peterz, tglx, akpm
Cc: paulmck, tj, walken, ego, linux, rjw, linux-kernel, linux-arch,
Christoffer Dall, Gleb Natapov, kvmarm, kvm, linux-arm-kernel
Il 14/02/2014 08:51, Srivatsa S. Bhat ha scritto:
> Subsystems that want to register CPU hotplug callbacks, as well as perform
> initialization for the CPUs that are already online, often do it as shown
> below:
>
> get_online_cpus();
>
> for_each_online_cpu(cpu)
> init_cpu(cpu);
>
> register_cpu_notifier(&foobar_cpu_notifier);
>
> put_online_cpus();
>
> This is wrong, since it is prone to ABBA deadlocks involving the
> cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently
> with CPU hotplug operations).
>
> Instead, the correct and race-free way of performing the callback
> registration is:
>
> cpu_notifier_register_begin();
>
> for_each_online_cpu(cpu)
> init_cpu(cpu);
>
> /* Note the use of the double underscored version of the API */
> __register_cpu_notifier(&foobar_cpu_notifier);
>
> cpu_notifier_register_done();
>
>
> Fix the kvm code in arm by using this latter form of callback registration.
>
> Cc: Christoffer Dall <christoffer.dall@linaro.org>
> Cc: Gleb Natapov <gleb@kernel.org>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Russell King <linux@arm.linux.org.uk>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: kvmarm@lists.cs.columbia.edu
> Cc: kvm@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
> ---
>
> arch/arm/kvm/arm.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 1d8248e..147b917 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -1050,21 +1050,26 @@ int kvm_arch_init(void *opaque)
> }
> }
>
> + cpu_notifier_register_begin();
> +
> err = init_hyp_mode();
> if (err)
> goto out_err;
>
> - err = register_cpu_notifier(&hyp_init_cpu_nb);
> + err = __register_cpu_notifier(&hyp_init_cpu_nb);
> if (err) {
> kvm_err("Cannot register HYP init CPU notifier (%d)\n", err);
> goto out_err;
> }
>
> + cpu_notifier_register_done();
> +
> hyp_cpu_pm_init();
>
> kvm_coproc_table_init();
> return 0;
> out_err:
> + cpu_notifier_register_done();
> return err;
> }
>
>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 29/52] x86, kvm: Fix CPU hotplug callback registration
2014-02-14 7:55 ` [PATCH v2 29/52] x86, " Srivatsa S. Bhat
@ 2014-02-14 10:29 ` Paolo Bonzini
0 siblings, 0 replies; 4+ messages in thread
From: Paolo Bonzini @ 2014-02-14 10:29 UTC (permalink / raw)
To: Srivatsa S. Bhat, paulus, oleg, mingo, rusty, peterz, tglx, akpm
Cc: paulmck, tj, walken, ego, linux, rjw, linux-kernel, linux-arch,
Gleb Natapov, H. Peter Anvin, x86, kvm
Il 14/02/2014 08:55, Srivatsa S. Bhat ha scritto:
> Subsystems that want to register CPU hotplug callbacks, as well as perform
> initialization for the CPUs that are already online, often do it as shown
> below:
>
> get_online_cpus();
>
> for_each_online_cpu(cpu)
> init_cpu(cpu);
>
> register_cpu_notifier(&foobar_cpu_notifier);
>
> put_online_cpus();
>
> This is wrong, since it is prone to ABBA deadlocks involving the
> cpu_add_remove_lock and the cpu_hotplug.lock (when running concurrently
> with CPU hotplug operations).
>
> Instead, the correct and race-free way of performing the callback
> registration is:
>
> cpu_notifier_register_begin();
>
> for_each_online_cpu(cpu)
> init_cpu(cpu);
>
> /* Note the use of the double underscored version of the API */
> __register_cpu_notifier(&foobar_cpu_notifier);
>
> cpu_notifier_register_done();
>
>
> Fix the kvm code in x86 by using this latter form of callback registration.
>
> Cc: Gleb Natapov <gleb@kernel.org>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: "H. Peter Anvin" <hpa@zytor.com>
> Cc: x86@kernel.org
> Cc: kvm@vger.kernel.org
> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
> ---
>
> arch/x86/kvm/x86.c | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 39c28f09..0166923 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -5365,7 +5365,8 @@ static void kvm_timer_init(void)
> int cpu;
>
> max_tsc_khz = tsc_khz;
> - register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
> +
> + cpu_notifier_register_begin();
> if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) {
> #ifdef CONFIG_CPU_FREQ
> struct cpufreq_policy policy;
> @@ -5382,6 +5383,10 @@ static void kvm_timer_init(void)
> pr_debug("kvm: max_tsc_khz = %ld\n", max_tsc_khz);
> for_each_online_cpu(cpu)
> smp_call_function_single(cpu, tsc_khz_changed, NULL, 1);
> +
> + __register_hotcpu_notifier(&kvmclock_cpu_notifier_block);
> + cpu_notifier_register_done();
> +
> }
>
> static DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu);
>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-02-14 10:29 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20140214074750.22701.47330.stgit@srivatsabhat.in.ibm.com>
2014-02-14 7:51 ` [PATCH v2 10/52] arm, kvm: Fix CPU hotplug callback registration Srivatsa S. Bhat
2014-02-14 10:29 ` Paolo Bonzini
2014-02-14 7:55 ` [PATCH v2 29/52] x86, " Srivatsa S. Bhat
2014-02-14 10:29 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).