Hi Frederic

Do we need to support CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=n on ppc64le?

If yes, I got a compiling error after applying your patch set:

arch/powerpc/kernel/time.c:712:2: error: implicit declaration of function ‘cputime_to_nsecs’ [-Werror=implicit-function-declaration] return local_clock() - cputime_to_nsecs(kcpustat_this_cpu->cpustat[CPUTIME_STEAL]);
  ^

I thought it is due to CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=n on my ppc64le server.
My kernel config:
# grep -n CONFIG_VIRT_CPU .config
136:CONFIG_VIRT_CPU_ACCOUNTING=y
137:CONFIG_VIRT_CPU_ACCOUNTING_GEN=y

B.R.
Jia

On 30/01/2017 12:46 PM, Frederic Weisbecker wrote:
Ingo,

Please pull the cputime/nsecs-for-tip branch that can be found at:

git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
        cputime/nsecs-for-tip

HEAD: 14d889bef71ff808c450f82bcd257b10f05bb061

The patches are the same than on my previous post: 
https://lwn.net/Articles/712213/
If you apply them by email, just please ignore the very last one
([PATCH 37/37] s390: Prevent from cputime leaks) because we need to find
a better solution with Martin. The branch doesn't have this patch.


--- Summary ---

cputime_t is a type that can map to different time units and
granularities: jiffies, nsecs or architecture clock.

This type and its accessors and mutators have been designed to deal
with all these time units that can vary depending on the kernel config
in order to support a model where the cputime is stored as-is under
the source unit.

The pro here with this model is to avoid expensive conversions from the
source unit cputime to a more generic type during the accounting hotpath.
Especially for config that have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE=y.

Now there are several cons:

    * we need to maintain a whole set of cputime_t mutators and accessors
      for all implementations of cputime_t (currently 4 of them). And we
      need such function for every kind of time conversion: to/from
      jiffies, nsecs, usecs, timeval, clock_t, ...

    * The core code needs to deal with different possible granularities
      of cputime_t while converting to/from another time unit.
      Especially functions like nsecs_to_cputime() can leak some nsecs
      remainder. This adds more complexity and even sometimes performance
      loss (involving reverse conversion) in order to avoid losing such
      time remainder (eg: irqtime accounting, steal time accounting, posix
      cpu timers, ...).

    * Kernel developers are seldom familiar with these granularity issues:
      cputime leaks often appear in patches dealing with cputime code.

    * In general cputime_t, as a varying type, is more opaque and harder
      to deal with than static nsecs. Making the core code less readable.

This patchset removes all core use of cputime_t and stores the cputime
into nsecs units. Only s390 and powerpc
(with CONFIG_VIRT_CPU_ACCOUNTING_NATIVE for the latter) now still use
cputime_t.

Many code get simplified, the diffstat is appealing and some fastpath
should even have a small performance gain (irqtime and steal time
accounting).

Now lets admit one drawback: s390 and powerpc with
CONFIG_VIRT_CPU_ACCOUNTING_NATIVE have new cputime_t to nsecs conversion
on cputime accounting path. But this should be leveraged by the recent
changes which delay the cputime accounting to tick and context switch.

Thanks,
        Frederic
---

Frederic Weisbecker (36):
       jiffies: Reuse TICK_NSEC instead of NSEC_PER_JIFFY
       time: Introduce jiffies64_to_nsecs()
       sched: Remove unused INIT_CPUTIME macro
       cputime: Convert kcpustat to nsecs
       macintosh/rack-meter: Remove cputime_t internal use
       cputime: Convert guest time accounting to nsecs
       cputime: Special API to return old-typed cputime
       cputime: Convert task/group cputime to nsecs
       alpha: Convert obsolete cputime_t to nsecs
       x86: Convert obsolete cputime type to nsecs
       isdn: Convert obsolete cputime type to nsecs
       binfmt: Convert obsolete cputime type to nsecs
       acct: Convert obsolete cputime type to nsecs
       delaycct: Convert obsolete cputime type to nsecs
       tsacct: Convert obsolete cputime type to nsecs
       signal: Convert obsolete cputime type to nsecs
       cputime: Increment kcpustat directly on irqtime account
       posix-timers: Use TICK_NSEC instead of a dynamically ad-hoc calculated 
