From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752000AbdA3Ern (ORCPT ); Sun, 29 Jan 2017 23:47:43 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:33951 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751493AbdA3ErY (ORCPT ); Sun, 29 Jan 2017 23:47:24 -0500 From: Frederic Weisbecker To: Ingo Molnar Cc: LKML , Frederic Weisbecker , Tony Luck , Wanpeng Li , Peter Zijlstra , Michael Ellerman , Heiko Carstens , Benjamin Herrenschmidt , Thomas Gleixner , Paul Mackerras , Fenghua Yu , Rik van Riel , Martin Schwidefsky , Stanislaw Gruszka Subject: [GIT PULL] cputime: Convert core use of cputime_t to nsecs Date: Mon, 30 Jan 2017 05:46:43 +0100 Message-Id: <1485751603-15913-1-git-send-email-fweisbec@gmail.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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(-)