From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49759) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHDU4-0007kL-2C for qemu-devel@nongnu.org; Thu, 07 Jan 2016 11:32:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aHDU0-00030I-Jk for qemu-devel@nongnu.org; Thu, 07 Jan 2016 11:32:20 -0500 Received: from mx1.redhat.com ([209.132.183.28]:36050) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aHDU0-0002zx-Bm for qemu-devel@nongnu.org; Thu, 07 Jan 2016 11:32:16 -0500 References: <1450870121-15943-1-git-send-email-asmetanin@virtuozzo.com> <1450870121-15943-3-git-send-email-asmetanin@virtuozzo.com> From: Paolo Bonzini Message-ID: <568E9309.8010905@redhat.com> Date: Thu, 7 Jan 2016 17:32:09 +0100 MIME-Version: 1.0 In-Reply-To: <1450870121-15943-3-git-send-email-asmetanin@virtuozzo.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH v1 2/6] kvm/x86: Hyper-V unify stimer_start() and stimer_restart() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Andrey Smetanin , kvm@vger.kernel.org Cc: Gleb Natapov , "Denis V. Lunev" , Roman Kagan , qemu-devel@nongnu.org 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) >