KVM: arm/arm64: Ensure vcpu target is unset on reset failure [Linux 5.1]

KVM: arm/arm64: Ensure vcpu target is unset on reset failure [Linux 5.1]

This Linux kernel change "KVM: arm/arm64: Ensure vcpu target is unset on reset failure" is included in the Linux 5.1 release. This change is authored by Andrew Jones <drjones [at] redhat.com> on Thu Apr 4 19:42:30 2019 +0200. The commit for this change in Linux stable tree is 811328f (patch).

KVM: arm/arm64: Ensure vcpu target is unset on reset failure

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 <[email protected]>
[maz: Simplified patch, completed commit message]
Signed-off-by: Marc Zyngier <[email protected]>

There are 11 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 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 99c3738..f412ebc 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -934,7 +934,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)
@@ -969,9 +969,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)

Leave a Reply

Your email address will not be published. Required fields are marked *