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 v7 00/23] adapt clockevents frequencies to mono clock
Date: Fri, 16 Sep 2016 22:08:28 +0200 [thread overview]
Message-ID: <20160916200851.9273-1-nicstange@gmail.com> (raw)
Goal: avoid programming ced devices too early for large deltas, for
details, c.f. the description of [21/23].
Previous v6 can be found here:
http://lkml.kernel.org/r/20160909200033.32103-1-nicstange@gmail.com
Your objections [0] to v6 have both been towards
[1/23] ("clocksource: sh_cmt: compute rate before registration again"),
namely
- there was a coding style issue due to the removal of braces at an if
statement
- and I carried the original mult/shift calculation over rather than
using clockevents_calc_mult_shift() instead.
I fixed the first issue up. However, I did nothing regarding the
second one because I'd not feel very confident about doing this
cleanup: I don't know why the shift value is set the way it is and
thus, I can't tell whether this would break anything. If you still
insist on me doing this, I'd prefer to send a patch separate from this
series such that it could get merged, dropped (or reverted)
independently...
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-20160916.
[0] http://lkml.kernel.org/r/alpine.DEB.2.20.1609101416420.32361@nanos
Changes to v6:
Rebased against next-20160916.
[1/23] ("clocksource: sh_cmt: compute rate before registration again")
Do not remove braces at if statement.
Changes to v5:
[21/23] ("clockevents: initial support for mono to raw time conversion")
Replace the max_t() in
adj = max_t(u64, adj, mult_ce_raw / 8);
by min_t(): mult_ce_raw / 8 actually sets an upper bound on the
mult adjustments.
[23/23] ("timekeeping: inform clockevents about freq adjustments")
Move the clockevents_adjust_all_freqs() invocation from
timekeeping_apply_adjustment() to timekeeping_freqadjust().
Reason is given in the patch description.
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 | 45 +++--
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 | 16 ++
kernel/time/timer_list.c | 9 +-
45 files changed, 374 insertions(+), 201 deletions(-)
--
2.10.0
next reply other threads:[~2016-09-16 20:11 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-16 20:08 Nicolai Stange [this message]
2016-09-16 20:08 ` [RFC v7 01/23] clocksource: sh_cmt: compute rate before registration again Nicolai Stange
2016-09-16 20:08 ` [RFC v7 02/23] clocksource: sh_tmu: " Nicolai Stange
2016-09-16 20:08 ` [RFC v7 03/23] clocksource: em_sti: split clock prepare and enable steps Nicolai Stange
2016-09-16 20:08 ` [RFC v7 04/23] clocksource: em_sti: compute rate before registration Nicolai Stange
2016-09-16 20:08 ` [RFC v7 05/23] clocksource: h8300_timer8: don't reset rate in ->set_state_oneshot() Nicolai Stange
2016-09-16 20:08 ` [RFC v7 06/23] clockevents: make clockevents_config() static Nicolai Stange
2016-09-16 20:08 ` [RFC v7 07/23] many clockevent drivers: set ->min_delta_ticks and ->max_delta_ticks Nicolai Stange
2016-09-16 20:08 ` [RFC v7 08/23] arch/s390/kernel/time: " Nicolai Stange
2016-09-16 20:08 ` [RFC v7 09/23] arch/x86/platform/uv/uv_time: " Nicolai Stange
2016-09-16 20:08 ` [RFC v7 10/23] arch/tile/kernel/time: " Nicolai Stange
2016-09-16 20:08 ` [RFC v7 11/23] clockevents: always initialize ->min_delta_ns and ->max_delta_ns Nicolai Stange
2016-09-16 20:11 ` [RFC v7 12/23] many clockevent drivers: don't set " Nicolai Stange
2016-09-16 20:11 ` [RFC v7 13/23] clockevents: introduce CLOCK_EVT_FEAT_NO_ADJUST flag Nicolai Stange
2016-09-16 20:11 ` [RFC v7 14/23] clockevents: decouple ->max_delta_ns from ->max_delta_ticks Nicolai Stange
2016-09-16 20:11 ` [RFC v7 15/23] clockevents: do comparison of delta against minimum in terms of cycles Nicolai Stange
2016-09-16 20:11 ` [RFC v7 16/23] clockevents: clockevents_program_min_delta(): don't set ->next_event Nicolai Stange
2016-09-16 20:11 ` [RFC v7 17/23] clockevents: use ->min_delta_ticks_adjusted to program minimum delta Nicolai Stange
2016-09-16 20:11 ` [RFC v7 18/23] clockevents: min delta increment: calculate min_delta_ns from ticks Nicolai Stange
2016-09-16 20:12 ` [RFC v7 19/23] timer_list: print_tickdevice(): calculate ->min_delta_ns dynamically Nicolai Stange
2016-09-16 20:12 ` [RFC v7 20/23] clockevents: purge ->min_delta_ns Nicolai Stange
2016-09-16 20:12 ` [RFC v7 21/23] clockevents: initial support for mono to raw time conversion Nicolai Stange
2016-09-16 20:12 ` [RFC v7 22/23] clockevents: make setting of ->mult and ->mult_adjusted atomic Nicolai Stange
2016-09-16 20:27 ` [RFC v7 23/23] timekeeping: inform clockevents about freq adjustments Nicolai Stange
2016-09-20 20:54 ` [RFC v7 00/23] adapt clockevents frequencies to mono clock Thomas Gleixner
2016-09-20 23:08 ` Nicolai Stange
2016-09-20 23:36 ` Thomas Gleixner
2016-09-21 14:06 ` Nicolai Stange
2016-09-22 21:39 ` Thomas Gleixner
2016-09-22 22:39 ` Nicolai Stange
2016-09-26 10:15 ` 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=20160916200851.9273-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;
as well as URLs for NNTP newsgroup(s).