diff options
Diffstat (limited to 'arch/s390/kernel/process.c')
-rw-r--r-- | arch/s390/kernel/process.c | 43 |
1 files changed, 4 insertions, 39 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 04f8c67a6101..b6110bdf8dc2 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <linux/utsname.h> | 38 | #include <linux/utsname.h> |
39 | #include <linux/tick.h> | 39 | #include <linux/tick.h> |
40 | #include <linux/elfcore.h> | 40 | #include <linux/elfcore.h> |
41 | #include <linux/kernel_stat.h> | ||
41 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
43 | #include <asm/system.h> | 44 | #include <asm/system.h> |
@@ -45,7 +46,6 @@ | |||
45 | #include <asm/processor.h> | 46 | #include <asm/processor.h> |
46 | #include <asm/irq.h> | 47 | #include <asm/irq.h> |
47 | #include <asm/timer.h> | 48 | #include <asm/timer.h> |
48 | #include <asm/cpu.h> | ||
49 | #include "entry.h" | 49 | #include "entry.h" |
50 | 50 | ||
51 | asmlinkage void ret_from_fork(void) asm ("ret_from_fork"); | 51 | asmlinkage void ret_from_fork(void) asm ("ret_from_fork"); |
@@ -75,36 +75,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
75 | return sf->gprs[8]; | 75 | return sf->gprs[8]; |
76 | } | 76 | } |
77 | 77 | ||
78 | DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = { | ||
79 | .lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock) | ||
80 | }; | ||
81 | |||
82 | static int s390_idle_enter(void) | ||
83 | { | ||
84 | struct s390_idle_data *idle; | ||
85 | |||
86 | idle = &__get_cpu_var(s390_idle); | ||
87 | spin_lock(&idle->lock); | ||
88 | idle->idle_count++; | ||
89 | idle->in_idle = 1; | ||
90 | idle->idle_enter = get_clock(); | ||
91 | spin_unlock(&idle->lock); | ||
92 | vtime_stop_cpu_timer(); | ||
93 | return NOTIFY_OK; | ||
94 | } | ||
95 | |||
96 | void s390_idle_leave(void) | ||
97 | { | ||
98 | struct s390_idle_data *idle; | ||
99 | |||
100 | vtime_start_cpu_timer(); | ||
101 | idle = &__get_cpu_var(s390_idle); | ||
102 | spin_lock(&idle->lock); | ||
103 | idle->idle_time += get_clock() - idle->idle_enter; | ||
104 | idle->in_idle = 0; | ||
105 | spin_unlock(&idle->lock); | ||
106 | } | ||
107 | |||
108 | extern void s390_handle_mcck(void); | 78 | extern void s390_handle_mcck(void); |
109 | /* | 79 | /* |
110 | * The idle loop on a S390... | 80 | * The idle loop on a S390... |
@@ -117,10 +87,6 @@ static void default_idle(void) | |||
117 | local_irq_enable(); | 87 | local_irq_enable(); |
118 | return; | 88 | return; |
119 | } | 89 | } |
120 | if (s390_idle_enter() == NOTIFY_BAD) { | ||
121 | local_irq_enable(); | ||
122 | return; | ||
123 | } | ||
124 | #ifdef CONFIG_HOTPLUG_CPU | 90 | #ifdef CONFIG_HOTPLUG_CPU |
125 | if (cpu_is_offline(smp_processor_id())) { | 91 | if (cpu_is_offline(smp_processor_id())) { |
126 | preempt_enable_no_resched(); | 92 | preempt_enable_no_resched(); |
@@ -130,7 +96,6 @@ static void default_idle(void) | |||
130 | local_mcck_disable(); | 96 | local_mcck_disable(); |
131 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 97 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
132 | local_mcck_enable(); | 98 | local_mcck_enable(); |
133 | s390_idle_leave(); | ||
134 | local_irq_enable(); | 99 | local_irq_enable(); |
135 | s390_handle_mcck(); | 100 | s390_handle_mcck(); |
136 | return; | 101 | return; |
@@ -138,9 +103,9 @@ static void default_idle(void) | |||
138 | trace_hardirqs_on(); | 103 | trace_hardirqs_on(); |
139 | /* Don't trace preempt off for idle. */ | 104 | /* Don't trace preempt off for idle. */ |
140 | stop_critical_timings(); | 105 | stop_critical_timings(); |
141 | /* Wait for external, I/O or machine check interrupt. */ | 106 | /* Stop virtual timer and halt the cpu. */ |
142 | __load_psw_mask(psw_kernel_bits | PSW_MASK_WAIT | | 107 | vtime_stop_cpu(); |
143 | PSW_MASK_IO | PSW_MASK_EXT); | 108 | /* Reenable preemption tracer. */ |
144 | start_critical_timings(); | 109 | start_critical_timings(); |
145 | } | 110 | } |
146 | 111 | ||