From: ludovic.desroches@atmel•com (Ludovic Desroches)
To: linux-arm-kernel@lists•infradead.org
Subject: [PATCH] [PATCH] clocksource: tcb: fix min_delta calculation
Date: Tue, 17 Sep 2013 15:01:54 +0200 [thread overview]
Message-ID: <20130917130153.GL26819@ludovic.desroches@atmel.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1309171210450.4089@ionos.tec.linutronix.de>
On Tue, Sep 17, 2013 at 01:26:56PM +0200, Thomas Gleixner wrote:
> On Tue, 17 Sep 2013, Russell King - ARM Linux wrote:
>
> > On Tue, Sep 17, 2013 at 11:56:00AM +0200, Ludovic Desroches wrote:
> > > Any reason to not do this:
> > >
> > > --- a/drivers/clocksource/tcb_clksrc.c
> > > +++ b/drivers/clocksource/tcb_clksrc.c
> > > @@ -144,6 +144,9 @@ static void tc_mode(enum clock_event_mode m, struct
> > > clock_event_device *d)
> > >
> > > static int tc_next_event(unsigned long delta, struct clock_event_device
> > > *d)
> > > {
> > > + if (delta < d->min_delta_ticks)
> > > + delta = d->min_delta_ticks;
> > > +
> > > __raw_writel(delta, tcaddr + ATMEL_TC_REG(2, RC));
> > >
> > > /* go go gadget! */
> > >
> > > Then we can keep the same min_delta.
> >
> > You really should not play such games in your set_next_event() code - if
> > the interval is not supported, you should return -ETIME so that the core
> > code knows about it and can adjust things to suit. If you're getting
> > deltas which are too small for the hardware, that'll either be because
> > the bounds are wrong, or there's a bug in the core code.
>
> The core code does:
>
> int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
> bool force)
> {
> ....
>
> delta = min(delta, (int64_t) dev->max_delta_ns);
> delta = max(delta, (int64_t) dev->min_delta_ns);
>
> clc = ((unsigned long long) delta * dev->mult) >> dev->shift;
> rc = dev->set_next_event((unsigned long) clc, dev);
>
> }
>
> So, the min_delta in timer ticks is set to 1 and converted by the core
> to nsecs for various reasons. This is where the rounding problem comes
> into play.
>
> The patch below should fix that.
Yes it works with s/dev/evt.
Thanks
>
> Thanks,
>
> tglx
> ----
> diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c
> index 38959c8..41b7a30 100644
> --- a/kernel/time/clockevents.c
> +++ b/kernel/time/clockevents.c
> @@ -42,7 +42,7 @@ struct ce_unbind {
> */
> u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt)
> {
> - u64 clc = (u64) latch << evt->shift;
> + u64 tmp, clc = (u64) latch << evt->shift;
>
> if (unlikely(!evt->mult)) {
> evt->mult = 1;
> @@ -52,6 +52,14 @@ u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt)
> do_div(clc, evt->mult);
> if (clc < 1000)
> clc = 1000;
> +
> + /* Avoid rounding artifacts */
> + tmp = (clc * dev->mult) >> dev->shift;
> + while (tmp < (u64) dev->min_delta_ticks) {
> + clc += 1000;
> + tmp = (clc * dev->mult) >> dev->shift;
> + }
> +
> if (clc > KTIME_MAX)
> clc = KTIME_MAX;
>
next prev parent reply other threads:[~2013-09-17 13:01 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-13 13:02 [PATCH] [PATCH] clocksource: tcb: fix min_delta calculation Marc Kleine-Budde
2013-09-17 9:56 ` Ludovic Desroches
2013-09-17 10:04 ` Russell King - ARM Linux
2013-09-17 11:26 ` Thomas Gleixner
2013-09-17 13:01 ` Ludovic Desroches [this message]
2013-09-17 21:15 ` [PATCH] clockevents: Sanitize ticks to nsec conversion Thomas Gleixner
2013-09-17 22:25 ` Marc Kleine-Budde
2013-09-17 23:20 ` Thomas Gleixner
2013-09-18 7:33 ` Ludovic Desroches
2013-09-18 8:56 ` Uwe Kleine-König
2013-09-18 9:38 ` Thomas Gleixner
2013-09-18 15:09 ` Uwe Kleine-König
2013-09-18 22:01 ` Thomas Gleixner
2013-09-19 10:02 ` Uwe Kleine-König
2013-09-19 10:15 ` Thomas Gleixner
2013-09-19 12:48 ` Uwe Kleine-König
2013-09-19 13:12 ` Thomas Gleixner
2013-09-19 14:30 ` Thomas Gleixner
2013-09-19 20:03 ` Uwe Kleine-König
2013-09-20 9:56 ` Thomas Gleixner
2013-09-20 20:41 ` Uwe Kleine-König
2013-09-20 21:30 ` Thomas Gleixner
2013-09-24 19:50 ` [PATCH v2] " Uwe Kleine-König
2013-09-24 21:11 ` Timekeeping on at91rm9200 [Was: [PATCH v2] clockevents: Sanitize ticks to nsec conversion] Uwe Kleine-König
2013-10-04 10:00 ` Nicolas Ferre
2013-09-24 21:16 ` [PATCH v2] clockevents: Sanitize ticks to nsec conversion Uwe Kleine-König
2013-10-08 10:08 ` Marc Kleine-Budde
2013-10-08 15:31 ` [GIT PULL] fixes for integer rounding in timer core (Was: [PATCH v2] clockevents: Sanitize ticks to nsec conversion) Uwe Kleine-König
2013-10-14 7:34 ` [GIT PULL] fixes for integer rounding in timer core Uwe Kleine-König
2013-10-16 14:19 ` Nicolas Ferre
2013-10-21 7:12 ` Uwe Kleine-König
2013-10-21 20:53 ` Daniel Lezcano
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=20130917130153.GL26819@ludovic.desroches@atmel.com \
--to=ludovic.desroches@atmel$(echo .)com \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox