diff options
| -rw-r--r-- | arch/s390/Kconfig | 1 | ||||
| -rw-r--r-- | arch/s390/kernel/process.c | 32 | ||||
| -rw-r--r-- | arch/s390/kernel/smp.c | 3 | ||||
| -rw-r--r-- | arch/s390/kernel/vtime.c | 5 |
4 files changed, 11 insertions, 30 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index eb8fb629f00b..749513d73e47 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
| @@ -97,6 +97,7 @@ config S390 | |||
| 97 | select CLONE_BACKWARDS2 | 97 | select CLONE_BACKWARDS2 |
| 98 | select GENERIC_CLOCKEVENTS | 98 | select GENERIC_CLOCKEVENTS |
| 99 | select GENERIC_CPU_DEVICES if !SMP | 99 | select GENERIC_CPU_DEVICES if !SMP |
| 100 | select GENERIC_IDLE_LOOP | ||
| 100 | select GENERIC_KERNEL_THREAD | 101 | select GENERIC_KERNEL_THREAD |
| 101 | select GENERIC_SMP_IDLE_THREAD | 102 | select GENERIC_SMP_IDLE_THREAD |
| 102 | select GENERIC_TIME_VSYSCALL_OLD | 103 | select GENERIC_TIME_VSYSCALL_OLD |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 536d64579d9a..2bc3eddae34a 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
| @@ -61,18 +61,8 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
| 61 | return sf->gprs[8]; | 61 | return sf->gprs[8]; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | /* | 64 | void arch_cpu_idle(void) |
| 65 | * The idle loop on a S390... | ||
| 66 | */ | ||
| 67 | static void default_idle(void) | ||
| 68 | { | 65 | { |
| 69 | if (cpu_is_offline(smp_processor_id())) | ||
| 70 | cpu_die(); | ||
| 71 | local_irq_disable(); | ||
| 72 | if (need_resched()) { | ||
| 73 | local_irq_enable(); | ||
| 74 | return; | ||
| 75 | } | ||
| 76 | local_mcck_disable(); | 66 | local_mcck_disable(); |
| 77 | if (test_thread_flag(TIF_MCCK_PENDING)) { | 67 | if (test_thread_flag(TIF_MCCK_PENDING)) { |
| 78 | local_mcck_enable(); | 68 | local_mcck_enable(); |
| @@ -83,19 +73,15 @@ static void default_idle(void) | |||
| 83 | vtime_stop_cpu(); | 73 | vtime_stop_cpu(); |
| 84 | } | 74 | } |
| 85 | 75 | ||
| 86 | void cpu_idle(void) | 76 | void arch_cpu_idle_exit(void) |
| 87 | { | 77 | { |
| 88 | for (;;) { | 78 | if (test_thread_flag(TIF_MCCK_PENDING)) |
| 89 | tick_nohz_idle_enter(); | 79 | s390_handle_mcck(); |
| 90 | rcu_idle_enter(); | 80 | } |
| 91 | while (!need_resched() && !test_thread_flag(TIF_MCCK_PENDING)) | 81 | |
| 92 | default_idle(); | 82 | void arch_cpu_idle_dead(void) |
| 93 | rcu_idle_exit(); | 83 | { |
| 94 | tick_nohz_idle_exit(); | 84 | cpu_die(); |
| 95 | if (test_thread_flag(TIF_MCCK_PENDING)) | ||
| 96 | s390_handle_mcck(); | ||
| 97 | schedule_preempt_disabled(); | ||
| 98 | } | ||
| 99 | } | 85 | } |
| 100 | 86 | ||
| 101 | extern void __kprobes kernel_thread_starter(void); | 87 | extern void __kprobes kernel_thread_starter(void); |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 549c9d173c0f..6ff5845679e6 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -711,8 +711,7 @@ static void __cpuinit smp_start_secondary(void *cpuvoid) | |||
| 711 | set_cpu_online(smp_processor_id(), true); | 711 | set_cpu_online(smp_processor_id(), true); |
| 712 | inc_irq_stat(CPU_RST); | 712 | inc_irq_stat(CPU_RST); |
| 713 | local_irq_enable(); | 713 | local_irq_enable(); |
| 714 | /* cpu_idle will call schedule for us */ | 714 | cpu_startup_entry(CPUHP_ONLINE); |
| 715 | cpu_idle(); | ||
| 716 | } | 715 | } |
| 717 | 716 | ||
| 718 | /* Upping and downing of CPUs */ | 717 | /* Upping and downing of CPUs */ |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index a0042acbd989..3fb09359eda6 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
| @@ -158,8 +158,6 @@ void __kprobes vtime_stop_cpu(void) | |||
| 158 | unsigned long psw_mask; | 158 | unsigned long psw_mask; |
| 159 | 159 | ||
| 160 | trace_hardirqs_on(); | 160 | trace_hardirqs_on(); |
| 161 | /* Don't trace preempt off for idle. */ | ||
| 162 | stop_critical_timings(); | ||
| 163 | 161 | ||
| 164 | /* Wait for external, I/O or machine check interrupt. */ | 162 | /* Wait for external, I/O or machine check interrupt. */ |
| 165 | psw_mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_DAT | | 163 | psw_mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_DAT | |
| @@ -169,9 +167,6 @@ void __kprobes vtime_stop_cpu(void) | |||
| 169 | /* Call the assembler magic in entry.S */ | 167 | /* Call the assembler magic in entry.S */ |
| 170 | psw_idle(idle, psw_mask); | 168 | psw_idle(idle, psw_mask); |
| 171 | 169 | ||
| 172 | /* Reenable preemption tracer. */ | ||
| 173 | start_critical_timings(); | ||
| 174 | |||
| 175 | /* Account time spent with enabled wait psw loaded as idle time. */ | 170 | /* Account time spent with enabled wait psw loaded as idle time. */ |
| 176 | idle->sequence++; | 171 | idle->sequence++; |
| 177 | smp_wmb(); | 172 | smp_wmb(); |
