mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-24 05:01:03 +02:00
KVM: arm64: Relax invariance of KVM_ARM_VCPU_POWER_OFF
Allow the value of KVM_ARM_VCPU_POWER_OFF to differ between calls to KVM_ARM_VCPU_INIT. Userspace can already change the state of the vCPU through the KVM_SET_MP_STATE ioctl, so making the bit invariant seems needlessly restrictive. Link: https://lore.kernel.org/r/20230609190054.1542113-3-oliver.upton@linux.dev Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
This commit is contained in:
@@ -1236,8 +1236,19 @@ static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu,
|
|||||||
static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
|
static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
|
||||||
struct kvm_vcpu_init *init)
|
struct kvm_vcpu_init *init)
|
||||||
{
|
{
|
||||||
|
bool power_off = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Treat the power-off vCPU feature as ephemeral. Clear the bit to avoid
|
||||||
|
* reflecting it in the finalized feature set, thus limiting its scope
|
||||||
|
* to a single KVM_ARM_VCPU_INIT call.
|
||||||
|
*/
|
||||||
|
if (init->features[0] & KVM_ARM_VCPU_POWER_OFF) {
|
||||||
|
init->features[0] &= ~KVM_ARM_VCPU_POWER_OFF;
|
||||||
|
power_off = true;
|
||||||
|
}
|
||||||
|
|
||||||
ret = kvm_vcpu_set_target(vcpu, init);
|
ret = kvm_vcpu_set_target(vcpu, init);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1266,7 +1277,7 @@ static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu,
|
|||||||
*/
|
*/
|
||||||
spin_lock(&vcpu->arch.mp_state_lock);
|
spin_lock(&vcpu->arch.mp_state_lock);
|
||||||
|
|
||||||
if (test_bit(KVM_ARM_VCPU_POWER_OFF, vcpu->arch.features))
|
if (power_off)
|
||||||
__kvm_arm_vcpu_power_off(vcpu);
|
__kvm_arm_vcpu_power_off(vcpu);
|
||||||
else
|
else
|
||||||
WRITE_ONCE(vcpu->arch.mp_state.mp_state, KVM_MP_STATE_RUNNABLE);
|
WRITE_ONCE(vcpu->arch.mp_state.mp_state, KVM_MP_STATE_RUNNABLE);
|
||||||
|
Reference in New Issue
Block a user