version
       posix-timers: Convert internals to use nsecs
       itimer: Convert internal cputime_t units to nsec
       sched: Remove temporary cputime_t accessors
       cputime: Push time to account_user_time() in nsecs
       cputime: Push time to account_steal_time() in nsecs
       cputime: Push time to account_idle_time() in nsecs
       cputime: Push time to account_system_time() in nsecs
       cputime: Complete nsec conversion of tick based accounting
       vtime: Return nsecs instead of cputime_t to account
       cputime: Remove jiffies based cputime
       ia64: Move nsecs based cputime headers to the last arch using it
       ia64: Convert vtime to use nsec units directly
       ia64: Remove unused cputime definitions
       s390: Make arch_cpu_idle_time() to return nsecs
       powerpc: Remove unused cputime definitions
       s390: Remove unused cputime definitions
       cputime: Remove unused nsec_to_cputime
       cputime: Remove asm generic headers


  arch/alpha/include/asm/Kbuild         |   1 -
  arch/alpha/kernel/osf_sys.c           |  10 +-
  arch/arc/include/asm/Kbuild           |   1 -
  arch/arm/include/asm/Kbuild           |   1 -
  arch/arm64/include/asm/Kbuild         |   1 -
  arch/avr32/include/asm/Kbuild         |   1 -
  arch/blackfin/include/asm/Kbuild      |   1 -
  arch/c6x/include/asm/Kbuild           |   1 -
  arch/cris/include/asm/Kbuild          |   1 -
  arch/frv/include/asm/Kbuild           |   1 -
  arch/h8300/include/asm/Kbuild         |   1 -
  arch/hexagon/include/asm/Kbuild       |   1 -
  arch/ia64/include/asm/cputime.h       |   6 +-
  arch/ia64/kernel/head.S               |   4 +-
  arch/ia64/kernel/time.c               |  17 ++--
  arch/m32r/include/asm/Kbuild          |   1 -
  arch/m68k/include/asm/Kbuild          |   1 -
  arch/metag/include/asm/Kbuild         |   1 -
  arch/microblaze/include/asm/Kbuild    |   1 -
  arch/mips/include/asm/Kbuild          |   1 -
  arch/mips/kernel/binfmt_elfn32.c      |  12 +--
  arch/mips/kernel/binfmt_elfo32.c      |  12 +--
  arch/mn10300/include/asm/Kbuild       |   1 -
  arch/nios2/include/asm/Kbuild         |   1 -
  arch/openrisc/include/asm/Kbuild      |   1 -
  arch/parisc/include/asm/Kbuild        |   1 -
  arch/parisc/kernel/binfmt_elf32.c     |  11 +--
  arch/powerpc/include/asm/cputime.h    | 177 +---------------------------------
  arch/powerpc/kernel/time.c            |  45 +++------
  arch/s390/appldata/appldata_os.c      |  16 +--
  arch/s390/include/asm/cputime.h       | 109 +--------------------
  arch/s390/kernel/idle.c               |   9 +-
  arch/s390/kernel/vtime.c              |  16 +--
  arch/score/include/asm/Kbuild         |   1 -
  arch/sh/include/asm/Kbuild            |   1 -
  arch/sparc/include/asm/Kbuild         |   1 -
  arch/tile/include/asm/Kbuild          |   1 -
  arch/um/include/asm/Kbuild            |   1 -
  arch/unicore32/include/asm/Kbuild     |   1 -
  arch/x86/include/asm/Kbuild           |   1 -
  arch/x86/kernel/apm_32.c              |   6 +-
  arch/x86/kvm/hyperv.c                 |   5 +-
  arch/xtensa/include/asm/Kbuild        |   1 -
  drivers/cpufreq/cpufreq.c             |   6 +-
  drivers/cpufreq/cpufreq_governor.c    |   2 +-
  drivers/cpufreq/cpufreq_stats.c       |   1 -
  drivers/isdn/mISDN/stack.c            |   4 +-
  drivers/macintosh/rack-meter.c        |  28 +++---
  fs/binfmt_elf.c                       |  15 +--
  fs/binfmt_elf_fdpic.c                 |  14 +--
  fs/compat_binfmt_elf.c                |  18 +---
  fs/proc/array.c                       |  16 +--
  fs/proc/stat.c                        |  64 ++++++------
  fs/proc/uptime.c                      |   7 +-
  include/asm-generic/cputime.h         |  15 ---
  include/asm-generic/cputime_jiffies.h |  75 --------------
  include/asm-generic/cputime_nsecs.h   | 121 -----------------------
  include/linux/compat.h                |  20 +++-
  include/linux/cputime.h               |   7 +-
  include/linux/jiffies.h               |   2 +
  include/linux/kernel_stat.h           |  13 ++-
  include/linux/posix-timers.h          |  14 +--
  include/linux/sched.h                 |  62 +++++-------
  include/trace/events/timer.h          |  26 ++---
  kernel/acct.c                         |   7 +-
  kernel/delayacct.c                    |   6 +-
  kernel/exit.c                         |   4 +-
  kernel/fork.c                         |   2 +-
  kernel/sched/cpuacct.c                |   2 +-
  kernel/sched/cputime.c                | 166 +++++++++++++------------------
  kernel/sched/sched.h                  |   7 +-
  kernel/sched/stats.h                  |   4 +-
  kernel/signal.c                       |  12 +--
  kernel/sys.c                          |  16 +--
  kernel/time/itimer.c                  |  60 ++++--------
  kernel/time/jiffies.c                 |  32 +++---
  kernel/time/posix-cpu-timers.c        | 170 ++++++++++++--------------------
  kernel/time/time.c                    |  10 ++
  kernel/time/timeconst.bc              |   6 ++
  kernel/tsacct.c                       |  21 ++--
  80 files changed, 436 insertions(+), 1102 deletions(-)


Reply via email to