KVM: arm/arm64: Avoid vcpu_load for other vcpu ioctls than KVM_RUN

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Mon Mar 19 02:59:02 PDT 2018


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=e21a4f3a930cda6e4902cb5b3213365e5ff3ce7c
Commit:     e21a4f3a930cda6e4902cb5b3213365e5ff3ce7c
Parent:     62b06f8f429cd233e4e2e7bbd21081ad60c9018f
Author:     Christoffer Dall <christoffer.dall at linaro.org>
AuthorDate: Tue Feb 27 12:33:50 2018 +0100
Committer:  Marc Zyngier <marc.zyngier at arm.com>
CommitDate: Wed Mar 14 18:29:14 2018 +0000

    KVM: arm/arm64: Avoid vcpu_load for other vcpu ioctls than KVM_RUN
    
    Calling vcpu_load() registers preempt notifiers for this vcpu and calls
    kvm_arch_vcpu_load().  The latter will soon be doing a lot of heavy
    lifting on arm/arm64 and will try to do things such as enabling the
    virtual timer and setting us up to handle interrupts from the timer
    hardware.
    
    Loading state onto hardware registers and enabling hardware to signal
    interrupts can be problematic when we're not actually about to run the
    VCPU, because it makes it difficult to establish the right context when
    handling interrupts from the timer, and it makes the register access
    code difficult to reason about.
    
    Luckily, now when we call vcpu_load in each ioctl implementation, we can
    simply remove the call from the non-KVM_RUN vcpu ioctls, and our
    kvm_arch_vcpu_load() is only used for loading vcpu content to the
    physical CPU when we're actually going to run the vcpu.
    
    Cc: stable at vger.kernel.org
    Fixes: 9b062471e52a ("KVM: Move vcpu_load to arch-specific kvm_arch_vcpu_ioctl")
    Reviewed-by: Julien Grall <julien.grall at arm.com>
    Reviewed-by: Marc Zyngier <marc.zyngier at arm.com>
    Reviewed-by: Andrew Jones <drjones at redhat.com>
    Signed-off-by: Christoffer Dall <christoffer.dall at linaro.org>
    Signed-off-by: Marc Zyngier <marc.zyngier at arm.com>
---
 arch/arm64/kvm/guest.c | 3 ---
 virt/kvm/arm/arm.c     | 9 ---------
 2 files changed, 12 deletions(-)

diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index d7e3299a7734..959e50d2588c 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -363,8 +363,6 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
 {
 	int ret = 0;
 
-	vcpu_load(vcpu);
-
 	trace_kvm_set_guest_debug(vcpu, dbg->control);
 
 	if (dbg->control & ~KVM_GUESTDBG_VALID_MASK) {
@@ -386,7 +384,6 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
 	}
 
 out:
-	vcpu_put(vcpu);
 	return ret;
 }
 
diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c
index 86941f6181bb..53572304843b 100644
--- a/virt/kvm/arm/arm.c
+++ b/virt/kvm/arm/arm.c
@@ -384,14 +384,11 @@ static void vcpu_power_off(struct kvm_vcpu *vcpu)
 int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
 				    struct kvm_mp_state *mp_state)
 {
-	vcpu_load(vcpu);
-
 	if (vcpu->arch.power_off)
 		mp_state->mp_state = KVM_MP_STATE_STOPPED;
 	else
 		mp_state->mp_state = KVM_MP_STATE_RUNNABLE;
 
-	vcpu_put(vcpu);
 	return 0;
 }
 
@@ -400,8 +397,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
 {
 	int ret = 0;
 
-	vcpu_load(vcpu);
-
 	switch (mp_state->mp_state) {
 	case KVM_MP_STATE_RUNNABLE:
 		vcpu->arch.power_off = false;
@@ -413,7 +408,6 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
 		ret = -EINVAL;
 	}
 
-	vcpu_put(vcpu);
 	return ret;
 }
 
@@ -1036,8 +1030,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 	struct kvm_device_attr attr;
 	long r;
 
-	vcpu_load(vcpu);
-
 	switch (ioctl) {
 	case KVM_ARM_VCPU_INIT: {
 		struct kvm_vcpu_init init;
@@ -1114,7 +1106,6 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
 		r = -EINVAL;
 	}
 
-	vcpu_put(vcpu);
 	return r;
 }
 



More information about the linux-mtd-cvs mailing list