Skip to content

Commit cf5d318

Browse files
committed
arm/arm64: KVM: Turn off vcpus on PSCI shutdown/reboot
When a vcpu calls SYSTEM_OFF or SYSTEM_RESET with PSCI v0.2, the vcpus should really be turned off for the VM adhering to the suggestions in the PSCI spec, and it's the sane thing to do. Also, clarify the behavior and expectations for exits to user space with the KVM_EXIT_SYSTEM_EVENT case. Acked-by: Marc Zyngier <[email protected]> Signed-off-by: Christoffer Dall <[email protected]>
1 parent f7fa034 commit cf5d318

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

Documentation/virtual/kvm/api.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2957,6 +2957,15 @@ HVC instruction based PSCI call from the vcpu. The 'type' field describes
29572957
the system-level event type. The 'flags' field describes architecture
29582958
specific flags for the system-level event.
29592959

2960+
Valid values for 'type' are:
2961+
KVM_SYSTEM_EVENT_SHUTDOWN -- the guest has requested a shutdown of the
2962+
VM. Userspace is not obliged to honour this, and if it does honour
2963+
this does not need to destroy the VM synchronously (ie it may call
2964+
KVM_RUN again before shutdown finally occurs).
2965+
KVM_SYSTEM_EVENT_RESET -- the guest has requested a reset of the VM.
2966+
As with SHUTDOWN, userspace can choose to ignore the request, or
2967+
to schedule the reset to occur in the future and may call KVM_RUN again.
2968+
29602969
/* Fix the size of the union. */
29612970
char padding[256];
29622971
};

arch/arm/kvm/psci.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18+
#include <linux/preempt.h>
1819
#include <linux/kvm_host.h>
1920
#include <linux/wait.h>
2021

@@ -166,6 +167,23 @@ static unsigned long kvm_psci_vcpu_affinity_info(struct kvm_vcpu *vcpu)
166167

167168
static void kvm_prepare_system_event(struct kvm_vcpu *vcpu, u32 type)
168169
{
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+
169187
memset(&vcpu->run->system_event, 0, sizeof(vcpu->run->system_event));
170188
vcpu->run->system_event.type = type;
171189
vcpu->run->exit_reason = KVM_EXIT_SYSTEM_EVENT;

arch/arm64/include/asm/kvm_host.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ struct kvm_vcpu *kvm_arm_get_running_vcpu(void);
198198
struct kvm_vcpu * __percpu *kvm_get_running_vcpus(void);
199199

200200
u64 kvm_call_hyp(void *hypfn, ...);
201+
void force_vm_exit(const cpumask_t *mask);
201202

202203
int handle_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
203204
int exception_index);

0 commit comments

Comments
 (0)