Re: [GIT PULL] cputime: Convert core use of cputime_t to nsecs

hejianet
2017-02-21T05:08:52Z

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(-)
>