Messages in this thread |  | | Subject | RE: 2.6.31.4: WARNING: at arch/x86/kernel/hpet.c:390 hpet_next_event+0x70/0x80() [occurs when ACPI_PROCESSOR=y] | | From | "Pallipadi, Venkatesh" <> | | Date | Fri, 13 Nov 2009 17:12:19 -0800 |
| |
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; > } >
|  |