diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/time/clockevents.c | 35 | ||||
-rw-r--r-- | kernel/time/tick-broadcast.c | 5 | ||||
-rw-r--r-- | kernel/time/tick-common.c | 30 | ||||
-rw-r--r-- | kernel/time/tick-internal.h | 7 |
4 files changed, 14 insertions, 63 deletions
diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c index c6d6400ee137..dd70b4842c62 100644 --- a/kernel/time/clockevents.c +++ b/kernel/time/clockevents.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/hrtimer.h> | 15 | #include <linux/hrtimer.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/module.h> | 17 | #include <linux/module.h> |
18 | #include <linux/notifier.h> | ||
19 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
20 | 19 | ||
21 | #include "tick-internal.h" | 20 | #include "tick-internal.h" |
@@ -23,10 +22,6 @@ | |||
23 | /* The registered clock event devices */ | 22 | /* The registered clock event devices */ |
24 | static LIST_HEAD(clockevent_devices); | 23 | static LIST_HEAD(clockevent_devices); |
25 | static LIST_HEAD(clockevents_released); | 24 | static LIST_HEAD(clockevents_released); |
26 | |||
27 | /* Notification for clock events */ | ||
28 | static RAW_NOTIFIER_HEAD(clockevents_chain); | ||
29 | |||
30 | /* Protection for the above */ | 25 | /* Protection for the above */ |
31 | static DEFINE_RAW_SPINLOCK(clockevents_lock); | 26 | static DEFINE_RAW_SPINLOCK(clockevents_lock); |
32 | 27 | ||
@@ -232,30 +227,6 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires, | |||
232 | return (rc && force) ? clockevents_program_min_delta(dev) : rc; | 227 | return (rc && force) ? clockevents_program_min_delta(dev) : rc; |
233 | } | 228 | } |
234 | 229 | ||
235 | /** | ||
236 | * clockevents_register_notifier - register a clock events change listener | ||
237 | */ | ||
238 | int clockevents_register_notifier(struct notifier_block *nb) | ||
239 | { | ||
240 | unsigned long flags; | ||
241 | int ret; | ||
242 | |||
243 | raw_spin_lock_irqsave(&clockevents_lock, flags); | ||
244 | ret = raw_notifier_chain_register(&clockevents_chain, nb); | ||
245 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); | ||
246 | |||
247 | return ret; | ||
248 | } | ||
249 | |||
250 | /* | ||
251 | * Notify about a clock event change. Called with clockevents_lock | ||
252 | * held. | ||
253 | */ | ||
254 | static void clockevents_do_notify(unsigned long reason, void *dev) | ||
255 | { | ||
256 | raw_notifier_call_chain(&clockevents_chain, reason, dev); | ||
257 | } | ||
258 | |||
259 | /* | 230 | /* |
260 | * Called after a notify add to make devices available which were | 231 | * Called after a notify add to make devices available which were |
261 | * released from the notifier call. | 232 | * released from the notifier call. |
@@ -269,7 +240,7 @@ static void clockevents_notify_released(void) | |||
269 | struct clock_event_device, list); | 240 | struct clock_event_device, list); |
270 | list_del(&dev->list); | 241 | list_del(&dev->list); |
271 | list_add(&dev->list, &clockevent_devices); | 242 | list_add(&dev->list, &clockevent_devices); |
272 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); | 243 | tick_check_new_device(dev); |
273 | } | 244 | } |
274 | } | 245 | } |
275 | 246 | ||
@@ -290,7 +261,7 @@ void clockevents_register_device(struct clock_event_device *dev) | |||
290 | raw_spin_lock_irqsave(&clockevents_lock, flags); | 261 | raw_spin_lock_irqsave(&clockevents_lock, flags); |
291 | 262 | ||
292 | list_add(&dev->list, &clockevent_devices); | 263 | list_add(&dev->list, &clockevent_devices); |
293 | clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev); | 264 | tick_check_new_device(dev); |
294 | clockevents_notify_released(); | 265 | clockevents_notify_released(); |
295 | 266 | ||
296 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); | 267 | raw_spin_unlock_irqrestore(&clockevents_lock, flags); |
@@ -433,7 +404,7 @@ void clockevents_notify(unsigned long reason, void *arg) | |||
433 | int cpu; | 404 | int cpu; |
434 | 405 | ||
435 | raw_spin_lock_irqsave(&clockevents_lock, flags); | 406 | raw_spin_lock_irqsave(&clockevents_lock, flags); |
436 | clockevents_do_notify(reason, arg); | 407 | tick_notify(reason, arg); |
437 | 408 | ||
438 | switch (reason) { | 409 | switch (reason) { |
439 | case CLOCK_EVT_NOTIFY_CPU_DEAD: | 410 | case CLOCK_EVT_NOTIFY_CPU_DEAD: |
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 24938d577669..3500caaa0bfd 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
@@ -64,7 +64,7 @@ static void tick_broadcast_start_periodic(struct clock_event_device *bc) | |||
64 | /* | 64 | /* |
65 | * Check, if the device can be utilized as broadcast device: | 65 | * Check, if the device can be utilized as broadcast device: |
66 | */ | 66 | */ |
67 | int tick_check_broadcast_device(struct clock_event_device *dev) | 67 | void tick_install_broadcast_device(struct clock_event_device *dev) |
68 | { | 68 | { |
69 | struct clock_event_device *cur = tick_broadcast_device.evtdev; | 69 | struct clock_event_device *cur = tick_broadcast_device.evtdev; |
70 | 70 | ||
@@ -72,7 +72,7 @@ int tick_check_broadcast_device(struct clock_event_device *dev) | |||
72 | (tick_broadcast_device.evtdev && | 72 | (tick_broadcast_device.evtdev && |
73 | tick_broadcast_device.evtdev->rating >= dev->rating) || | 73 | tick_broadcast_device.evtdev->rating >= dev->rating) || |
74 | (dev->features & CLOCK_EVT_FEAT_C3STOP)) | 74 | (dev->features & CLOCK_EVT_FEAT_C3STOP)) |
75 | return 0; | 75 | return; |
76 | 76 | ||
77 | clockevents_exchange_device(tick_broadcast_device.evtdev, dev); | 77 | clockevents_exchange_device(tick_broadcast_device.evtdev, dev); |
78 | if (cur) | 78 | if (cur) |
@@ -90,7 +90,6 @@ int tick_check_broadcast_device(struct clock_event_device *dev) | |||
90 | */ | 90 | */ |
91 | if (dev->features & CLOCK_EVT_FEAT_ONESHOT) | 91 | if (dev->features & CLOCK_EVT_FEAT_ONESHOT) |
92 | tick_clock_notify(); | 92 | tick_clock_notify(); |
93 | return 1; | ||
94 | } | 93 | } |
95 | 94 | ||
96 | /* | 95 | /* |
diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 5d3fb100bc06..dbf4e18d5101 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c | |||
@@ -208,11 +208,11 @@ static void tick_setup_device(struct tick_device *td, | |||
208 | /* | 208 | /* |
209 | * Check, if the new registered device should be used. | 209 | * Check, if the new registered device should be used. |
210 | */ | 210 | */ |
211 | static int tick_check_new_device(struct clock_event_device *newdev) | 211 | void tick_check_new_device(struct clock_event_device *newdev) |
212 | { | 212 | { |
213 | struct clock_event_device *curdev; | 213 | struct clock_event_device *curdev; |
214 | struct tick_device *td; | 214 | struct tick_device *td; |
215 | int cpu, ret = NOTIFY_OK; | 215 | int cpu; |
216 | unsigned long flags; | 216 | unsigned long flags; |
217 | 217 | ||
218 | raw_spin_lock_irqsave(&tick_device_lock, flags); | 218 | raw_spin_lock_irqsave(&tick_device_lock, flags); |
@@ -275,18 +275,14 @@ static int tick_check_new_device(struct clock_event_device *newdev) | |||
275 | tick_oneshot_notify(); | 275 | tick_oneshot_notify(); |
276 | 276 | ||
277 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); | 277 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); |
278 | return NOTIFY_STOP; | 278 | return; |
279 | 279 | ||
280 | out_bc: | 280 | out_bc: |
281 | /* | 281 | /* |
282 | * Can the new device be used as a broadcast device ? | 282 | * Can the new device be used as a broadcast device ? |
283 | */ | 283 | */ |
284 | if (tick_check_broadcast_device(newdev)) | 284 | tick_install_broadcast_device(newdev); |
285 | ret = NOTIFY_STOP; | ||
286 | |||
287 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); | 285 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); |
288 | |||
289 | return ret; | ||
290 | } | 286 | } |
291 | 287 | ||
292 | /* | 288 | /* |
@@ -360,17 +356,10 @@ static void tick_resume(void) | |||
360 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); | 356 | raw_spin_unlock_irqrestore(&tick_device_lock, flags); |
361 | } | 357 | } |
362 | 358 | ||
363 | /* | 359 | void tick_notify(unsigned long reason, void *dev) |
364 | * Notification about clock event devices | ||
365 | */ | ||
366 | static int tick_notify(struct notifier_block *nb, unsigned long reason, | ||
367 | void *dev) | ||
368 | { | 360 | { |
369 | switch (reason) { | 361 | switch (reason) { |
370 | 362 | ||
371 | case CLOCK_EVT_NOTIFY_ADD: | ||
372 | return tick_check_new_device(dev); | ||
373 | |||
374 | case CLOCK_EVT_NOTIFY_BROADCAST_ON: | 363 | case CLOCK_EVT_NOTIFY_BROADCAST_ON: |
375 | case CLOCK_EVT_NOTIFY_BROADCAST_OFF: | 364 | case CLOCK_EVT_NOTIFY_BROADCAST_OFF: |
376 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: | 365 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: |
@@ -404,21 +393,12 @@ static int tick_notify(struct notifier_block *nb, unsigned long reason, | |||
404 | default: | 393 | default: |
405 | break; | 394 | break; |
406 | } | 395 | } |
407 | |||
408 | return NOTIFY_OK; | ||
409 | } | 396 | } |
410 | 397 | ||
411 | static struct notifier_block tick_notifier = { | ||
412 | .notifier_call = tick_notify, | ||
413 | }; | ||
414 | |||
415 | /** | 398 | /** |
416 | * tick_init - initialize the tick control | 399 | * tick_init - initialize the tick control |
417 | * | ||
418 | * Register the notifier with the clockevents framework | ||
419 | */ | 400 | */ |
420 | void __init tick_init(void) | 401 | void __init tick_init(void) |
421 | { | 402 | { |
422 | clockevents_register_notifier(&tick_notifier); | ||
423 | tick_broadcast_init(); | 403 | tick_broadcast_init(); |
424 | } | 404 | } |
diff --git a/kernel/time/tick-internal.h b/kernel/time/tick-internal.h index f0299eae4602..60742fe6f63d 100644 --- a/kernel/time/tick-internal.h +++ b/kernel/time/tick-internal.h | |||
@@ -18,6 +18,8 @@ extern int tick_do_timer_cpu __read_mostly; | |||
18 | 18 | ||
19 | extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast); | 19 | extern void tick_setup_periodic(struct clock_event_device *dev, int broadcast); |
20 | extern void tick_handle_periodic(struct clock_event_device *dev); | 20 | extern void tick_handle_periodic(struct clock_event_device *dev); |
21 | extern void tick_notify(unsigned long reason, void *dev); | ||
22 | extern void tick_check_new_device(struct clock_event_device *dev); | ||
21 | 23 | ||
22 | extern void clockevents_shutdown(struct clock_event_device *dev); | 24 | extern void clockevents_shutdown(struct clock_event_device *dev); |
23 | 25 | ||
@@ -90,7 +92,7 @@ static inline bool tick_broadcast_oneshot_available(void) { return false; } | |||
90 | */ | 92 | */ |
91 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 93 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST |
92 | extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu); | 94 | extern int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu); |
93 | extern int tick_check_broadcast_device(struct clock_event_device *dev); | 95 | extern void tick_install_broadcast_device(struct clock_event_device *dev); |
94 | extern int tick_is_broadcast_device(struct clock_event_device *dev); | 96 | extern int tick_is_broadcast_device(struct clock_event_device *dev); |
95 | extern void tick_broadcast_on_off(unsigned long reason, int *oncpu); | 97 | extern void tick_broadcast_on_off(unsigned long reason, int *oncpu); |
96 | extern void tick_shutdown_broadcast(unsigned int *cpup); | 98 | extern void tick_shutdown_broadcast(unsigned int *cpup); |
@@ -102,9 +104,8 @@ tick_set_periodic_handler(struct clock_event_device *dev, int broadcast); | |||
102 | 104 | ||
103 | #else /* !BROADCAST */ | 105 | #else /* !BROADCAST */ |
104 | 106 | ||
105 | static inline int tick_check_broadcast_device(struct clock_event_device *dev) | 107 | static inline void tick_install_broadcast_device(struct clock_event_device *dev) |
106 | { | 108 | { |
107 | return 0; | ||
108 | } | 109 | } |
109 | 110 | ||
110 | static inline int tick_is_broadcast_device(struct clock_event_device *dev) | 111 | static inline int tick_is_broadcast_device(struct clock_event_device *dev) |