From: Nicolai Stange <nicstange@gmail.com>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: John Stultz <john.stultz@linaro.org>,
linux-kernel@vger.kernel.org,
Nicolai Stange <nicstange@gmail.com>
Subject: [RFC v5 00/23] adapt clockevents frequencies to mono clock
Date: Sun, 4 Sep 2016 03:01:37 +0200 [thread overview]
Message-ID: <20160904010200.17200-1-nicstange@gmail.com> (raw)
Goal: avoid programming ced devices too early for large deltas, for
details, for details, c.f. the description of [21/23].
Previous v4 of this series can be found here:
http://lkml.kernel.org/r/20160822233320.4548-1-nicstange@gmail.com
Raised concerns were
1.) There should be a flag available which when enabled, should
exclude a ced from getting its ->mult adjusted.
2.) The ns2cyc multiplication in clockevents_program_event() can
overflow with the adjusted ->mult.
The first item is addressed by the new
[13/23] ("clockevents: introduce CLOCK_EVT_FEAT_NO_ADJUST flag"),
the second by
[14/23] ("clockevents: decouple ->max_delta_ns from ->max_delta_ticks")
A note regarding the CLOCK_EVT_FEAT_NO_ADJUST flag: we probably want
to set it for the ->mult = 1, ->shift = 0 devices. However, since the
frequency adjustments are small (and bounded), they actually translate
to noops for those ceds. Thus, setting it there would be a matter of
style and optimization and I left this out for now.
This series can be divided into logical subseries as follows:
[1-6/23] Don't modify ced rate after registrations through mechanisms
other than clockevents_update_freq().
[7-12/23] Let all ced devices set their ->*_delta_ticks values and let
the clockevent core do the rest.
[13/23] Introduce the CLOCK_EVT_FEAT_NO_ADJUST flag
[14-20/23] Fiddle around with the bound checking code in order to
allow for non-atomic frequency updates from a CPU different
than where the ced is programmed.
[21-23/23] Actually do the frequency adjustments.
Tested on x86_64 and next-20160825.
Changes to v4:
[1-12/23] Unchanged
[13/23] ("clockevents: introduce CLOCK_EVT_FEAT_NO_ADJUST flag")
New.
[14/23] ("clockevents: decouple ->max_delta_ns from ->max_delta_ticks")
New. Solves the overflow problem the former
[13/22] ("clockevents: check a programmed delta's bounds in terms of cycles")
from v4 introduced.
(Note that the former
[14/22] ("clockevents: clockevents_program_event(): turn clc into unsigned long")
from v4 has been purged.)
[15/23] ("clockevents: do comparison of delta against minimum in terms of cycles")
This is the former
[13/22] ("clockevents: check a programmed delta's bounds in terms of cycles"),
but only for the ->min_delta_* -- the ->max_delta_* are handled by [14/23] now.
[16/23] ("clockevents: clockevents_program_min_delta(): don't set ->next_event")
Former [15/22] unchanged.
[17/23] ("clockevents: use ->min_delta_ticks_adjusted to program minimum delta")
Former [16/22]. Trivially fix compilation error with
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=n.
[18/22] ("clockevents: min delta increment: calculate min_delta_ns from ticks")
Former [17/22] unchanged.
[19/23] ("timer_list: print_tickdevice(): calculate ->min_delta_ns dynamically")
Corresponds to former
[18/22] ("timer_list: print_tickdevice(): calculate ->*_delta_ns dynamically")
from v4, but only for ->min_delta_ns. The changes required for the display of
->max_delta_ns are now being made in [14/23] already.
[20/23] ("clockevents: purge ->min_delta_ns")
Corresponds to former
[19/22] ("clockevents: purge ->min_delta_ns and ->max_delta_ns"),
but with ->max_delta_ns being kept.
[21/23] ("clockevents: initial support for mono to raw time conversion")
Former [20/22] with the following changes:
- Don't adjust mult for those ced's that have CLOCK_EVT_FEAT_NO_ADJUST set.
- Don't meld __clockevents_update_bounds() into __clockevents_adjust_freq()
anymore: the bounds for those devices having CLOCK_EVT_FEAT_NO_ADJUST set
must have got their bounds set as well.
- In __clockevents_calc_adjust_freq(), make sure that the adjusted mult
doesn't exceed the original by more than 12.5%. C.f. [14/23].
- In timekeeping, define timekeeping_get_mono_mult() only for
CONFIG_GENERIC_CLOCKEVENTS=y.
[22/23] ("clockevents: make setting of ->mult and ->mult_adjusted atomic")
Former [12/22], but with the description updated: previously, it said that
this patch would introduce a new locking dependency. This is not true.
[23/23] ("timekeeping: inform clockevents about freq adjustments")
Former [22/22] with the following changes:
- Don't adjust mult for those ced's that have CLOCK_EVT_FEAT_NO_ADJUST set.
- In clockevents_adjust_all_freqs(), reuse the adjusted cached mult only
if the associated ->shift also matches.
- Introduce noop clockevents_adjust_all_freqs() in order to fix a
compilation error with CONFIG_GENERIC_CLOCKEVENTS=n.
Nicolai Stange (23):
clocksource: sh_cmt: compute rate before registration again
clocksource: sh_tmu: compute rate before registration again
clocksource: em_sti: split clock prepare and enable steps
clocksource: em_sti: compute rate before registration
clocksource: h8300_timer8: don't reset rate in ->set_state_oneshot()
clockevents: make clockevents_config() static
many clockevent drivers: set ->min_delta_ticks and ->max_delta_ticks
arch/s390/kernel/time: set ->min_delta_ticks and ->max_delta_ticks
arch/x86/platform/uv/uv_time: set ->min_delta_ticks and
->max_delta_ticks
arch/tile/kernel/time: set ->min_delta_ticks and ->max_delta_ticks
clockevents: always initialize ->min_delta_ns and ->max_delta_ns
many clockevent drivers: don't set ->min_delta_ns and ->max_delta_ns
clockevents: introduce CLOCK_EVT_FEAT_NO_ADJUST flag
clockevents: decouple ->max_delta_ns from ->max_delta_ticks
clockevents: do comparison of delta against minimum in terms of cycles
clockevents: clockevents_program_min_delta(): don't set ->next_event
clockevents: use ->min_delta_ticks_adjusted to program minimum delta
clockevents: min delta increment: calculate min_delta_ns from ticks
timer_list: print_tickdevice(): calculate ->min_delta_ns dynamically
clockevents: purge ->min_delta_ns
clockevents: initial support for mono to raw time conversion
clockevents: make setting of ->mult and ->mult_adjusted atomic
timekeeping: inform clockevents about freq adjustments
arch/avr32/kernel/time.c | 4 +-
arch/blackfin/kernel/time-ts.c | 8 +-
arch/c6x/platforms/timer64.c | 4 +-
arch/hexagon/kernel/time.c | 4 +-
arch/m68k/coldfire/pit.c | 6 +-
arch/microblaze/kernel/timer.c | 6 +-
arch/mips/alchemy/common/time.c | 4 +-
arch/mips/jz4740/time.c | 4 +-
arch/mips/kernel/cevt-bcm1480.c | 4 +-
arch/mips/kernel/cevt-ds1287.c | 4 +-
arch/mips/kernel/cevt-gt641xx.c | 4 +-
arch/mips/kernel/cevt-sb1250.c | 4 +-
arch/mips/kernel/cevt-txx9.c | 5 +-
arch/mips/loongson32/common/time.c | 4 +-
arch/mips/loongson64/common/cs5536/cs5536_mfgpt.c | 4 +-
arch/mips/loongson64/loongson-3/hpet.c | 4 +-
arch/mips/ralink/cevt-rt3352.c | 4 +-
arch/mips/sgi-ip27/ip27-timer.c | 4 +-
arch/mn10300/kernel/cevt-mn10300.c | 4 +-
arch/powerpc/kernel/time.c | 6 +-
arch/s390/kernel/time.c | 4 +-
arch/score/kernel/time.c | 6 +-
arch/sparc/kernel/time_32.c | 4 +-
arch/sparc/kernel/time_64.c | 6 +-
arch/tile/kernel/time.c | 4 +-
arch/um/kernel/time.c | 4 +-
arch/unicore32/kernel/time.c | 6 +-
arch/x86/kernel/apic/apic.c | 12 +-
arch/x86/lguest/boot.c | 4 +-
arch/x86/platform/uv/uv_time.c | 6 +-
arch/x86/xen/time.c | 8 +-
drivers/clocksource/dw_apb_timer.c | 5 +-
drivers/clocksource/em_sti.c | 49 +++--
drivers/clocksource/h8300_timer8.c | 8 -
drivers/clocksource/metag_generic.c | 4 +-
drivers/clocksource/numachip.c | 4 +-
drivers/clocksource/sh_cmt.c | 50 ++---
drivers/clocksource/sh_tmu.c | 26 +--
drivers/clocksource/timer-atlas7.c | 4 +-
include/linux/clockchips.h | 21 +-
kernel/time/clockevents.c | 221 ++++++++++++++++++----
kernel/time/tick-broadcast-hrtimer.c | 2 -
kernel/time/tick-internal.h | 6 +
kernel/time/timekeeping.c | 19 ++
kernel/time/timer_list.c | 9 +-
45 files changed, 379 insertions(+), 204 deletions(-)
--
2.9.3
next reply other threads:[~2016-09-04 1:20 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-04 1:01 Nicolai Stange [this message]
2016-09-04 1:01 ` [RFC v5 01/23] clocksource: sh_cmt: compute rate before registration again Nicolai Stange
2016-09-04 1:01 ` [RFC v5 02/23] clocksource: sh_tmu: " Nicolai Stange
2016-09-04 1:01 ` [RFC v5 03/23] clocksource: em_sti: split clock prepare and enable steps Nicolai Stange
2016-09-04 1:01 ` [RFC v5 04/23] clocksource: em_sti: compute rate before registration Nicolai Stange
2016-09-04 1:01 ` [RFC v5 05/23] clocksource: h8300_timer8: don't reset rate in ->set_state_oneshot() Nicolai Stange
2016-09-04 1:01 ` [RFC v5 06/23] clockevents: make clockevents_config() static Nicolai Stange
2016-09-04 1:01 ` [RFC v5 07/23] many clockevent drivers: set ->min_delta_ticks and ->max_delta_ticks Nicolai Stange
2016-09-04 1:01 ` [RFC v5 08/23] arch/s390/kernel/time: " Nicolai Stange
2016-09-04 1:01 ` [RFC v5 09/23] arch/x86/platform/uv/uv_time: " Nicolai Stange
2016-09-04 1:01 ` [RFC v5 10/23] arch/tile/kernel/time: " Nicolai Stange
2016-09-04 1:01 ` [RFC v5 11/23] clockevents: always initialize ->min_delta_ns and ->max_delta_ns Nicolai Stange
2016-09-04 1:28 ` [RFC v5 12/23] many clockevent drivers: don't set " Nicolai Stange
2016-09-04 1:28 ` [RFC v5 13/23] clockevents: introduce CLOCK_EVT_FEAT_NO_ADJUST flag Nicolai Stange
2016-09-04 1:28 ` [RFC v5 14/23] clockevents: decouple ->max_delta_ns from ->max_delta_ticks Nicolai Stange
2016-09-04 1:28 ` [RFC v5 15/23] clockevents: do comparison of delta against minimum in terms of cycles Nicolai Stange
2016-09-04 1:28 ` [RFC v5 16/23] clockevents: clockevents_program_min_delta(): don't set ->next_event Nicolai Stange
2016-09-04 1:28 ` [RFC v5 17/23] clockevents: use ->min_delta_ticks_adjusted to program minimum delta Nicolai Stange
2016-09-04 1:28 ` [RFC v5 18/23] clockevents: min delta increment: calculate min_delta_ns from ticks Nicolai Stange
2016-09-04 1:28 ` [RFC v5 19/23] timer_list: print_tickdevice(): calculate ->min_delta_ns dynamically Nicolai Stange
2016-09-04 1:28 ` [RFC v5 20/23] clockevents: purge ->min_delta_ns Nicolai Stange
2016-09-04 1:28 ` [RFC v5 21/23] clockevents: initial support for mono to raw time conversion Nicolai Stange
2016-09-04 9:50 ` Nicolai Stange
2016-09-04 1:28 ` [RFC v5 22/23] clockevents: make setting of ->mult and ->mult_adjusted atomic Nicolai Stange
2016-09-04 1:28 ` [RFC v5 23/23] timekeeping: inform clockevents about freq adjustments Nicolai Stange
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=20160904010200.17200-1-nicstange@gmail.com \
--to=nicstange@gmail.com \
--cc=john.stultz@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tglx@linutronix.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