xref: /openbmc/linux/arch/powerpc/include/asm/cputime.h (revision e285d5bf)
1 /*
2  * Definitions for measuring cputime on powerpc machines.
3  *
4  * Copyright (C) 2006 Paul Mackerras, IBM Corp.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  *
11  * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in
12  * the same units as the timebase.  Otherwise we measure cpu time
13  * in jiffies using the generic definitions.
14  */
15 
16 #ifndef __POWERPC_CPUTIME_H
17 #define __POWERPC_CPUTIME_H
18 
19 #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
20 
21 #include <linux/types.h>
22 #include <linux/time.h>
23 #include <asm/div64.h>
24 #include <asm/time.h>
25 #include <asm/param.h>
26 
27 typedef u64 __nocast cputime_t;
28 typedef u64 __nocast cputime64_t;
29 
30 #define cmpxchg_cputime(ptr, old, new) cmpxchg(ptr, old, new)
31 
32 #ifdef __KERNEL__
33 /*
34  * Convert cputime <-> microseconds
35  */
36 extern u64 __cputime_usec_factor;
37 
38 static inline unsigned long cputime_to_usecs(const cputime_t ct)
39 {
40 	return mulhdu((__force u64) ct, __cputime_usec_factor);
41 }
42 
43 /*
44  * PPC64 uses PACA which is task independent for storing accounting data while
45  * PPC32 uses struct thread_info, therefore at task switch the accounting data
46  * has to be populated in the new task
47  */
48 #ifdef CONFIG_PPC64
49 #define get_accounting(tsk)	(&get_paca()->accounting)
50 static inline void arch_vtime_task_switch(struct task_struct *tsk) { }
51 #else
52 #define get_accounting(tsk)	(&task_thread_info(tsk)->accounting)
53 /*
54  * Called from the context switch with interrupts disabled, to charge all
55  * accumulated times to the current process, and to prepare accounting on
56  * the next process.
57  */
58 static inline void arch_vtime_task_switch(struct task_struct *prev)
59 {
60 	struct cpu_accounting_data *acct = get_accounting(current);
61 	struct cpu_accounting_data *acct0 = get_accounting(prev);
62 
63 	acct->starttime = acct0->starttime;
64 	acct->startspurr = acct0->startspurr;
65 }
66 #endif
67 
68 #endif /* __KERNEL__ */
69 #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */
70 #endif /* __POWERPC_CPUTIME_H */
71