From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paolo Bonzini Subject: Re: [PATCH v1 2/6] kvm/x86: Hyper-V unify stimer_start() and stimer_restart() Date: Thu, 7 Jan 2016 17:32:09 +0100 Message-ID: <568E9309.8010905@redhat.com> References: <1450870121-15943-1-git-send-email-asmetanin@virtuozzo.com> <1450870121-15943-3-git-send-email-asmetanin@virtuozzo.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Cc: Gleb Natapov , Roman Kagan , "Denis V. Lunev" , qemu-devel@nongnu.org To: Andrey Smetanin , kvm@vger.kernel.org Return-path: Received: from mx1.redhat.com ([209.132.183.28]:57048 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751515AbcAGQcQ (ORCPT ); Thu, 7 Jan 2016 11:32:16 -0500 In-Reply-To: <1450870121-15943-3-git-send-email-asmetanin@virtuozzo.com> Sender: kvm-owner@vger.kernel.org List-ID: On 23/12/2015 12:28, Andrey Smetanin wrote: > This will be used in future to start Hyper-V SynIC timer > in several places by one logic in one function. > > Signed-off-by: Andrey Smetanin > Reviewed-by: Roman Kagan > CC: Gleb Natapov > CC: Paolo Bonzini > CC: Roman Kagan > CC: Denis V. Lunev > CC: qemu-devel@nongnu.org > --- > arch/x86/kvm/hyperv.c | 37 ++++++++++++++++--------------------- > 1 file changed, 16 insertions(+), 21 deletions(-) > > diff --git a/arch/x86/kvm/hyperv.c b/arch/x86/kvm/hyperv.c > index ec3a900..8623aa6 100644 > --- a/arch/x86/kvm/hyperv.c > +++ b/arch/x86/kvm/hyperv.c > @@ -408,6 +408,7 @@ static void stimer_cleanup(struct kvm_vcpu_hv_stimer *stimer) > clear_bit(stimer->index, > vcpu_to_hv_vcpu(vcpu)->stimer_pending_bitmap); > stimer->msg_pending = false; > + stimer->exp_time = 0; > } > > static enum hrtimer_restart stimer_timer_callback(struct hrtimer *timer) > @@ -420,24 +421,6 @@ static enum hrtimer_restart stimer_timer_callback(struct hrtimer *timer) > return HRTIMER_NORESTART; > } > > -static void stimer_restart(struct kvm_vcpu_hv_stimer *stimer) > -{ > - u64 time_now; > - ktime_t ktime_now; > - u64 remainder; > - > - time_now = get_time_ref_counter(stimer_to_vcpu(stimer)->kvm); > - ktime_now = ktime_get(); > - > - div64_u64_rem(time_now - stimer->exp_time, stimer->count, &remainder); > - stimer->exp_time = time_now + (stimer->count - remainder); > - > - hrtimer_start(&stimer->timer, > - ktime_add_ns(ktime_now, > - 100 * (stimer->exp_time - time_now)), > - HRTIMER_MODE_ABS); > -} > - > static int stimer_start(struct kvm_vcpu_hv_stimer *stimer) > { > u64 time_now; > @@ -450,9 +433,21 @@ static int stimer_start(struct kvm_vcpu_hv_stimer *stimer) > if (stimer->count == 0) > return -EINVAL; > > - stimer->exp_time = time_now + stimer->count; > + if (stimer->exp_time) { > + if (time_now >= stimer->exp_time) { Just for my education, is it possible to have this function called with stimer->exp_time != 0 && time_now < stimer->exp_time? Paolo > + u64 remainder; > + > + div64_u64_rem(time_now - stimer->exp_time, > + stimer->count, &remainder); > + stimer->exp_time = > + time_now + (stimer->count - remainder); > + } > + } else > + stimer->exp_time = time_now + stimer->count; > + > hrtimer_start(&stimer->timer, > - ktime_add_ns(ktime_now, 100 * stimer->count), > + ktime_add_ns(ktime_now, > + 100 * (stimer->exp_time - time_now)), > HRTIMER_MODE_ABS); > return 0; > } > @@ -580,7 +575,7 @@ static void stimer_expiration(struct kvm_vcpu_hv_stimer *stimer) > if (!(stimer->config & HV_STIMER_PERIODIC)) > stimer->config |= ~HV_STIMER_ENABLE; > else > - stimer_restart(stimer); > + stimer_start(stimer); > } > > void kvm_hv_process_stimers(struct kvm_vcpu *vcpu) >