From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [patch 2/2] KVM: PIT: provide an option to disable interrupt reinjection Date: Tue, 30 Dec 2008 12:08:01 +0200 Message-ID: <4959F301.2030104@redhat.com> References: <20081229173824.759371918@localhost.localdomain> <20081229174009.523082019@localhost.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, sheng@linux.intel.com To: Marcelo Tosatti Return-path: Received: from mx2.redhat.com ([66.187.237.31]:42187 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751303AbYL3KIG (ORCPT ); Tue, 30 Dec 2008 05:08:06 -0500 In-Reply-To: <20081229174009.523082019@localhost.localdomain> Sender: kvm-owner@vger.kernel.org List-ID: Marcelo Tosatti wrote: > 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 > > 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->no_reinject) > + atomic_set(&pt->pending, 1); > + > What about moving this to the place where we atomic_inc()? Any reason not to? > --- 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 no_reinject; > }; > Negative logic = !good. Call it reinject and init to true. > @@ -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_NO_REINJECT: > Negative logic. PIT_REINJECT_CONTROL? -- error compiling committee.c: too many arguments to function