All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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 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.