From mboxrd@z Thu Jan 1 00:00:00 1970 From: Radim Krcmar Subject: Re: [patch 2/3] KVM: x86: add option to advance tscdeadline hrtimer expiration Date: Wed, 17 Dec 2014 15:58:13 +0100 Message-ID: <20141217145805.GA29368@potion.brq.redhat.com> References: <20141216140813.493421022@redhat.com> <20141216140853.687723255@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Cc: kvm@vger.kernel.org, Luiz Capitulino , Rik van Riel , Paolo Bonzini To: Marcelo Tosatti Return-path: Received: from mx1.redhat.com ([209.132.183.28]:47818 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750905AbaLQO6R (ORCPT ); Wed, 17 Dec 2014 09:58:17 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sBHEwHlT007791 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Wed, 17 Dec 2014 09:58:17 -0500 Content-Disposition: inline In-Reply-To: <20141216140853.687723255@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: 2014-12-16 09:08-0500, Marcelo Tosatti: > For the hrtimer which emulates the tscdeadline timer in the guest, > add an option to advance expiration, and busy spin on VM-entry waitin= g > for the actual expiration time to elapse. >=20 > This allows achieving low latencies in cyclictest (or any scenario=20 > which requires strict timing regarding timer expiration). >=20 > Reduces average cyclictest latency from 12us to 8us > on Core i5 desktop. >=20 > Note: this option requires tuning to find the appropriate value=20 > for a particular hardware/guest combination. One method is to measure= the=20 > average delay between apic_timer_fn and VM-entry.=20 > Another method is to start with 1000ns, and increase the value > in say 500ns increments until avg cyclictest numbers stop decreasing. >=20 > Signed-off-by: Marcelo Tosatti Reviewed-by: Radim Kr=C4=8Dm=C3=A1=C5=99 > +++ kvm/arch/x86/kvm/lapic.c > @@ -1087,11 +1089,64 @@ static void apic_timer_expired(struct kv [...] > +/* > + * On APICv, this test will cause a busy wait > + * during a higher-priority task. > + */ (A bit confusing ... this test doesn't busy wait.) > + > +static bool lapic_timer_int_injected(struct kvm_vcpu *vcpu) [...] > +void wait_lapic_expire(struct kvm_vcpu *vcpu) > +{ [...] > + tsc_deadline =3D apic->lapic_timer.expired_tscdeadline; > + apic->lapic_timer.expired_tscdeadline =3D 0; > + guest_tsc =3D kvm_x86_ops->read_l1_tsc(vcpu, native_read_tsc()); > + > + while (guest_tsc < tsc_deadline) { > + int delay =3D min(tsc_deadline - guest_tsc, 1000ULL); Why break the __delay() loop into smaller parts? > + > + __delay(delay); (Does not have to call delay_tsc, but I guess it won't change.) > + guest_tsc =3D kvm_x86_ops->read_l1_tsc(vcpu, native_read_tsc()); > + } > } > =20 Btw. simple automatic delta tuning had worse results?