public inbox for kvmarm@lists.cs.columbia.edu
 help / color / mirror / Atom feed
From: James Morse <james.morse@arm.com>
To: linux-arm-kernel@lists.infradead.org
Cc: devicetree@vger.kernel.org,
	Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
	Marc Zyngier <marc.zyngier@arm.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Rob Herring <robh+dt@kernel.org>, Loc Ho <lho@apm.com>,
	kvmarm@lists.cs.columbia.edu
Subject: [PATCH 15/13] firmware: arm_sdei: move the frozen flag under the spinlock
Date: Wed,  1 Nov 2017 15:59:41 +0000	[thread overview]
Message-ID: <20171101155941.19432-1-james.morse@arm.com> (raw)
In-Reply-To: <20171017174432.1684-1-james.morse@arm.com>

dpm_suspend() calls the freeze/thaw callbacks for hibernate before
disable_non_bootcpus() takes down secondaries.

This leads to a fun race where the freeze/thaw callbacks reset the
SDEI interface (as we may be restoring a kernel with a different
layout due to KASLR), then the cpu-hotplug callbacks come in to
save the current state, which has already been reset.

We solve this with a 'frozen' flag that stops the hotplug callback
from overwriting the saved values.

This patch moves the flag under the 'events' spinlock we take
in the hotplug callbacks, to avoid depending on cpu-hotplug's
mechanics to ensure the callback sees the correct value.

Reported-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: James Morse <james.morse@arm.com>
---
 drivers/firmware/arm_sdei.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c
