* [patch 0/2] PIT: optionally disable interrupt reinjection (v2)
@ 2008-12-30 17:55 Marcelo Tosatti
2008-12-30 17:55 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Marcelo Tosatti @ 2008-12-30 17:55 UTC (permalink / raw)
To: kvm; +Cc: avi, sheng
Addressing comments.
--
^ permalink raw reply [flat|nested] 5+ messages in thread* [patch 1/2] KVM: PIT: fix i8254 pending count read 2008-12-30 17:55 [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Marcelo Tosatti @ 2008-12-30 17:55 ` Marcelo Tosatti 2008-12-30 17:55 ` [patch 2/2] KVM: PIT: provide an option to disable interrupt reinjection Marcelo Tosatti 2008-12-31 9:52 ` [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Avi Kivity 2 siblings, 0 replies; 5+ messages in thread From: Marcelo Tosatti @ 2008-12-30 17:55 UTC (permalink / raw) To: kvm; +Cc: avi, sheng, Marcelo Tosatti [-- Attachment #1: i8254-fix-count --] [-- Type: text/plain, Size: 669 bytes --] count_load_time assignment is bogus: its supposed to contain what it means, not the expiration time. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/x86/kvm/i8254.c =================================================================== --- kvm.orig/arch/x86/kvm/i8254.c +++ kvm/arch/x86/kvm/i8254.c @@ -207,7 +207,7 @@ static int __pit_timer_fn(struct kvm_kpi hrtimer_add_expires_ns(&pt->timer, pt->period); pt->scheduled = hrtimer_get_expires_ns(&pt->timer); if (pt->period) - ps->channels[0].count_load_time = hrtimer_get_expires(&pt->timer); + ps->channels[0].count_load_time = ktime_get(); return (pt->period == 0 ? 0 : 1); } -- ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch 2/2] KVM: PIT: provide an option to disable interrupt reinjection 2008-12-30 17:55 [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Marcelo Tosatti 2008-12-30 17:55 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti @ 2008-12-30 17:55 ` Marcelo Tosatti 2008-12-31 9:52 ` [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Avi Kivity 2 siblings, 0 replies; 5+ messages in thread From: Marcelo Tosatti @ 2008-12-30 17:55 UTC (permalink / raw) To: kvm; +Cc: avi, sheng, Marcelo Tosatti [-- Attachment #1: i8254-disable-reinject --] [-- Type: text/plain, Size: 3516 bytes --] Certain clocks (such as TSC) in older 2.6 guests overaccount for lost ticks, causing severe time drift. Interrupt reinjection magnifies the problem. Provide an option to disable it. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/x86/kvm/i8254.c =================================================================== --- kvm.orig/arch/x86/kvm/i8254.c +++ kvm/arch/x86/kvm/i8254.c @@ -201,6 +201,9 @@ static int __pit_timer_fn(struct kvm_kpi if (!atomic_inc_and_test(&pt->pending)) set_bit(KVM_REQ_PENDING_TIMER, &vcpu0->requests); + if (!pt->reinject) + atomic_set(&pt->pending, 1); + if (vcpu0 && waitqueue_active(&vcpu0->wq)) wake_up_interruptible(&vcpu0->wq); @@ -580,6 +583,7 @@ struct kvm_pit *kvm_create_pit(struct kv pit_state->irq_ack_notifier.gsi = 0; pit_state->irq_ack_notifier.irq_acked = kvm_pit_ack_irq; kvm_register_irq_ack_notifier(kvm, &pit_state->irq_ack_notifier); + pit_state->pit_timer.reinject = true; mutex_unlock(&pit->pit_state.lock); kvm_pit_reset(pit); Index: kvm/arch/x86/kvm/i8254.h =================================================================== --- kvm.orig/arch/x86/kvm/i8254.h +++ kvm/arch/x86/kvm/i8254.h @@ -9,6 +9,7 @@ struct kvm_kpit_timer { s64 period; /* unit: ns */ s64 scheduled; atomic_t pending; + bool reinject; }; struct kvm_kpit_channel_state { Index: kvm/arch/x86/kvm/x86.c =================================================================== --- kvm.orig/arch/x86/kvm/x86.c +++ kvm/arch/x86/kvm/x86.c @@ -991,6 +991,7 @@ int kvm_dev_ioctl_check_extension(long e case KVM_CAP_NOP_IO_DELAY: case KVM_CAP_MP_STATE: case KVM_CAP_SYNC_MMU: + case KVM_CAP_PIT_REINJECT_CONTROL: r = 1; break; case KVM_CAP_COALESCED_MMIO: @@ -1723,6 +1724,13 @@ static int kvm_vm_ioctl_set_pit(struct k return r; } +static int kvm_vm_ioctl_pit_reinject(struct kvm *kvm, + struct kvm_pit_reinject_control *control) +{ + kvm->arch.vpit->pit_state.pit_timer.reinject = control->reinject; + return 0; +} + /* * Get (and clear) the dirty memory log for a memory slot. */ @@ -1920,6 +1928,20 @@ long kvm_arch_vm_ioctl(struct file *filp r = 0; break; } + case KVM_PIT_REINJECT_CONTROL: { + struct kvm_pit_reinject_control control; + r = -EFAULT; + if (copy_from_user(&control, argp, sizeof(control))) + goto out; + r = -ENXIO; + if (!kvm->arch.vpit) + goto out; + r = kvm_vm_ioctl_pit_reinject(kvm, &control); + if (r) + goto out; + r = 0; + break; + } default: ; } Index: kvm/include/linux/kvm.h =================================================================== --- kvm.orig/include/linux/kvm.h +++ kvm/include/linux/kvm.h @@ -396,6 +396,9 @@ struct kvm_trace_rec { #if defined(CONFIG_X86) #define KVM_CAP_SET_GUEST_DEBUG 23 #endif +#if defined(CONFIG_X86) +#define KVM_CAP_PIT_REINJECT_CONTROL 24 +#endif /* * ioctls for VM fds @@ -429,6 +432,7 @@ struct kvm_trace_rec { struct kvm_assigned_pci_dev) #define KVM_ASSIGN_IRQ _IOR(KVMIO, 0x70, \ struct kvm_assigned_irq) +#define KVM_PIT_REINJECT_CONTROL _IO(KVMIO, 0x71) /* * ioctls for vcpu fds Index: kvm/arch/x86/include/asm/kvm.h =================================================================== --- kvm.orig/arch/x86/include/asm/kvm.h +++ kvm/arch/x86/include/asm/kvm.h @@ -226,4 +226,8 @@ struct kvm_guest_debug_arch { struct kvm_pit_state { struct kvm_pit_channel_state channels[3]; }; + +struct kvm_pit_reinject_control { + __u8 reinject; +}; #endif /* _ASM_X86_KVM_H */ -- ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [patch 0/2] PIT: optionally disable interrupt reinjection (v2) 2008-12-30 17:55 [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Marcelo Tosatti 2008-12-30 17:55 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti 2008-12-30 17:55 ` [patch 2/2] KVM: PIT: provide an option to disable interrupt reinjection Marcelo Tosatti @ 2008-12-31 9:52 ` Avi Kivity 2 siblings, 0 replies; 5+ messages in thread From: Avi Kivity @ 2008-12-31 9:52 UTC (permalink / raw) To: Marcelo Tosatti; +Cc: kvm, sheng Marcelo Tosatti wrote: > Addressing comments. > > Applied, thanks. I removed PIT_ everywhere and added some reserved space, so we can control reinjection of other timers using the same ioctl. -- error compiling committee.c: too many arguments to function ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch 0/2] PIT: optionally disable interrupt reinjection @ 2008-12-29 17:38 Marcelo Tosatti 2008-12-29 17:38 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti 0 siblings, 1 reply; 5+ messages in thread From: Marcelo Tosatti @ 2008-12-29 17:38 UTC (permalink / raw) To: kvm; +Cc: avi, sheng -- ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch 1/2] KVM: PIT: fix i8254 pending count read 2008-12-29 17:38 [patch 0/2] PIT: optionally disable interrupt reinjection Marcelo Tosatti @ 2008-12-29 17:38 ` Marcelo Tosatti 0 siblings, 0 replies; 5+ messages in thread From: Marcelo Tosatti @ 2008-12-29 17:38 UTC (permalink / raw) To: kvm; +Cc: avi, sheng, Marcelo Tosatti [-- Attachment #1: i8254-fix-count --] [-- Type: text/plain, Size: 669 bytes --] count_load_time assignment is bogus: its supposed to contain what it means, not the expiration time. Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> Index: kvm/arch/x86/kvm/i8254.c =================================================================== --- kvm.orig/arch/x86/kvm/i8254.c +++ kvm/arch/x86/kvm/i8254.c @@ -207,7 +207,7 @@ static int __pit_timer_fn(struct kvm_kpi hrtimer_add_expires_ns(&pt->timer, pt->period); pt->scheduled = hrtimer_get_expires_ns(&pt->timer); if (pt->period) - ps->channels[0].count_load_time = hrtimer_get_expires(&pt->timer); + ps->channels[0].count_load_time = ktime_get(); return (pt->period == 0 ? 0 : 1); } -- ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-12-31 9:52 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-12-30 17:55 [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Marcelo Tosatti 2008-12-30 17:55 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti 2008-12-30 17:55 ` [patch 2/2] KVM: PIT: provide an option to disable interrupt reinjection Marcelo Tosatti 2008-12-31 9:52 ` [patch 0/2] PIT: optionally disable interrupt reinjection (v2) Avi Kivity -- strict thread matches above, loose matches on Subject: below -- 2008-12-29 17:38 [patch 0/2] PIT: optionally disable interrupt reinjection Marcelo Tosatti 2008-12-29 17:38 ` [patch 1/2] KVM: PIT: fix i8254 pending count read Marcelo Tosatti
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox