All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pavel Emelyanov <xemul@openvz.org>
To: Daniel Forrest <dan.forrest@ssec.wisc.edu>
Cc: Ingo Molnar <mingo@elte.hu>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Kirill Korotaev <dev@openvz.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH] x86: clean up hpet timer reinit
Date: Fri, 06 Feb 2009 20:00:00 +0300	[thread overview]
Message-ID: <498C6C90.4070806@openvz.org> (raw)
In-Reply-To: <20090206154201.GA28883@evergreen.ssec.wisc.edu>

Daniel Forrest wrote:
> On Fri, Feb 06, 2009 at 03:09:43PM +0100, Ingo Molnar wrote:
>> * Pavel Emelyanov <xemul@openvz.org> wrote:
>>
>>> Sorry for late response - took some time to re-check this...
>> Applied to tip:timers/urgent, thanks Pavel!
>>
>> Note, since i've already queued up the minimal fix i've created a delta 
>> cleanup patch from your v2 patch - see it below. (It is the exact same end 
>> result in terms of code, just a nicer splitup.)
>>
>> 	Ingo
>>
>> ------------------->
>> >From ff08f76d738d0ec0f334b187f61e160caa321d54 Mon Sep 17 00:00:00 2001
>> From: Pavel Emelyanov <xemul@openvz.org>
>> Date: Wed, 4 Feb 2009 13:40:31 +0300
>> Subject: [PATCH] x86: clean up hpet timer reinit
>>
>> Implement Linus's suggestion: introduce the hpet_cnt_ahead()
>> helper function to compare hpet time values - like other
>> wrapping counter comparisons are abstracted away elsewhere.
>> (jiffies, ktime_t, etc.)
>>
>> Reported-by: Kirill Korotaev <dev@openvz.org>
>> Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
>> Signed-off-by: Ingo Molnar <mingo@elte.hu>
>> ---
>>  arch/x86/kernel/hpet.c |   12 ++++++++++--
>>  1 files changed, 10 insertions(+), 2 deletions(-)
>>
>> diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
>> index c761f91..388254f 100644
>> --- a/arch/x86/kernel/hpet.c
>> +++ b/arch/x86/kernel/hpet.c
>> @@ -897,7 +897,7 @@ static unsigned long hpet_rtc_flags;
>>  static int hpet_prev_update_sec;
>>  static struct rtc_time hpet_alarm_time;
>>  static unsigned long hpet_pie_count;
>> -static unsigned long hpet_t1_cmp;
>> +static u32 hpet_t1_cmp;
>>  static unsigned long hpet_default_delta;
>>  static unsigned long hpet_pie_delta;
>>  static unsigned long hpet_pie_limit;
>> @@ -905,6 +905,14 @@ static unsigned long hpet_pie_limit;
>>  static rtc_irq_handler irq_handler;
>>  
>>  /*
>> + * Check that the hpet counter c1 is ahead of the c2
>> + */
>> +static inline int hpet_cnt_ahead(u32 c1, u32 c2)
>> +{
>> +	return (s32)(c2 - c1) < 0;
>> +}
>> +
>> +/*
>>   * Registers a IRQ handler.
>>   */
>>  int hpet_register_irq_handler(rtc_irq_handler handler)
>> @@ -1075,7 +1083,7 @@ static void hpet_rtc_timer_reinit(void)
>>  		hpet_t1_cmp += delta;
>>  		hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
>>  		lost_ints++;
>> -	} while ((s32)(hpet_readl(HPET_COUNTER) - hpet_t1_cmp) > 0);
>> +	} while (!hpet_cnt_ahead(hpet_t1_cmp, hpet_readl(HPET_COUNTER)));
> 
> These are not equivalent for the case where the values are equal.
> 
> Let "A = hpet_t1_cmp" and "B = hpet_readl(HPET_COUNTER)"
> 
> Then "!(A > B)" means "(B - A) >= 0" not "(B - A) > 0"
> 
> Shouldn't it be:
> 
> +	} while (hpet_cnt_ahead(hpet_readl(HPET_COUNTER), hpet_t1_cmp));
> 
> Or am I missing something?

When comparator it equal to counter (the corner case we're talking about) the
hpet_cnt_ahead will return false and the loop will go on shifting the cmp,
which is what we need here.

>>  
>>  	if (lost_ints) {
>>  		if (hpet_rtc_flags & RTC_PIE)
>> --
> 


  reply	other threads:[~2009-02-06 17:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-02-06  8:50 [PATCH] x86: fix hpet timer reinit for x86_64 (v2) Pavel Emelyanov
2009-02-06 14:09 ` [PATCH] x86: clean up hpet timer reinit Ingo Molnar
2009-02-06 15:42   ` Daniel Forrest
2009-02-06 17:00     ` Pavel Emelyanov [this message]
2009-02-06 17:11       ` Daniel Forrest

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=498C6C90.4070806@openvz.org \
    --to=xemul@openvz.org \
    --cc=dan.forrest@ssec.wisc.edu \
    --cc=dev@openvz.org \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.