RE: 2.6.31.4: WARNING: at arch/x86/kernel/hpet.c:390 hpet_next_event+0x70/0x80() [occurs when ACPI_PROCESSOR=y]

Pallipadi, Venkatesh
2009-11-14T01:12:16Z

On Fri, 2009-11-13 at 10:43 -0800, Justin Piszcz wrote:
>
> On Fri, 13 Nov 2009, Pallipadi, Venkatesh wrote:
>
> > On Fri, 2009-11-13 at 01:38 -0800, Thomas Gleixner wrote:
> >> On Thu, 12 Nov 2009, Pallipadi, Venkatesh wrote:
> >>> Yes. Yes. This is a hardware errata. I have a patch to workaround this and
> >>> waiting on the errata description to get published..
> >>
> >> Can we at least have some PCI quirk or whatever until you can push the
> >> final workaround out so peoples machines do not explode ?
> >
> > Its a harmless bug functionality-wise and should not have any side
> > effect other than triggering the WARN_ON_ONCE in hpet next event code.
> >
> > Thanks,
> > Venki
> >
>
> Venki,
>
> When the following patch is applied though: (courtesy of john stultz)
>

Justin,

I am missing something in here.
Without the below patch, on 2.6.31.4 and ACPI_PROCESSOR loaded (either
as module or builtin), you may see the WARNING. But, that should not
cause any other problems with C-states, P-states, or anything else.
Is that what you are seeing?

The below patch is not a workaround for the problem. Infact it will make
situation worse with constant stream of prinkts and can reduce the
C-state residency and turbo upside.

Thanks,
Venki

> --- a/arch/x86/kernel/hpet.c
> +++ b/arch/x86/kernel/hpet.c
> @@ -376,7 +376,7 @@ static void hpet_set_mode(enum clock_event_mode mode,
> static int hpet_next_event(unsigned long delta,
> struct clock_event_device *evt, int timer)
> {
> - u32 cnt;
> + u32 cnt, check;
>
> cnt = hpet_readl(HPET_COUNTER);
> cnt += (u32) delta;
> @@ -387,7 +387,12 @@ static int hpet_next_event(unsigned long delta,
> * what we wrote hit the chip before we compare it to the
> * counter.
> */
> - WARN_ON_ONCE((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt);
> + check = (u32)hpet_readl(HPET_Tn_CMP(timer));
> + if(check != cnt) {
> + printk("hpet_next_event: hpet_writel failed: 0x%x != 0x%x\n",
> + check, cnt);
> + hpet_writel(cnt, HPET_Tn_CMP(timer));
> + }
>
> return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
> }
>