All of lore.kernel.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: 62+ 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-13 13:02 ` Marc Kleine-Budde
2013-09-17  9:56 ` Ludovic Desroches
2013-09-17 10:04   ` Russell King - ARM Linux
2013-09-17 10:04     ` Russell King - ARM Linux
2013-09-17 11:26     ` Thomas Gleixner
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 21:15           ` Thomas Gleixner
2013-09-17 22:25           ` Marc Kleine-Budde
2013-09-17 22:25             ` Marc Kleine-Budde
2013-09-17 23:20             ` Thomas Gleixner
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  8:56             ` Uwe Kleine-König
2013-09-18  9:38             ` Thomas Gleixner
2013-09-18  9:38               ` Thomas Gleixner
2013-09-18 15:09               ` Uwe Kleine-König
2013-09-18 15:09                 ` Uwe Kleine-König
2013-09-18 22:01                 ` Thomas Gleixner
2013-09-18 22:01                   ` Thomas Gleixner
2013-09-19 10:02                   ` Uwe Kleine-König
2013-09-19 10:02                     ` Uwe Kleine-König
2013-09-19 10:15                     ` Thomas Gleixner
2013-09-19 10:15                       ` Thomas Gleixner
2013-09-19 12:48                       ` Uwe Kleine-König
2013-09-19 12:48                         ` Uwe Kleine-König
2013-09-19 13:12                         ` Thomas Gleixner
2013-09-19 13:12                           ` Thomas Gleixner
2013-09-19 14:30                         ` Thomas Gleixner
2013-09-19 14:30                           ` Thomas Gleixner
2013-09-19 20:03                           ` Uwe Kleine-König
2013-09-19 20:03                             ` Uwe Kleine-König
2013-09-20  9:56                             ` Thomas Gleixner
2013-09-20  9:56                               ` Thomas Gleixner
2013-09-20 20:41                               ` Uwe Kleine-König
2013-09-20 20:41                                 ` Uwe Kleine-König
2013-09-20 21:30                                 ` Thomas Gleixner
2013-09-20 21:30                                   ` Thomas Gleixner
2013-09-24 19:50                           ` [PATCH v2] " Uwe Kleine-König
2013-09-24 19:50                             ` 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-09-24 21:11                               ` Uwe Kleine-König
2013-10-04 10:00                               ` Nicolas Ferre
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-09-24 21:16                               ` Uwe Kleine-König
2013-10-08 10:08                             ` Marc Kleine-Budde
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-08 15:31                                 ` Uwe Kleine-König
2013-10-14  7:34                                 ` [GIT PULL] fixes for integer rounding in timer core Uwe Kleine-König
2013-10-14  7:34                                   ` Uwe Kleine-König
2013-10-16 14:19                                   ` Nicolas Ferre
2013-10-16 14:19                                     ` Nicolas Ferre
2013-10-21  7:12                                   ` Uwe Kleine-König
2013-10-21  7:12                                     ` Uwe Kleine-König
2013-10-21 20:53                                     ` Daniel Lezcano
2013-10-21 20:53                                       ` Daniel Lezcano
2013-10-23 10:56                             ` [tip:timers/urgent] clockevents: Sanitize ticks to nsec conversion tip-bot for Thomas Gleixner

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.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.