index 14b6d170518c..0ae497975064 100644
--- a/drivers/firmware/arm_sdei.c
+++ b/drivers/firmware/arm_sdei.c
@@ -78,7 +78,10 @@ struct sdei_event {
 static LIST_HEAD(sdei_events);
 static DEFINE_SPINLOCK(sdei_events_lock);
 
-/* When frozen, cpu-hotplug notifiers shouldn't unregister/re-register events */
+/*
+ * When frozen, cpu-hotplug notifiers shouldn't unregister/re-register events.
+ * Protected by sdei_events_lock.
+ */
 static bool frozen;
 
 /* Private events are registered/enabled via IPI passing one of these */
@@ -704,13 +707,15 @@ static int sdei_cpuhp_down(unsigned int cpu)
 	struct sdei_event *event;
 	struct sdei_crosscall_args arg;
 
+
+	spin_lock(&sdei_events_lock);
 	if (frozen) {
 		/* All events unregistered  */
+		spin_unlock(&sdei_events_lock);
 		return sdei_mask_local_cpu();
 	}
 
 	/* un-register private events */
-	spin_lock(&sdei_events_lock);
 	list_for_each_entry(event, &sdei_events, list) {
 		if (event->type == SDEI_EVENT_TYPE_SHARED)
 			continue;
@@ -732,13 +737,14 @@ static int sdei_cpuhp_up(unsigned int cpu)
 	struct sdei_event *event;
 	struct sdei_crosscall_args arg;
 
+	spin_lock(&sdei_events_lock);
 	if (frozen) {
 		/* Events will be re-registered when we thaw. */
+		spin_unlock(&sdei_events_lock);
 		return sdei_unmask_local_cpu();
 	}
 
 	/* re-register/enable private events */
-	spin_lock(&sdei_events_lock);
 	list_for_each_entry(event, &sdei_events, list) {
 		if (event->type == SDEI_EVENT_TYPE_SHARED)
 			continue;
@@ -813,7 +819,10 @@ static int sdei_device_freeze(struct device *dev)
 {
 	int err;
 
+	spin_lock(&sdei_events_lock);
 	frozen = true;
+	spin_unlock(&sdei_events_lock);
+
 	err = sdei_event_unregister_all();
 	if (err)
 		return err;
@@ -828,7 +837,11 @@ static int sdei_device_thaw(struct device *dev)
 	sdei_device_resume(dev);
 
 	err = sdei_reregister_events();
+
+	spin_lock(&sdei_events_lock);
 	frozen = false;
+	spin_unlock(&sdei_events_lock);
+
 	return err;
 }
 
@@ -865,7 +878,9 @@ static int sdei_reboot_notifier(struct notifier_block *nb, unsigned long action,
 	 * There is now no point trying to unregister private events if we go on
 	 * to take CPUs offline.
 	 */
+	spin_lock(&sdei_events_lock);
 	frozen = true;
+	spin_unlock(&sdei_events_lock);
 
 	return NOTIFY_OK;
 }
-- 
2.15.0.rc2

  parent reply	other threads:[~2017-11-01 15:59 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-17 17:44 [PATCH v4 00/13] arm64/firmware: Software Delegated Exception Interface James Morse
2017-10-17 17:44 ` [PATCH v4 04/13] arm64: alternatives: use tpidr_el2 on VHE hosts James Morse
2017-10-18 11:00   ` Catalin Marinas
2017-10-17 17:44 ` [PATCH v4 05/13] KVM: arm64: Stop save/restoring host tpidr_el1 on VHE James Morse
2017-10-17 17:44 ` [PATCH v4 06/13] Docs: dt: add devicetree binding for describing arm64 SDEI firmware James Morse
2017-10-17 17:44 ` [PATCH v4 09/13] arm64: kernel: Add arch-specific SDEI entry code and CPU masking James Morse
     [not found]   ` <20171017174432.1684-10-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-18 11:18     ` Catalin Marinas
2017-10-17 17:44 ` [PATCH v4 11/13] firmware: arm_sdei: add support for CPU private events James Morse
     [not found]   ` <20171017174432.1684-12-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-18 11:11     ` Catalin Marinas
2017-10-18 17:19     ` Will Deacon
     [not found]       ` <20171018171959.GJ21820-5wv7dgnIgG8@public.gmane.org>
2017-10-24 17:34         ` James Morse
     [not found]           ` <59EF798A.9000609-5wv7dgnIgG8@public.gmane.org>
2017-11-01 15:59             ` James Morse
     [not found] ` <20171017174432.1684-1-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-17 17:44   ` [PATCH v4 01/13] KVM: arm64: Store vcpu on the stack during __guest_enter() James Morse
2017-10-17 17:44   ` [PATCH v4 02/13] KVM: arm/arm64: Convert kvm_host_cpu_state to a static per-cpu allocation James Morse
2017-10-17 17:44   ` [PATCH v4 03/13] KVM: arm64: Change hyp_panic()s dependency on tpidr_el2 James Morse
2017-10-17 17:44   ` [PATCH v4 07/13] firmware: arm_sdei: Add driver for Software Delegated Exceptions James Morse
2017-10-18 11:09     ` Catalin Marinas
2017-10-17 17:44   ` [PATCH v4 08/13] arm64: Add vmap_stack header file James Morse
     [not found]     ` <20171017174432.1684-9-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-18 11:10       ` Catalin Marinas
2017-10-17 17:44   ` [PATCH v4 10/13] firmware: arm_sdei: Add support for CPU and system power states James Morse
     [not found]     ` <20171017174432.1684-11-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-18 11:11       ` Catalin Marinas
2017-10-18 17:17       ` Will Deacon
     [not found]         ` <20171018171747.GI21820-5wv7dgnIgG8@public.gmane.org>
2017-10-24 17:34           ` James Morse
     [not found]             ` <59EF799B.4040802-5wv7dgnIgG8@public.gmane.org>
2017-10-25 14:43               ` Will Deacon
2017-10-17 17:44   ` [PATCH v4 12/13] arm64: acpi: Remove __init from acpi_psci_use_hvc() for use by SDEI James Morse
2017-10-18 11:11     ` Catalin Marinas
2017-10-17 17:44   ` [PATCH v4 13/13] firmware: arm_sdei: Discover SDEI support via ACPI James Morse
     [not found]     ` <20171017174432.1684-14-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-10-18 11:12       ` Catalin Marinas
2017-10-18 17:16   ` [PATCH v4 00/13] arm64/firmware: Software Delegated Exception Interface Will Deacon
2017-10-30 15:58   ` [PATCH v4 14/13] firmware: arm_sdei: Move cpuhotplug registration later James Morse
2017-11-01 15:59 ` James Morse [this message]
     [not found]   ` <20171101155941.19432-1-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-11-08 15:11     ` [PATCH 15/13] firmware: arm_sdei: move the frozen flag under the spinlock James Morse
     [not found]       ` <5A031E9E.2090809-5wv7dgnIgG8@public.gmane.org>
2017-11-08 16:06         ` [PATCH v4 15/13] firmware: arm_sdei: be more robust against cpu-hotplug James Morse
     [not found]           ` <20171108160624.10355-1-james.morse-5wv7dgnIgG8@public.gmane.org>
2017-11-13 11:01             ` Will Deacon

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=20171101155941.19432-1-james.morse@arm.com \
    --to=james.morse@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=devicetree@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=lho@apm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=lorenzo.pieralisi@arm.com \
    --cc=marc.zyngier@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=will.deacon@arm.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox