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 | ||
