diff options
author | Ingo Molnar <mingo@kernel.org> | 2013-02-05 07:10:33 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-02-05 07:10:33 -0500 |
commit | b2c77a57e4a0a7877e357dead7ee8acc19944f3e (patch) | |
tree | fa192b5a058711299c2a8ce2621df6c9bd8f3a99 /arch/ia64/include | |
parent | c3c186403c6abd32e719f005f0af950155a9e54d (diff) | |
parent | 6a61671bb2f3a1bd12cd17b8fca811a624782632 (diff) |
Merge tag 'full-dynticks-cputime-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into sched/core
Pull full-dynticks (user-space execution is undisturbed and
receives no timer IRQs) preparation changes that convert the
cputime accounting code to be full-dynticks ready,
from Frederic Weisbecker:
"This implements the cputime accounting on full dynticks CPUs.
Typical cputime stats infrastructure relies on the timer tick and
its periodic polling on the CPU to account the amount of time
spent by the CPUs and the tasks per high level domains such as
userspace, kernelspace, guest, ...
Now we are preparing to implement full dynticks capability on
Linux for Real Time and HPC users who want full CPU isolation.
This feature requires a cputime accounting that doesn't depend
on the timer tick.
To implement it, this new cputime infrastructure plugs into
kernel/user/guest boundaries to take snapshots of cputime and
flush these to the stats when needed. This performs pretty
much like CONFIG_VIRT_CPU_ACCOUNTING except that context location
and cputime snaphots are synchronized between write and read
side such that the latter can safely retrieve the pending tickless
cputime of a task and add it to its latest cputime snapshot to
return the correct result to the user."
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/ia64/include')
-rw-r--r-- | arch/ia64/include/asm/cputime.h | 92 | ||||
-rw-r--r-- | arch/ia64/include/asm/thread_info.h | 4 | ||||
-rw-r--r-- | arch/ia64/include/asm/xen/minstate.h | 2 |
3 files changed, 9 insertions, 89 deletions
diff --git a/arch/ia64/include/asm/cputime.h b/arch/ia64/include/asm/cputime.h index 7fcf7f08ab06..e2d3f5baf265 100644 --- a/arch/ia64/include/asm/cputime.h +++ b/arch/ia64/include/asm/cputime.h | |||
@@ -11,99 +11,19 @@ | |||
11 | * as published by the Free Software Foundation; either version | 11 | * as published by the Free Software Foundation; either version |
12 | * 2 of the License, or (at your option) any later version. | 12 | * 2 of the License, or (at your option) any later version. |
13 | * | 13 | * |
14 | * If we have CONFIG_VIRT_CPU_ACCOUNTING, we measure cpu time in nsec. | 14 | * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in nsec. |
15 | * Otherwise we measure cpu time in jiffies using the generic definitions. | 15 | * Otherwise we measure cpu time in jiffies using the generic definitions. |
16 | */ | 16 | */ |
17 | 17 | ||
18 | #ifndef __IA64_CPUTIME_H | 18 | #ifndef __IA64_CPUTIME_H |
19 | #define __IA64_CPUTIME_H | 19 | #define __IA64_CPUTIME_H |
20 | 20 | ||
21 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING | 21 | #ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
22 | #include <asm-generic/cputime.h> | 22 | # include <asm-generic/cputime.h> |
23 | #else | 23 | #else |
24 | 24 | # include <asm/processor.h> | |
25 | #include <linux/time.h> | 25 | # include <asm-generic/cputime_nsecs.h> |
26 | #include <linux/jiffies.h> | ||
27 | #include <asm/processor.h> | ||
28 | |||
29 | typedef u64 __nocast cputime_t; | ||
30 | typedef u64 __nocast cputime64_t; | ||
31 | |||
32 | #define cputime_one_jiffy jiffies_to_cputime(1) | ||
33 | |||
34 | /* | ||
35 | * Convert cputime <-> jiffies (HZ) | ||
36 | */ | ||
37 | #define cputime_to_jiffies(__ct) \ | ||
38 | ((__force u64)(__ct) / (NSEC_PER_SEC / HZ)) | ||
39 | #define jiffies_to_cputime(__jif) \ | ||
40 | (__force cputime_t)((__jif) * (NSEC_PER_SEC / HZ)) | ||
41 | #define cputime64_to_jiffies64(__ct) \ | ||
42 | ((__force u64)(__ct) / (NSEC_PER_SEC / HZ)) | ||
43 | #define jiffies64_to_cputime64(__jif) \ | ||
44 | (__force cputime64_t)((__jif) * (NSEC_PER_SEC / HZ)) | ||
45 | |||
46 | /* | ||
47 | * Convert cputime <-> microseconds | ||
48 | */ | ||
49 | #define cputime_to_usecs(__ct) \ | ||
50 | ((__force u64)(__ct) / NSEC_PER_USEC) | ||
51 | #define usecs_to_cputime(__usecs) \ | ||
52 | (__force cputime_t)((__usecs) * NSEC_PER_USEC) | ||
53 | #define usecs_to_cputime64(__usecs) \ | ||
54 | (__force cputime64_t)((__usecs) * NSEC_PER_USEC) | ||
55 | |||
56 | /* | ||
57 | * Convert cputime <-> seconds | ||
58 | */ | ||
59 | #define cputime_to_secs(__ct) \ | ||
60 | ((__force u64)(__ct) / NSEC_PER_SEC) | ||
61 | #define secs_to_cputime(__secs) \ | ||
62 | (__force cputime_t)((__secs) * NSEC_PER_SEC) | ||
63 | |||
64 | /* | ||
65 | * Convert cputime <-> timespec (nsec) | ||
66 | */ | ||
67 | static inline cputime_t timespec_to_cputime(const struct timespec *val) | ||
68 | { | ||
69 | u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_nsec; | ||
70 | return (__force cputime_t) ret; | ||
71 | } | ||
72 | static inline void cputime_to_timespec(const cputime_t ct, struct timespec *val) | ||
73 | { | ||
74 | val->tv_sec = (__force u64) ct / NSEC_PER_SEC; | ||
75 | val->tv_nsec = (__force u64) ct % NSEC_PER_SEC; | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Convert cputime <-> timeval (msec) | ||
80 | */ | ||
81 | static inline cputime_t timeval_to_cputime(struct timeval *val) | ||
82 | { | ||
83 | u64 ret = val->tv_sec * NSEC_PER_SEC + val->tv_usec * NSEC_PER_USEC; | ||
84 | return (__force cputime_t) ret; | ||
85 | } | ||
86 | static inline void cputime_to_timeval(const cputime_t ct, struct timeval *val) | ||
87 | { | ||
88 | val->tv_sec = (__force u64) ct / NSEC_PER_SEC; | ||
89 | val->tv_usec = ((__force u64) ct % NSEC_PER_SEC) / NSEC_PER_USEC; | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Convert cputime <-> clock (USER_HZ) | ||
94 | */ | ||
95 | #define cputime_to_clock_t(__ct) \ | ||
96 | ((__force u64)(__ct) / (NSEC_PER_SEC / USER_HZ)) | ||
97 | #define clock_t_to_cputime(__x) \ | ||
98 | (__force cputime_t)((__x) * (NSEC_PER_SEC / USER_HZ)) | ||
99 | |||
100 | /* | ||
101 | * Convert cputime64 to clock. | ||
102 | */ | ||
103 | #define cputime64_to_clock_t(__ct) \ | ||
104 | cputime_to_clock_t((__force cputime_t)__ct) | ||
105 | |||
106 | extern void arch_vtime_task_switch(struct task_struct *tsk); | 26 | extern void arch_vtime_task_switch(struct task_struct *tsk); |
27 | #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ | ||
107 | 28 | ||
108 | #endif /* CONFIG_VIRT_CPU_ACCOUNTING */ | ||
109 | #endif /* __IA64_CPUTIME_H */ | 29 | #endif /* __IA64_CPUTIME_H */ |
diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h index ff2ae4136584..020d655ed082 100644 --- a/arch/ia64/include/asm/thread_info.h +++ b/arch/ia64/include/asm/thread_info.h | |||
@@ -31,7 +31,7 @@ struct thread_info { | |||
31 | mm_segment_t addr_limit; /* user-level address space limit */ | 31 | mm_segment_t addr_limit; /* user-level address space limit */ |
32 | int preempt_count; /* 0=premptable, <0=BUG; will also serve as bh-counter */ | 32 | int preempt_count; /* 0=premptable, <0=BUG; will also serve as bh-counter */ |
33 | struct restart_block restart_block; | 33 | struct restart_block restart_block; |
34 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 34 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
35 | __u64 ac_stamp; | 35 | __u64 ac_stamp; |
36 | __u64 ac_leave; | 36 | __u64 ac_leave; |
37 | __u64 ac_stime; | 37 | __u64 ac_stime; |
@@ -69,7 +69,7 @@ struct thread_info { | |||
69 | #define task_stack_page(tsk) ((void *)(tsk)) | 69 | #define task_stack_page(tsk) ((void *)(tsk)) |
70 | 70 | ||
71 | #define __HAVE_THREAD_FUNCTIONS | 71 | #define __HAVE_THREAD_FUNCTIONS |
72 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 72 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
73 | #define setup_thread_stack(p, org) \ | 73 | #define setup_thread_stack(p, org) \ |
74 | *task_thread_info(p) = *task_thread_info(org); \ | 74 | *task_thread_info(p) = *task_thread_info(org); \ |
75 | task_thread_info(p)->ac_stime = 0; \ | 75 | task_thread_info(p)->ac_stime = 0; \ |
diff --git a/arch/ia64/include/asm/xen/minstate.h b/arch/ia64/include/asm/xen/minstate.h index c57fa910f2c9..00cf03e0cb82 100644 --- a/arch/ia64/include/asm/xen/minstate.h +++ b/arch/ia64/include/asm/xen/minstate.h | |||
@@ -1,5 +1,5 @@ | |||
1 | 1 | ||
2 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | 2 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
3 | /* read ar.itc in advance, and use it before leaving bank 0 */ | 3 | /* read ar.itc in advance, and use it before leaving bank 0 */ |
4 | #define XEN_ACCOUNT_GET_STAMP \ | 4 | #define XEN_ACCOUNT_GET_STAMP \ |
5 | MOV_FROM_ITC(pUStk, p6, r20, r2); | 5 | MOV_FROM_ITC(pUStk, p6, r20, r2); |