[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <517687AB.1040309@pengutronix.de>
Date: Tue, 23 Apr 2013 15:07:55 +0200
From: Marc Kleine-Budde <mkl@...gutronix.de>
To: Shawn Guo <shawn.guo@...aro.org>
CC: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
Andres Salomon <dilinger@...ued.net>, arm@...nel.org,
John Stultz <john.stultz@...aro.org>,
Nicolas Ferre <nicolas.ferre@...el.com>,
"kernel@...gutronix.de" <kernel@...gutronix.de>
Subject: BUG: Re: [PATCH v2 3/3] clocksource: use clockevents_config_and_register()
where possible
Hello,
On 01/12/2013 12:50 PM, Shawn Guo wrote:
> The clockevent core is able to figure out the best mult and shift,
> calculate min_delta_ns and max_delta_ns, with the necessary info passed
> into clockevents_config_and_register(). Use this combined configure
> and register function where possible to make the codes less error prone
> and gain some positive diff stat.
>
> Signed-off-by: Shawn Guo <shawn.guo@...aro.org>
> Cc: Andres Salomon <dilinger@...ued.net>
> Cc: Nicolas Ferre <nicolas.ferre@...el.com>
> Acked-by: Maxime Ripard <maxime.ripard@...e-electrons.com>
[...]
I just bisected a timer problem down to this commit.
> diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c
> index 32cb929..8a61872 100644
> --- a/drivers/clocksource/tcb_clksrc.c
> +++ b/drivers/clocksource/tcb_clksrc.c
> @@ -157,7 +157,6 @@ static struct tc_clkevt_device clkevt = {
> .name = "tc_clkevt",
> .features = CLOCK_EVT_FEAT_PERIODIC
> | CLOCK_EVT_FEAT_ONESHOT,
> - .shift = 32,
> /* Should be lower than at91rm9200's system timer */
> .rating = 125,
> .set_next_event = tc_next_event,
> @@ -196,13 +195,9 @@ static void __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx)
>
> timer_clock = clk32k_divisor_idx;
>
> - clkevt.clkevt.mult = div_sc(32768, NSEC_PER_SEC, clkevt.clkevt.shift);
> - clkevt.clkevt.max_delta_ns
> - = clockevent_delta2ns(0xffff, &clkevt.clkevt);
> - clkevt.clkevt.min_delta_ns = clockevent_delta2ns(1, &clkevt.clkevt) + 1;
^^^^^^
With this patch, the "+ 1" gets lost, resulting in a different
"min_delta_ns".
good:
setup_clkevents: shift=32 mult=140737 min=30518 max=1999976422
bad:
setup_clkevents: shift=32 mult=140737 min=30517 max=1999976422
This leads to problems with schedule_delayed_work() with a delay of
"1". These worksqueues seem to be hanging for several seconds. I'll
send a RFC patch.
> clkevt.clkevt.cpumask = cpumask_of(0);
>
> - clockevents_register_device(&clkevt.clkevt);
> + clockevents_config_and_register(&clkevt.clkevt, 32768, 1, 0xffff);
>
> setup_irq(irq, &tc_irqaction);
> }
>
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Industrial Linux Solutions | Phone: +49-231-2826-924 |
Vertretung West/Dortmund | Fax: +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
Download attachment "signature.asc" of type "application/pgp-signature" (264 bytes)
Powered by blists - more mailing lists