public inbox for linux-arm-kernel@lists.infradead.org 
 help / color / mirror / Atom feed
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;
>  

  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