RISC-V: KVM: move preempt_disable() call in kvm_arch_vcpu_ioctl_run
authorNikolay Borisov <nborisov@suse.com>
Fri, 29 Jul 2022 11:44:34 +0000 (17:14 +0530)
committerAnup Patel <anup@brainfault.org>
Fri, 29 Jul 2022 11:44:34 +0000 (17:14 +0530)
local_irq_disable provides stronger guarantees than preempt_disable so
calling the latter is redundant when interrupts are disabled. Instead,
explicitly disable preemption right before interrupts are enabled/disabled
to ensure that the time accounted in guest_timing_exit_irqoff
includes time taken by the guest or interrupts.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
arch/riscv/kvm/vcpu.c

index 5d42c50..a3c051c 100644 (file)
@@ -936,8 +936,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 
                kvm_riscv_check_vcpu_requests(vcpu);
 
-               preempt_disable();
-
                local_irq_disable();
 
                /*
@@ -974,7 +972,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
                    kvm_request_pending(vcpu)) {
                        vcpu->mode = OUTSIDE_GUEST_MODE;
                        local_irq_enable();
-                       preempt_enable();
                        kvm_vcpu_srcu_read_lock(vcpu);
                        continue;
                }
@@ -1008,6 +1005,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
                /* Syncup interrupts state with HW */
                kvm_riscv_vcpu_sync_interrupts(vcpu);
 
+               preempt_disable();
+
                /*
                 * We must ensure that any pending interrupts are taken before
                 * we exit guest timing so that timer ticks are accounted as