diff options
-rw-r--r-- | arch/ia64/include/asm/switch_to.h | 8 | ||||
-rw-r--r-- | arch/ia64/kernel/time.c | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/time.h | 6 | ||||
-rw-r--r-- | arch/powerpc/kernel/process.c | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/time.c | 6 | ||||
-rw-r--r-- | arch/s390/include/asm/switch_to.h | 2 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 4 | ||||
-rw-r--r-- | include/linux/kernel_stat.h | 6 | ||||
-rw-r--r-- | kernel/sched/core.c | 1 |
9 files changed, 17 insertions, 23 deletions
diff --git a/arch/ia64/include/asm/switch_to.h b/arch/ia64/include/asm/switch_to.h index cb2412fcd17f..d38c7ea5eea5 100644 --- a/arch/ia64/include/asm/switch_to.h +++ b/arch/ia64/include/asm/switch_to.h | |||
@@ -30,13 +30,6 @@ extern struct task_struct *ia64_switch_to (void *next_task); | |||
30 | extern void ia64_save_extra (struct task_struct *task); | 30 | extern void ia64_save_extra (struct task_struct *task); |
31 | extern void ia64_load_extra (struct task_struct *task); | 31 | extern void ia64_load_extra (struct task_struct *task); |
32 | 32 | ||
33 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
34 | extern void ia64_account_on_switch (struct task_struct *prev, struct task_struct *next); | ||
35 | # define IA64_ACCOUNT_ON_SWITCH(p,n) ia64_account_on_switch(p,n) | ||
36 | #else | ||
37 | # define IA64_ACCOUNT_ON_SWITCH(p,n) | ||
38 | #endif | ||
39 | |||
40 | #ifdef CONFIG_PERFMON | 33 | #ifdef CONFIG_PERFMON |
41 | DECLARE_PER_CPU(unsigned long, pfm_syst_info); | 34 | DECLARE_PER_CPU(unsigned long, pfm_syst_info); |
42 | # define PERFMON_IS_SYSWIDE() (__get_cpu_var(pfm_syst_info) & 0x1) | 35 | # define PERFMON_IS_SYSWIDE() (__get_cpu_var(pfm_syst_info) & 0x1) |
@@ -49,7 +42,6 @@ extern void ia64_account_on_switch (struct task_struct *prev, struct task_struct | |||
49 | || PERFMON_IS_SYSWIDE()) | 42 | || PERFMON_IS_SYSWIDE()) |
50 | 43 | ||
51 | #define __switch_to(prev,next,last) do { \ | 44 | #define __switch_to(prev,next,last) do { \ |
52 | IA64_ACCOUNT_ON_SWITCH(prev, next); \ | ||
53 | if (IA64_HAS_EXTRA_STATE(prev)) \ | 45 | if (IA64_HAS_EXTRA_STATE(prev)) \ |
54 | ia64_save_extra(prev); \ | 46 | ia64_save_extra(prev); \ |
55 | if (IA64_HAS_EXTRA_STATE(next)) \ | 47 | if (IA64_HAS_EXTRA_STATE(next)) \ |
diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index ecc904b33c5f..6247197b9877 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c | |||
@@ -88,10 +88,10 @@ extern cputime_t cycle_to_cputime(u64 cyc); | |||
88 | * accumulated times to the current process, and to prepare accounting on | 88 | * accumulated times to the current process, and to prepare accounting on |
89 | * the next process. | 89 | * the next process. |
90 | */ | 90 | */ |
91 | void ia64_account_on_switch(struct task_struct *prev, struct task_struct *next) | 91 | void account_switch_vtime(struct task_struct *prev) |
92 | { | 92 | { |
93 | struct thread_info *pi = task_thread_info(prev); | 93 | struct thread_info *pi = task_thread_info(prev); |
94 | struct thread_info *ni = task_thread_info(next); | 94 | struct thread_info *ni = task_thread_info(current); |
95 | cputime_t delta_stime, delta_utime; | 95 | cputime_t delta_stime, delta_utime; |
96 | __u64 now; | 96 | __u64 now; |
97 | 97 | ||
diff --git a/arch/powerpc/include/asm/time.h b/arch/powerpc/include/asm/time.h index 3b4b4a8da922..c1f267694acb 100644 --- a/arch/powerpc/include/asm/time.h +++ b/arch/powerpc/include/asm/time.h | |||
@@ -197,12 +197,6 @@ struct cpu_usage { | |||
197 | 197 | ||
198 | DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); | 198 | DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array); |
199 | 199 | ||
200 | #if defined(CONFIG_VIRT_CPU_ACCOUNTING) | ||
201 | #define account_process_vtime(tsk) account_process_tick(tsk, 0) | ||
202 | #else | ||
203 | #define account_process_vtime(tsk) do { } while (0) | ||
204 | #endif | ||
205 | |||
206 | extern void secondary_cpu_time_init(void); | 200 | extern void secondary_cpu_time_init(void); |
207 | 201 | ||
208 | DECLARE_PER_CPU(u64, decrementers_next_tb); | 202 | DECLARE_PER_CPU(u64, decrementers_next_tb); |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 710f400476de..d73fa999b47b 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -514,9 +514,6 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
514 | 514 | ||
515 | local_irq_save(flags); | 515 | local_irq_save(flags); |
516 | 516 | ||
517 | account_system_vtime(current); | ||
518 | account_process_vtime(current); | ||
519 | |||
520 | /* | 517 | /* |
521 | * We can't take a PMU exception inside _switch() since there is a | 518 | * We can't take a PMU exception inside _switch() since there is a |
522 | * window where the kernel stack SLB and the kernel stack are out | 519 | * window where the kernel stack SLB and the kernel stack are out |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index be171ee73bf8..49da7f06e643 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -366,6 +366,12 @@ void account_process_tick(struct task_struct *tsk, int user_tick) | |||
366 | account_user_time(tsk, utime, utimescaled); | 366 | account_user_time(tsk, utime, utimescaled); |
367 | } | 367 | } |
368 | 368 | ||
369 | void account_switch_vtime(struct task_struct *prev) | ||
370 | { | ||
371 | account_system_vtime(prev); | ||
372 | account_process_tick(prev, 0); | ||
373 | } | ||
374 | |||
369 | #else /* ! CONFIG_VIRT_CPU_ACCOUNTING */ | 375 | #else /* ! CONFIG_VIRT_CPU_ACCOUNTING */ |
370 | #define calc_cputime_factors() | 376 | #define calc_cputime_factors() |
371 | #endif | 377 | #endif |
diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h index f223068b7822..e7f9b3d04fa1 100644 --- a/arch/s390/include/asm/switch_to.h +++ b/arch/s390/include/asm/switch_to.h | |||
@@ -89,12 +89,10 @@ static inline void restore_access_regs(unsigned int *acrs) | |||
89 | prev = __switch_to(prev,next); \ | 89 | prev = __switch_to(prev,next); \ |
90 | } while (0) | 90 | } while (0) |
91 | 91 | ||
92 | extern void account_vtime(struct task_struct *, struct task_struct *); | ||
93 | extern void account_tick_vtime(struct task_struct *); | 92 | extern void account_tick_vtime(struct task_struct *); |
94 | 93 | ||
95 | #define finish_arch_switch(prev) do { \ | 94 | #define finish_arch_switch(prev) do { \ |
96 | set_fs(current->thread.mm_segment); \ | 95 | set_fs(current->thread.mm_segment); \ |
97 | account_vtime(prev, current); \ | ||
98 | } while (0) | 96 | } while (0) |
99 | 97 | ||
100 | #endif /* __ASM_SWITCH_TO_H */ | 98 | #endif /* __ASM_SWITCH_TO_H */ |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 4fc97b40a6e1..449ac22cc71b 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -99,7 +99,7 @@ static int do_account_vtime(struct task_struct *tsk, int hardirq_offset) | |||
99 | return virt_timer_forward(user + system); | 99 | return virt_timer_forward(user + system); |
100 | } | 100 | } |
101 | 101 | ||
102 | void account_vtime(struct task_struct *prev, struct task_struct *next) | 102 | void account_switch_vtime(struct task_struct *prev) |
103 | { | 103 | { |
104 | struct thread_info *ti; | 104 | struct thread_info *ti; |
105 | 105 | ||
@@ -107,7 +107,7 @@ void account_vtime(struct task_struct *prev, struct task_struct *next) | |||
107 | ti = task_thread_info(prev); | 107 | ti = task_thread_info(prev); |
108 | ti->user_timer = S390_lowcore.user_timer; | 108 | ti->user_timer = S390_lowcore.user_timer; |
109 | ti->system_timer = S390_lowcore.system_timer; | 109 | ti->system_timer = S390_lowcore.system_timer; |
110 | ti = task_thread_info(next); | 110 | ti = task_thread_info(current); |
111 | S390_lowcore.user_timer = ti->user_timer; | 111 | S390_lowcore.user_timer = ti->user_timer; |
112 | S390_lowcore.system_timer = ti->system_timer; | 112 | S390_lowcore.system_timer = ti->system_timer; |
113 | } | 113 | } |
diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h index 2fbd9053c2df..bbe5d15d6597 100644 --- a/include/linux/kernel_stat.h +++ b/include/linux/kernel_stat.h | |||
@@ -130,4 +130,10 @@ extern void account_process_tick(struct task_struct *, int user); | |||
130 | extern void account_steal_ticks(unsigned long ticks); | 130 | extern void account_steal_ticks(unsigned long ticks); |
131 | extern void account_idle_ticks(unsigned long ticks); | 131 | extern void account_idle_ticks(unsigned long ticks); |
132 | 132 | ||
133 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING | ||
134 | extern void account_switch_vtime(struct task_struct *prev); | ||
135 | #else | ||
136 | static inline void account_switch_vtime(struct task_struct *prev) { } | ||
137 | #endif | ||
138 | |||
133 | #endif /* _LINUX_KERNEL_STAT_H */ | 139 | #endif /* _LINUX_KERNEL_STAT_H */ |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index ae3bcaa3afbf..78d9c965433a 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -1796,6 +1796,7 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) | |||
1796 | * Manfred Spraul <manfred@colorfullife.com> | 1796 | * Manfred Spraul <manfred@colorfullife.com> |
1797 | */ | 1797 | */ |
1798 | prev_state = prev->state; | 1798 | prev_state = prev->state; |
1799 | account_switch_vtime(prev); | ||
1799 | finish_arch_switch(prev); | 1800 | finish_arch_switch(prev); |
1800 | #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW | 1801 | #ifdef __ARCH_WANT_INTERRUPTS_ON_CTXSW |
1801 | local_irq_disable(); | 1802 | local_irq_disable(); |