diff options
Diffstat (limited to 'arch/arm/kvm')
-rw-r--r-- | arch/arm/kvm/psci.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c index 09cf37737ee2..58cb3248d277 100644 --- a/arch/arm/kvm/psci.c +++ b/arch/arm/kvm/psci.c | |||
@@ -15,6 +15,7 @@ | |||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include <linux/preempt.h> | ||
18 | #include <linux/kvm_host.h> | 19 | #include <linux/kvm_host.h> |
19 | #include <linux/wait.h> | 20 | #include <linux/wait.h> |
20 | 21 | ||
@@ -166,6 +167,23 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu) | |||
166 | 167 | ||
167 | static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, u32 type) | 168 | static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, u32 type) |
168 | { | 169 | { |
170 | int i; | ||
171 | struct kvm_vcpu *tmp; | ||
172 | |||
173 | /* | ||
174 | * The KVM ABI specifies that a system event exit may call KVM_RUN | ||
175 | * again and may perform shutdown/reboot at a later time that when the | ||
176 | * actual request is made. Since we are implementing PSCI and a | ||
177 | * caller of PSCI reboot and shutdown expects that the system shuts | ||
178 | * down or reboots immediately, let's make sure that VCPUs are not run | ||
179 | * after this call is handled and before the VCPUs have been | ||
180 | * re-initialized. | ||
181 | */ | ||
182 | kvm_for_each_vcpu(i, tmp, vcpu->kvm) { | ||
183 | tmp->arch.pause = true; | ||
184 | kvm_vcpu_kick(tmp); | ||
185 | } | ||
186 | |||
169 | memset(&vcpu->run->system_event, 0, sizeof(vcpu->run->system_event)); | 187 | memset(&vcpu->run->system_event, 0, sizeof(vcpu->run->system_event)); |
170 | vcpu->run->system_event.type = type; | 188 | vcpu->run->system_event.type = type; |
171 | vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT; | 189 | vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT; |