diff mbox series

riscv: kvm: move preempt_disable() call in kvm_arch_vcpu_ioctl_run

Message ID 20220701094955.1927867-1-nborisov@suse.com
State Accepted
Headers show
Series riscv: kvm: move preempt_disable() call in kvm_arch_vcpu_ioctl_run | expand

Commit Message

Nikolay Borisov July 1, 2022, 9:49 a.m. UTC
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>
---
 arch/riscv/kvm/vcpu.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

Comments

Anup Patel July 4, 2022, 9:13 a.m. UTC | #1
On Fri, Jul 1, 2022 at 3:19 PM Nikolay Borisov <nborisov@suse.com> wrote:
>
> 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>

Looks good to me.

I have queued it for 5.20

Thanks,
Anup

> ---
>  arch/riscv/kvm/vcpu.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c
> index 7f4ad5e4373a..0c527b2c3c63 100644
> --- a/arch/riscv/kvm/vcpu.c
> +++ b/arch/riscv/kvm/vcpu.c
> @@ -888,8 +888,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
>
>                 kvm_riscv_check_vcpu_requests(vcpu);
>
> -               preempt_disable();
> -
>                 local_irq_disable();
>
>                 /*
> @@ -926,7 +924,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;
>                 }
> @@ -960,6 +957,7 @@ 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
> --
> 2.25.1
>
diff mbox series

Patch

diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c
index 7f4ad5e4373a..0c527b2c3c63 100644
--- a/arch/riscv/kvm/vcpu.c
+++ b/arch/riscv/kvm/vcpu.c
@@ -888,8 +888,6 @@  int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
 
 		kvm_riscv_check_vcpu_requests(vcpu);
 
-		preempt_disable();
-
 		local_irq_disable();
 
 		/*
@@ -926,7 +924,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;
 		}
@@ -960,6 +957,7 @@  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