From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754384AbcESLYF (ORCPT ); Thu, 19 May 2016 07:24:05 -0400 Received: from e06smtp13.uk.ibm.com ([195.75.94.109]:41537 "EHLO e06smtp13.uk.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753713AbcESLYC (ORCPT ); Thu, 19 May 2016 07:24:02 -0400 X-IBM-Helo: d06dlp01.portsmouth.uk.ibm.com X-IBM-MailFrom: borntraeger@de.ibm.com X-IBM-RcptTo: kvm@vger.kernel.org;linux-kernel@vger.kernel.org Subject: Re: [PATCH] KVM: halt-polling: poll if emulated lapic timer will fire soon To: Wanpeng Li , linux-kernel@vger.kernel.org, kvm@vger.kernel.org References: <1463649990-5889-1-git-send-email-wanpeng.li@hotmail.com> Cc: Wanpeng Li , Paolo Bonzini , =?UTF-8?B?UmFkaW0gS3LEjW3DocWZ?= , David Matlack From: Christian Borntraeger Message-ID: <573DA24D.3080507@de.ibm.com> Date: Thu, 19 May 2016 13:23:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.0 MIME-Version: 1.0 In-Reply-To: <1463649990-5889-1-git-send-email-wanpeng.li@hotmail.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16051911-0013-0000-0000-000013DF1AF9 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/19/2016 11:26 AM, Wanpeng Li wrote: I think in general a good idea to poll if a timer will expire soon. Some patch comments: Same for all non-x86 archs: > +static inline unsigned int kvm_arch_timer_remaining(struct kvm_vcpu *vcpu) {} A function returning int, without a return statement? That gives at least a compiler warning. > --- a/virt/kvm/kvm_main.c > +++ b/virt/kvm/kvm_main.c > @@ -78,6 +78,9 @@ module_param(halt_poll_ns_grow, uint, S_IRUGO | S_IWUSR); > static unsigned int halt_poll_ns_shrink; > module_param(halt_poll_ns_shrink, uint, S_IRUGO | S_IWUSR); > > +/* lower-end of message passing workload latency TCP_RR's poll time < 10us */ > +static unsigned int halt_poll_ns_base = 10000; > + > /* > * Ordering of locks: > * > @@ -1966,7 +1969,7 @@ static void grow_halt_poll_ns(struct kvm_vcpu *vcpu) > grow = READ_ONCE(halt_poll_ns_grow); > /* 10us base */ > if (val == 0 && grow) > - val = 10000; > + val = halt_poll_ns_base; > else > val *= grow; > > @@ -2015,11 +2018,15 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu) > DECLARE_SWAITQUEUE(wait); > bool waited = false; > u64 block_ns; > + unsigned int delta, remaining; > > + remaining = kvm_arch_timer_remaining(vcpu); and now it causes undefined behaviour, no? > start = cur = ktime_get(); > - if (vcpu->halt_poll_ns) { > - ktime_t stop = ktime_add_ns(ktime_get(), vcpu->halt_poll_ns); > + if (vcpu->halt_poll_ns || (remaining < halt_poll_ns_base)) { > + ktime_t stop; > > + delta = vcpu->halt_poll_ns ? vcpu->halt_poll_ns : remaining; > + stop = ktime_add_ns(ktime_get(), delta); > ++vcpu->stat.halt_attempted_poll; > do { > /* > So you avoid to shrink/grow for these cases? Probably makes sense