| From 7b569babd267c40168e48f3d8bdaadd20a5d5c45 Mon Sep 17 00:00:00 2001 |
| From: Andrew Jones <drjones@redhat.com> |
| Date: Thu, 4 Apr 2019 19:42:30 +0200 |
| Subject: KVM: arm/arm64: Ensure vcpu target is unset on reset failure |
| |
| [ Upstream commit 811328fc3222f7b55846de0cd0404339e2e1e6d7 ] |
| |
| A failed KVM_ARM_VCPU_INIT should not set the vcpu target, |
| as the vcpu target is used by kvm_vcpu_initialized() to |
| determine if other vcpu ioctls may proceed. We need to set |
| the target before calling kvm_reset_vcpu(), but if that call |
| fails, we should then unset it and clear the feature bitmap |
| while we're at it. |
| |
| Signed-off-by: Andrew Jones <drjones@redhat.com> |
| [maz: Simplified patch, completed commit message] |
| Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| virt/kvm/arm/arm.c | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c |
| index 1415e36fed3db..fef3527af3bd7 100644 |
| --- a/virt/kvm/arm/arm.c |
| +++ b/virt/kvm/arm/arm.c |
| @@ -949,7 +949,7 @@ int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level, |
| static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, |
| const struct kvm_vcpu_init *init) |
| { |
| - unsigned int i; |
| + unsigned int i, ret; |
| int phys_target = kvm_target_cpu(); |
| |
| if (init->target != phys_target) |
| @@ -984,9 +984,14 @@ static int kvm_vcpu_set_target(struct kvm_vcpu *vcpu, |
| vcpu->arch.target = phys_target; |
| |
| /* Now we know what it is, we can reset it. */ |
| - return kvm_reset_vcpu(vcpu); |
| -} |
| + ret = kvm_reset_vcpu(vcpu); |
| + if (ret) { |
| + vcpu->arch.target = -1; |
| + bitmap_zero(vcpu->arch.features, KVM_VCPU_MAX_FEATURES); |
| + } |
| |
| + return ret; |
| +} |
| |
| static int kvm_arch_vcpu_ioctl_vcpu_init(struct kvm_vcpu *vcpu, |
| struct kvm_vcpu_init *init) |
| -- |
| 2.20.1 |
| |