All of lore.kernel.org
 help / color / mirror / Atom feed
From: mkl@pengutronix.de (Marc Kleine-Budde)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2] clockevents: Sanitize ticks to nsec conversion
Date: Tue, 08 Oct 2013 12:08:33 +0200	[thread overview]
Message-ID: <5253D9A1.1080106@pengutronix.de> (raw)
In-Reply-To: <1380052223-24139-1-git-send-email-u.kleine-koenig@pengutronix.de>

On 09/24/2013 09:50 PM, Uwe Kleine-K?nig wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Marc Kleine-Budde pointed out, that commit 77cc982 "clocksource: use
> clockevents_config_and_register() where possible" caused a regression
> for some of the converted subarchs.
> 
> The reason is, that the clockevents core code converts the minimal
> hardware tick delta to a nanosecond value for core internal
> usage. This conversion is affected by integer math rounding loss, so
> the backwards conversion to hardware ticks will likely result in a
> value which is less than the configured hardware limitation. The
> affected subarchs used their own workaround (SIGH!) which got lost in
> the conversion.
> 
> The solution for the issue at hand is simple: adding evt->mult - 1 to
> the shifted value before the integer divison in the core conversion
> function takes care of it. But this only works for the case where for
> the scaled math mult/shift pair "mult <= 1 << shift" is true. For the
> case where "mult > 1 << shift" we can apply the rounding add only for
> the minimum delta value to make sure that the backward conversion is
> not less than the given hardware limit. For the upper bound we need to
> omit the rounding add, because the backwards conversion is always
> larger than the original latch value. That would violate the upper
> bound of the hardware device.
> 
> Though looking closer at the details of that function reveals another
> bogosity: The upper bounds check is broken as well. Checking for a
> resulting "clc" value greater than KTIME_MAX after the conversion is
> pointless. The conversion does:
> 
>       u64 clc = (latch << evt->shift) / evt->mult;
> 
> So there is no sanity check for (latch << evt->shift) exceeding the
> 64bit boundary. The latch argument is "unsigned long", so on a 64bit
> arch the handed in argument could easily lead to an unnoticed shift
> overflow. With the above rounding fix applied the calculation before
> the divison is:
> 
>        u64 clc = (latch << evt->shift) + evt->mult - 1;
> 
> So we need to make sure, that neither the shift nor the rounding add
> is overflowing the u64 boundary.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: nicolas.ferre at atmel.com
> Cc: Marc Pignat <marc.pignat@hevs.ch>
> Cc: john.stultz at linaro.org
> Cc: kernel at pengutronix.de
> Cc: Ronald Wahl <ronald.wahl@raritan.com>
> Cc: LAK <linux-arm-kernel@lists.infradead.org>
> Cc: Ludovic Desroches <ludovic.desroches@atmel.com>
> [ukl: move assignment to rnd after eventually changing mult, fix build
>  issue and correct comment with the right math]
> Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>

What's the status of this patch?

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   |

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 259 bytes
Desc: OpenPGP digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20131008/e2dd9038/attachment.sig>

WARNING: multiple messages have this Message-ID (diff)
From: Marc Kleine-Budde <mkl@pengutronix.de>
To: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	nicolas.ferre@atmel.com, linux-kernel@vger.kernel.org,
	Marc Pignat <marc.pignat@hevs.ch>,
	Ludovic Desroches <ludovic.desroches@atmel.com>,
	john.stultz@linaro.org, kernel@pengutronix.de,
	Ronald Wahl <ronald.wahl@raritan.com>,
	LAK <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2] clockevents: Sanitize ticks to nsec conversion
Date: Tue, 08 Oct 2013 12:08:33 +0200	[thread overview]
Message-ID: <5253D9A1.1080106@pengutronix.de> (raw)
In-Reply-To: <1380052223-24139-1-git-send-email-u.kleine-koenig@pengutronix.de>

[-- Attachment #1: Type: text/plain, Size: 3160 bytes --]

On 09/24/2013 09:50 PM, Uwe Kleine-König wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Marc Kleine-Budde pointed out, that commit 77cc982 "clocksource: use
> clockevents_config_and_register() where possible" caused a regression
> for some of the converted subarchs.
> 
> The reason is, that the clockevents core code converts the minimal
> hardware tick delta to a nanosecond value for core internal
> usage. This conversion is affected by integer math rounding loss, so
> the backwards conversion to hardware ticks will likely result in a
> value which is less than the configured hardware limitation. The
> affected subarchs used their own workaround (SIGH!) which got lost in
> the conversion.
> 
> The solution for the issue at hand is simple: adding evt->mult - 1 to
> the shifted value before the integer divison in the core conversion
> function takes care of it. But this only works for the case where for
> the scaled math mult/shift pair "mult <= 1 << shift" is true. For the
> case where "mult > 1 << shift" we can apply the rounding add only for
> the minimum delta value to make sure that the backward conversion is
> not less than the given hardware limit. For the upper bound we need to
> omit the rounding add, because the backwards conversion is always
> larger than the original latch value. That would violate the upper
> bound of the hardware device.
> 
> Though looking closer at the details of that function reveals another
> bogosity: The upper bounds check is broken as well. Checking for a
> resulting "clc" value greater than KTIME_MAX after the conversion is
> pointless. The conversion does:
> 
>       u64 clc = (latch << evt->shift) / evt->mult;
> 
> So there is no sanity check for (latch << evt->shift) exceeding the
> 64bit boundary. The latch argument is "unsigned long", so on a 64bit
> arch the handed in argument could easily lead to an unnoticed shift
> overflow. With the above rounding fix applied the calculation before
> the divison is:
> 
>        u64 clc = (latch << evt->shift) + evt->mult - 1;
> 
> So we need to make sure, that neither the shift nor the rounding add
> is overflowing the u64 boundary.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Cc: Russell King - ARM Linux <linux@arm.linux.org.uk>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: nicolas.ferre@atmel.com
> Cc: Marc Pignat <marc.pignat@hevs.ch>
> Cc: john.stultz@linaro.org
> Cc: kernel@pengutronix.de
> Cc: Ronald Wahl <ronald.wahl@raritan.com>
> Cc: LAK <linux-arm-kernel@lists.infradead.org>
> Cc: Ludovic Desroches <ludovic.desroches@atmel.com>
> [ukl: move assignment to rnd after eventually changing mult, fix build
>  issue and correct comment with the right math]
> Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>

What's the status of this patch?

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   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

  parent reply	other threads:[~2013-10-08 10:08 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
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 [this message]
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=5253D9A1.1080106@pengutronix.de \
    --to=mkl@pengutronix.de \
    --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.