From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, "Thomas Gleixner" <tglx@linutronix.de>,
"Russell King - ARM Linux" <linux@arm.linux.org.uk>,
"Marc Kleine-Budde" <mkl@pengutronix.de>,
"Marc Pignat" <marc.pignat@hevs.ch>,
"Ronald Wahl" <ronald.wahl@raritan.com>,
LAK <linux-arm-kernel@lists.infradead.org>,
"Ludovic Desroches" <ludovic.desroches@atmel.com>,
"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
nicolas.ferre@atmel.com, john.stultz@linaro.org,
kernel@pengutronix.de
Subject: [PATCH 3.10 33/74] clockevents: Sanitize ticks to nsec conversion
Date: Fri, 8 Nov 2013 22:51:38 -0800 [thread overview]
Message-ID: <20131109065115.845599488@linuxfoundation.org> (raw)
In-Reply-To: <20131109065113.502217951@linuxfoundation.org>
3.10-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <tglx@linutronix.de>
commit 97b9410643475d6557d2517c2aff9fd2221141a9 upstream.
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.
[ukl: move assignment to rnd after eventually changing mult, fix build
issue and correct comment with the right math]
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>
Link: http://lkml.kernel.org/r/1380052223-24139-1-git-send-email-u.kleine-koenig@pengutronix.de
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
kernel/time/clockevents.c | 65 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 50 insertions(+), 15 deletions(-)
--- a/kernel/time/clockevents.c
+++ b/kernel/time/clockevents.c
@@ -30,29 +30,64 @@ static RAW_NOTIFIER_HEAD(clockevents_cha
/* Protection for the above */
static DEFINE_RAW_SPINLOCK(clockevents_lock);
-/**
- * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds
- * @latch: value to convert
- * @evt: pointer to clock event device descriptor
- *
- * Math helper, returns latch value converted to nanoseconds (bound checked)
- */
-u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt)
+static u64 cev_delta2ns(unsigned long latch, struct clock_event_device *evt,
+ bool ismax)
{
u64 clc = (u64) latch << evt->shift;
+ u64 rnd;
if (unlikely(!evt->mult)) {
evt->mult = 1;
WARN_ON(1);
}
+ rnd = (u64) evt->mult - 1;
+
+ /*
+ * Upper bound sanity check. If the backwards conversion is
+ * not equal latch, we know that the above shift overflowed.
+ */
+ if ((clc >> evt->shift) != (u64)latch)
+ clc = ~0ULL;
+
+ /*
+ * Scaled math oddities:
+ *
+ * For mult <= (1 << shift) we can safely add mult - 1 to
+ * prevent integer rounding loss. So the backwards conversion
+ * from nsec to device ticks will be correct.
+ *
+ * For mult > (1 << shift), i.e. device frequency is > 1GHz we
+ * need to be careful. Adding mult - 1 will result in a value
+ * which when converted back to device ticks can be larger
+ * than latch by up to (mult - 1) >> shift. For the min_delta
+ * calculation we still want to apply this in order to stay
+ * above the minimum device ticks limit. For the upper limit
+ * we would end up with a latch value larger than the upper
+ * limit of the device, so we omit the add to stay below the
+ * device upper boundary.
+ *
+ * Also omit the add if it would overflow the u64 boundary.
+ */
+ if ((~0ULL - clc > rnd) &&
+ (!ismax || evt->mult <= (1U << evt->shift)))
+ clc += rnd;
do_div(clc, evt->mult);
- if (clc < 1000)
- clc = 1000;
- if (clc > KTIME_MAX)
- clc = KTIME_MAX;
- return clc;
+ /* Deltas less than 1usec are pointless noise */
+ return clc > 1000 ? clc : 1000;
+}
+
+/**
+ * clockevents_delta2ns - Convert a latch value (device ticks) to nanoseconds
+ * @latch: value to convert
+ * @evt: pointer to clock event device descriptor
+ *
+ * Math helper, returns latch value converted to nanoseconds (bound checked)
+ */
+u64 clockevent_delta2ns(unsigned long latch, struct clock_event_device *evt)
+{
+ return cev_delta2ns(latch, evt, false);
}
EXPORT_SYMBOL_GPL(clockevent_delta2ns);
@@ -317,8 +352,8 @@ void clockevents_config(struct clock_eve
sec = 600;
clockevents_calc_mult_shift(dev, freq, sec);
- dev->min_delta_ns = clockevent_delta2ns(dev->min_delta_ticks, dev);
- dev->max_delta_ns = clockevent_delta2ns(dev->max_delta_ticks, dev);
+ dev->min_delta_ns = cev_delta2ns(dev->min_delta_ticks, dev, false);
+ dev->max_delta_ns = cev_delta2ns(dev->max_delta_ticks, dev, true);
}
/**
next prev parent reply other threads:[~2013-11-09 6:51 UTC|newest]
Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-09 6:51 [PATCH 3.10 00/74] 3.10.19-stable review Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 01/74] usb-storage: add quirk for mandatory READ_CAPACITY_16 Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 02/74] USB: support new huawei devices in option.c Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 03/74] USB: quirks.c: add one device that cannot deal with suspension Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 04/74] USB: quirks: add touchscreen that is dazzeled by remote wakeup Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 05/74] USB: serial: ftdi_sio: add id for Z3X Box device Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 06/74] x86: Update UV3 hub revision ID Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 07/74] cpufreq / intel_pstate: Fix max_perf_pct on resume Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 08/74] bcache: Fixed incorrect order of arguments to bio_alloc_bioset() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 09/74] cgroup: fix to break the while loop in cgroup_attach_task() correctly Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 10/74] mac80211: correctly close cancelled scans Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 11/74] mac80211: drop spoofed packets in ad-hoc mode Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 12/74] mac80211: use sta_info_get_bss() for nl80211 tx and client probing Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 13/74] mac80211: update sta->last_rx on acked tx frames Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 14/74] mac80211: fix crash if bitrate calculation goes wrong Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 15/74] ath9k: fix tx queue scheduling after channel changes Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 16/74] cfg80211: fix warning when using WEXT for IBSS Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 17/74] mwifiex: fix SDIO interrupt lost issue Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 18/74] rtlwifi: rtl8192cu: Fix error in pointer arithmetic Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 19/74] iwlwifi: pcie: add SKUs for 6000, 6005 and 6235 series Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 20/74] jfs: fix error path in ialloc Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 21/74] can: at91-can: fix device to driver data mapping for platform devices Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 22/74] can: flexcan: fix mx28 detection by rearanging OF match table Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 23/74] can: flexcan: flexcan_chip_start: fix regression, mark one MB for TX and abort pending TX Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 24/74] SCSI: sd: call blk_pm_runtime_init before add_disk Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 25/74] ecryptfs: Fix memory leakage in keystore.c Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 26/74] raid5: set bio bi_vcnt 0 for discard request Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 27/74] raid5: avoid finding "discard" stripe Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 28/74] libata: make ata_eh_qc_retry() bump scmd->allowed on bogus failures Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 29/74] md: avoid deadlock when md_set_badblocks Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 30/74] md: Fix skipping recovery for read-only arrays Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 31/74] target/pscsi: fix return value check Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 32/74] vhost/scsi: Fix incorrect usage of get_user_pages_fast write parameter Greg Kroah-Hartman
2013-11-09 6:51 ` Greg Kroah-Hartman [this message]
2013-11-09 6:51 ` [PATCH 3.10 34/74] parisc: Do not crash 64bit SMP kernels on machines with >= 4GB RAM Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 35/74] scripts/kallsyms: filter symbols not in kernel address space Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 36/74] ARC: Incorrect mm reference used in vmalloc fault handler Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 37/74] ALSA: hda - Add missing initial vmaster hook at build_controls callback Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 38/74] ALSA: hda - Fix unbalanced runtime PM refcount after S3/S4 Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 39/74] ALSA: hda - Add a fixup for ASUS N76VZ Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 40/74] ALSA: fix oops in snd_pcm_info() caused by ASoC DPCM Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 41/74] ASoC: wm_hubs: Add missing break in hp_supply_event() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 42/74] ASoC: dapm: Fix source list debugfs outputs Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 43/74] staging: ozwpan: prevent overflow in oz_cdev_write() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 44/74] Staging: bcm: info leak in ioctl Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 45/74] Staging: sb105x: info leak in mp_get_count() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 46/74] staging: wlags49_h2: buffer overflow setting station name Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 47/74] uml: check length in exitcode_proc_write() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 48/74] xtensa: dont use alternate signal stack on threads Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 49/74] mm: make generic_access_phys available for modules Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 50/74] uio: provide vm access to UIO_MEM_PHYS maps Greg Kroah-Hartman
2013-11-09 14:22 ` Uwe Kleine-König
2013-11-09 16:10 ` Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 51/74] au1100fb: VM_IO is set by io_remap_pfn_range() Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 52/74] au1200fb: io_remap_pfn_range() sets VM_IO Greg Kroah-Hartman
2013-11-09 6:51 ` [PATCH 3.10 54/74] lib/scatterlist.c: dont flush_kernel_dcache_page on slab page Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 55/74] aacraid: missing capable() check in compat ioctl Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 56/74] clk: fixup argument order when setting VCO parameters Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 57/74] mm: numa: Do not account for a hinting fault if we raced Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 58/74] mm: Wait for THP migrations to complete during NUMA hinting faults Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 59/74] mm: Prevent parallel splits during THP migration Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 60/74] mm: numa: Sanitize task_numa_fault() callsites Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 61/74] mm: Close races between THP migration and PMD numa clearing Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 62/74] mm: Account for a THP NUMA hinting update as one PTE update Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 63/74] mm/pagewalk.c: fix walk_page_range() access of wrong PTEs Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 64/74] mm/vmalloc.c: fix an overflow bug in alloc_vmap_area() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 65/74] drm/vmwgfx: Dont put resources with invalid ids on lru list Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 66/74] drm/vmwgfx: Dont kill clients on VT switch Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 67/74] drm: Prevent overwriting from userspace underallocating core ioctl structs Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 68/74] drm: Pad drm_mode_get_connector to 64-bit boundary Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 69/74] drm/radeon/atom: workaround vbios bug in transmitter table on rs780 Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 70/74] seq_file: always update file->f_pos in seq_lseek() Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 71/74] NTB: Add Error Handling in ntb_device_setup Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 72/74] NTB: Correct Number of Scratch Pad Registers Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 73/74] NTB: Correct USD/DSD Identification Greg Kroah-Hartman
2013-11-09 6:52 ` [PATCH 3.10 74/74] NTB: Correct debugfs to work with more than 1 NTB Device Greg Kroah-Hartman
2013-11-09 17:01 ` [PATCH 3.10 00/74] 3.10.19-stable review Guenter Roeck
2013-11-09 17:12 ` Greg Kroah-Hartman
2013-11-10 11:51 ` Satoru Takeuchi
2013-11-10 15:15 ` Greg Kroah-Hartman
2013-11-11 17:56 ` Shuah Khan
2013-11-11 22:51 ` Greg Kroah-Hartman
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=20131109065115.845599488@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=john.stultz@linaro.org \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=ludovic.desroches@atmel.com \
--cc=marc.pignat@hevs.ch \
--cc=mkl@pengutronix.de \
--cc=nicolas.ferre@atmel.com \
--cc=ronald.wahl@raritan.com \
--cc=stable@vger.kernel.org \
--cc=tglx@linutronix.de \
--cc=u.kleine-koenig@pengutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).