On Fri, Aug 05, 2022 at 06:37:13PM +0000, Sean Christopherson wrote: > On Fri, Jul 29, 2022, Coleman Dietsch wrote: > > Add a check for existing xen timers before initializing a new one. > > > > Currently kvm_xen_init_timer() is called on every > > KVM_XEN_VCPU_ATTR_TYPE_TIMER, which is causing the following ODEBUG > > crash when vcpu->arch.xen.timer is already set. > > > > ODEBUG: init active (active state 0) > > object type: hrtimer hint: xen_timer_callbac0 > > RIP: 0010:debug_print_object+0x16e/0x250 lib/debugobjects.c:502 > > Call Trace: > > __debug_object_init > > debug_hrtimer_init > > debug_init > > hrtimer_init > > kvm_xen_init_timer > > kvm_xen_vcpu_set_attr > > kvm_arch_vcpu_ioctl > > kvm_vcpu_ioctl > > vfs_ioctl > > > > Fixes: 536395260582 ("KVM: x86/xen: handle PV timers oneshot mode") > Cc: stable@xxxxxxxxxxxxxxx > > > Link: https://syzkaller.appspot.com/bug?id=8234a9dfd3aafbf092cc5a7cd9842e3ebc45fc42 > > Reported-by: syzbot+e54f930ed78eb0f85281@xxxxxxxxxxxxxxxxxxxxxxxxx > > Signed-off-by: Coleman Dietsch <dietschc@xxxxxxx> > > --- > > One uber nit below, otherwise: > > Reviewed-by: Sean Christopherson <seanjc@xxxxxxxxxx> > Got it, thanks Sean. > > arch/x86/kvm/xen.c | 5 ++++- > > 1 file changed, 4 insertions(+), 1 deletion(-) > > > > diff --git a/arch/x86/kvm/xen.c b/arch/x86/kvm/xen.c > > index 610beba35907..2dd0f72a62f2 100644 > > --- a/arch/x86/kvm/xen.c > > +++ b/arch/x86/kvm/xen.c > > @@ -713,7 +713,10 @@ int kvm_xen_vcpu_set_attr(struct kvm_vcpu *vcpu, struct kvm_xen_vcpu_attr *data) > > break; > > } > > vcpu->arch.xen.timer_virq = data->u.timer.port; > > - kvm_xen_init_timer(vcpu); > > + > > + /* Check for existing timer */ > > I vote to omit the comment, "existing timer" is ambiguous, e.g. it could mean that > there's an existing _running_ timer as opposed to an existing initialized timer. > IMO the code is obvious enough on its own. > This makes perfect sense. I will ommit the comment in the next patch. > > + if (!vcpu->arch.xen.timer.function) > > + kvm_xen_init_timer(vcpu); > > > > /* Restart the timer if it's set */ > > if (data->u.timer.expires_ns) > > -- > > 2.34.1 > >