linux/arch/powerpc/include/asm/cputime.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * Definitions for measuring cputime on powerpc machines.
   4 *
   5 * Copyright (C) 2006 Paul Mackerras, IBM Corp.
   6 *
   7 * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in
   8 * the same units as the timebase.  Otherwise we measure cpu time
   9 * in jiffies using the generic definitions.
  10 */
  11
  12#ifndef __POWERPC_CPUTIME_H
  13#define __POWERPC_CPUTIME_H
  14
  15#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
  16
  17#include <linux/types.h>
  18#include <linux/time.h>
  19#include <asm/div64.h>
  20#include <asm/time.h>
  21#include <asm/param.h>
  22
  23typedef u64 __nocast cputime_t;
  24typedef u64 __nocast cputime64_t;
  25
  26#define cmpxchg_cputime(ptr, old, new) cmpxchg(ptr, old, new)
  27
  28#ifdef __KERNEL__
  29/*
  30 * Convert cputime <-> microseconds
  31 */
  32extern u64 __cputime_usec_factor;
  33
  34static inline unsigned long cputime_to_usecs(const cputime_t ct)
  35{
  36        return mulhdu((__force u64) ct, __cputime_usec_factor);
  37}
  38
  39#define cputime_to_nsecs(cputime) tb_to_ns((__force u64)cputime)
  40
  41/*
  42 * PPC64 uses PACA which is task independent for storing accounting data while
  43 * PPC32 uses struct thread_info, therefore at task switch the accounting data
  44 * has to be populated in the new task
  45 */
  46#ifdef CONFIG_PPC64
  47#define get_accounting(tsk)     (&get_paca()->accounting)
  48#define raw_get_accounting(tsk) (&local_paca->accounting)
  49static inline void arch_vtime_task_switch(struct task_struct *tsk) { }
  50
  51#else
  52#define get_accounting(tsk)     (&task_thread_info(tsk)->accounting)
  53#define raw_get_accounting(tsk) get_accounting(tsk)
  54/*
  55 * Called from the context switch with interrupts disabled, to charge all
  56 * accumulated times to the current process, and to prepare accounting on
  57 * the next process.
  58 */
  59static inline void arch_vtime_task_switch(struct task_struct *prev)
  60{
  61        struct cpu_accounting_data *acct = get_accounting(current);
  62        struct cpu_accounting_data *acct0 = get_accounting(prev);
  63
  64        acct->starttime = acct0->starttime;
  65}
  66#endif
  67
  68/*
  69 * account_cpu_user_entry/exit runs "unreconciled", so can't trace,
  70 * can't use get_paca()
  71 */
  72static notrace inline void account_cpu_user_entry(void)
  73{
  74        unsigned long tb = mftb();
  75        struct cpu_accounting_data *acct = raw_get_accounting(current);
  76
  77        acct->utime += (tb - acct->starttime_user);
  78        acct->starttime = tb;
  79}
  80
  81static notrace inline void account_cpu_user_exit(void)
  82{
  83        unsigned long tb = mftb();
  84        struct cpu_accounting_data *acct = raw_get_accounting(current);
  85
  86        acct->stime += (tb - acct->starttime);
  87        acct->starttime_user = tb;
  88}
  89
  90static notrace inline void account_stolen_time(void)
  91{
  92#ifdef CONFIG_PPC_SPLPAR
  93        if (firmware_has_feature(FW_FEATURE_SPLPAR)) {
  94                struct lppaca *lp = local_paca->lppaca_ptr;
  95
  96                if (unlikely(local_paca->dtl_ridx != be64_to_cpu(lp->dtl_idx)))
  97                        accumulate_stolen_time();
  98        }
  99#endif
 100}
 101
 102#endif /* __KERNEL__ */
 103#else /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 104static inline void account_cpu_user_entry(void)
 105{
 106}
 107static inline void account_cpu_user_exit(void)
 108{
 109}
 110static notrace inline void account_stolen_time(void)
 111{
 112}
 113#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
 114#endif /* __POWERPC_CPUTIME_H */
 115