[PATCH 1/1] riscv/kvm: Fix VM hang in case of timer delta being zero.
Rajnesh Kanwal
rkanwal at rivosinc.com
Fri Feb 10 06:31:21 PST 2023
On Fri, Feb 10, 2023 at 2:07 PM Anup Patel <apatel at ventanamicro.com> wrote:
>
> On Fri, Feb 10, 2023 at 7:21 PM Rajnesh Kanwal <rkanwal at rivosinc.com> wrote:
> >
> > In case when VCPU is blocked due to WFI, we schedule the timer
> > from `kvm_riscv_vcpu_timer_blocking()` to keep timer interrupt
> > ticking.
> >
> > But in case when delta_ns comes to be zero, we never schedule
> > the timer and VCPU keeps sleeping indefinitely until any activity
> > is done with VM console.
> >
> > This is easily reproduce-able using kvmtool.
> > ./lkvm-static run -c1 --console virtio -p "earlycon root=/dev/vda" \
> > -k ./Image -d rootfs.ext4
> >
> > Also, just add a print in kvm_riscv_vcpu_vstimer_expired() to
> > check the interrupt delivery and run `top` or similar auto-upating
> > cmd from guest. Within sometime one can notice that print from
> > timer expiry routine stops and the `top` cmd output will stop
> > updating.
> >
> > This change fixes this by making sure we schedule the timer even
> > with delta_ns being zero to bring the VCPU out of sleep immediately.
> >
>
> Please add the Fixes tag here.
Fixed in v2.
https://lore.kernel.org/all/20230210142711.1177212-1-rkanwal@rivosinc.com/T/#t
Thanks
Rajnesh
>
> > Signed-off-by: Rajnesh Kanwal <rkanwal at rivosinc.com>
> > ---
> > arch/riscv/kvm/vcpu_timer.c | 6 ++----
> > 1 file changed, 2 insertions(+), 4 deletions(-)
> >
> > diff --git a/arch/riscv/kvm/vcpu_timer.c b/arch/riscv/kvm/vcpu_timer.c
> > index ad34519c8a13..3ac2ff6a65da 100644
> > --- a/arch/riscv/kvm/vcpu_timer.c
> > +++ b/arch/riscv/kvm/vcpu_timer.c
> > @@ -147,10 +147,8 @@ static void kvm_riscv_vcpu_timer_blocking(struct kvm_vcpu *vcpu)
> > return;
> >
> > delta_ns = kvm_riscv_delta_cycles2ns(t->next_cycles, gt, t);
> > - if (delta_ns) {
> > - hrtimer_start(&t->hrt, ktime_set(0, delta_ns), HRTIMER_MODE_REL);
> > - t->next_set = true;
> > - }
> > + hrtimer_start(&t->hrt, ktime_set(0, delta_ns), HRTIMER_MODE_REL);
> > + t->next_set = true;
> > }
> >
> > static void kvm_riscv_vcpu_timer_unblocking(struct kvm_vcpu *vcpu)
> > --
> > 2.25.1
> >
More information about the linux-riscv
mailing list