diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/s390/kernel/process.c | 32 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 25 |
2 files changed, 4 insertions, 53 deletions
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 7920861109d2..85defd01d293 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -75,46 +75,19 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
75 | return sf->gprs[8]; | 75 | return sf->gprs[8]; |
76 | } | 76 | } |
77 | 77 | ||
78 | /* | ||
79 | * Need to know about CPUs going idle? | ||
80 | */ | ||
81 | static ATOMIC_NOTIFIER_HEAD(idle_chain); | ||
82 | DEFINE_PER_CPU(struct s390_idle_data, s390_idle); | 78 | DEFINE_PER_CPU(struct s390_idle_data, s390_idle); |
83 | 79 | ||
84 | int register_idle_notifier(struct notifier_block *nb) | ||
85 | { | ||
86 | return atomic_notifier_chain_register(&idle_chain, nb); | ||
87 | } | ||
88 | EXPORT_SYMBOL(register_idle_notifier); | ||
89 | |||
90 | int unregister_idle_notifier(struct notifier_block *nb) | ||
91 | { | ||
92 | return atomic_notifier_chain_unregister(&idle_chain, nb); | ||
93 | } | ||
94 | EXPORT_SYMBOL(unregister_idle_notifier); | ||
95 | |||
96 | static int s390_idle_enter(void) | 80 | static int s390_idle_enter(void) |
97 | { | 81 | { |
98 | struct s390_idle_data *idle; | 82 | struct s390_idle_data *idle; |
99 | int nr_calls = 0; | ||
100 | void *hcpu; | ||
101 | int rc; | ||
102 | 83 | ||
103 | hcpu = (void *)(long)smp_processor_id(); | ||
104 | rc = __atomic_notifier_call_chain(&idle_chain, S390_CPU_IDLE, hcpu, -1, | ||
105 | &nr_calls); | ||
106 | if (rc == NOTIFY_BAD) { | ||
107 | nr_calls--; | ||
108 | __atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE, | ||
109 | hcpu, nr_calls, NULL); | ||
110 | return rc; | ||
111 | } | ||
112 | idle = &__get_cpu_var(s390_idle); | 84 | idle = &__get_cpu_var(s390_idle); |
113 | spin_lock(&idle->lock); | 85 | spin_lock(&idle->lock); |
114 | idle->idle_count++; | 86 | idle->idle_count++; |
115 | idle->in_idle = 1; | 87 | idle->in_idle = 1; |
116 | idle->idle_enter = get_clock(); | 88 | idle->idle_enter = get_clock(); |
117 | spin_unlock(&idle->lock); | 89 | spin_unlock(&idle->lock); |
90 | vtime_stop_cpu_timer(); | ||
118 | return NOTIFY_OK; | 91 | return NOTIFY_OK; |
119 | } | 92 | } |
120 | 93 | ||
@@ -122,13 +95,12 @@ void s390_idle_leave(void) | |||
122 | { | 95 | { |
123 | struct s390_idle_data *idle; | 96 | struct s390_idle_data *idle; |
124 | 97 | ||
98 | vtime_start_cpu_timer(); | ||
125 | idle = &__get_cpu_var(s390_idle); | 99 | idle = &__get_cpu_var(s390_idle); |
126 | spin_lock(&idle->lock); | 100 | spin_lock(&idle->lock); |
127 | idle->idle_time += get_clock() - idle->idle_enter; | 101 | idle->idle_time += get_clock() - idle->idle_enter; |
128 | idle->in_idle = 0; | 102 | idle->in_idle = 0; |
129 | spin_unlock(&idle->lock); | 103 | spin_unlock(&idle->lock); |
130 | atomic_notifier_call_chain(&idle_chain, S390_CPU_NOT_IDLE, | ||
131 | (void *)(long) smp_processor_id()); | ||
132 | } | 104 | } |
133 | 105 | ||
134 | extern void s390_handle_mcck(void); | 106 | extern void s390_handle_mcck(void); |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index ca90ee3f930e..eb08d04bc1ec 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -136,7 +136,7 @@ static inline void set_vtimer(__u64 expires) | |||
136 | } | 136 | } |
137 | #endif | 137 | #endif |
138 | 138 | ||
139 | static void start_cpu_timer(void) | 139 | void vtime_start_cpu_timer(void) |
140 | { | 140 | { |
141 | struct vtimer_queue *vt_list; | 141 | struct vtimer_queue *vt_list; |
142 | 142 | ||
@@ -150,7 +150,7 @@ static void start_cpu_timer(void) | |||
150 | set_vtimer(vt_list->idle); | 150 | set_vtimer(vt_list->idle); |
151 | } | 151 | } |
152 | 152 | ||
153 | static void stop_cpu_timer(void) | 153 | void vtime_stop_cpu_timer(void) |
154 | { | 154 | { |
155 | struct vtimer_queue *vt_list; | 155 | struct vtimer_queue *vt_list; |
156 | 156 | ||
@@ -536,24 +536,6 @@ void init_cpu_vtimer(void) | |||
536 | 536 | ||
537 | } | 537 | } |
538 | 538 | ||
539 | static int vtimer_idle_notify(struct notifier_block *self, | ||
540 | unsigned long action, void *hcpu) | ||
541 | { | ||
542 | switch (action) { | ||
543 | case S390_CPU_IDLE: | ||
544 | stop_cpu_timer(); | ||
545 | break; | ||
546 | case S390_CPU_NOT_IDLE: | ||
547 | start_cpu_timer(); | ||
548 | break; | ||
549 | } | ||
550 | return NOTIFY_OK; | ||
551 | } | ||
552 | |||
553 | static struct notifier_block vtimer_idle_nb = { | ||
554 | .notifier_call = vtimer_idle_notify, | ||
555 | }; | ||
556 | |||
557 | void __init vtime_init(void) | 539 | void __init vtime_init(void) |
558 | { | 540 | { |
559 | /* request the cpu timer external interrupt */ | 541 | /* request the cpu timer external interrupt */ |
@@ -561,9 +543,6 @@ void __init vtime_init(void) | |||
561 | &ext_int_info_timer) != 0) | 543 | &ext_int_info_timer) != 0) |
562 | panic("Couldn't request external interrupt 0x1005"); | 544 | panic("Couldn't request external interrupt 0x1005"); |
563 | 545 | ||
564 | if (register_idle_notifier(&vtimer_idle_nb)) | ||
565 | panic("Couldn't register idle notifier"); | ||
566 | |||
567 | /* Enable cpu timer interrupts on the boot cpu. */ | 546 | /* Enable cpu timer interrupts on the boot cpu. */ |
568 | init_cpu_vtimer(); | 547 | init_cpu_vtimer(); |
569 | } | 548 | } |