Re: hrtimer problem on AT91RM9200
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Hello,
On Fri, Aug 21, 2009 at 02:57:43PM +0200, Bo Hansen wrote:
> Hi Uwe,
>
> I cannot find anything in the dmesg or serial output regarding the
> WARN_ON_ONCE(...)
> I guess the WARN_ON_ONCE(...) should show up in dmesg output?
>
> What puzzles me is that I tried the CONFIG_DEBUG_BUGVERBOSE=y
> also when I enabled CONFIG_DEBUG_INFO. When I do
> this I don't get the kernel panic. Is this somehow related to the
> WARN_ON_ONCE?
>
> Attachments only sent to Uwe - anybody are welcome to get a copy.
Hhhhmm, clkevt32k_next_event is called with delta=1 which hits
BUG_ON(delta < 2).
I calculated the clockeventdevice parameters by hand, and the numbers
look good:
clkevt.shift = 32
clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift)
= (32768 << 32) / 1000000000
= 140737
clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1
= (2 << clkevt.shift) / clkevt.mult + 1
= (2 << 32) / 140737 + 1
= 61036
min_delta = (clkevt.min_delta_ns * mult) >> clkevt.shift
= (61036 * 140737) >> 32
= 2
Can you please apply the patch below, reproduce and provide the two
lines of output resulting from the two added printks?
Best regards
Uwe
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c
index 1ff1bda..83a7379 100644
--- a/arch/arm/mach-at91/at91rm9200_time.c
+++ b/arch/arm/mach-at91/at91rm9200_time.c
@@ -136,7 +136,13 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
u32 alm;
int status = 0;
- BUG_ON(delta < 2);
+ if (unlikely(delta < 2)) {
+ pr_emerg("************** %s: shift=%d, mult=%lu, "
+ "min_delta_ns=%lu, dev=%pS\n", __func__,
+ dev->shift, dev->mult,
+ dev->min_delta_ns, dev);
+ BUG();
+ }
/* Use "raw" primitives so we behave correctly on RT kernels. */
raw_local_irq_save(flags);
@@ -205,6 +211,18 @@ void __init at91rm9200_timer_init(void)
clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt);
clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1;
+
+ {
+ unsigned long long clc = (int64_t)clkevt.min_delta_ns *
+ clkevt.mult;
+
+ clc >>= clkevt.shift;
+
+ pr_info("************** %s: shift=%d, mult=%lu, "
+ "min_delta_ns=%lu, minclc=%llu\n", __func__,
+ clkevt.shift, clkevt.mult,
+ clkevt.min_delta_ns, clc);
+ }
clkevt.cpumask = cpumask_of(0);
clockevents_register_device(&clkevt);
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[RT Stable]
[Kernel Newbies]
[Share Photos]
[IDE]
[Security]
[Git]
[Netfilter]
[Bugtraq]
[Photo]
[Yosemite]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Linux ATA RAID]
[Samba]
[Video 4 Linux]
[Device Mapper]
[Linux Resources]