kernel_optimize_test/kernel/time
Venkatesh Pallipadi 7c1e768974 clockevents: prevent clockevent event_handler ending up handler_noop
There is a ordering related problem with clockevents code, due to which
clockevents_register_device() called after tickless/highres switch
will not work. The new clockevent ends up with clockevents_handle_noop as
event handler, resulting in no timer activity.

The problematic path seems to be

* old device already has hrtimer_interrupt as the event_handler
* new clockevent device registers with a higher rating
* tick_check_new_device() is called
  * clockevents_exchange_device() gets called
    * old->event_handler is set to clockevents_handle_noop
  * tick_setup_device() is called for the new device
    * which sets new->event_handler using the old->event_handler which is noop.

Change the ordering so that new device inherits the proper handler.

This does not have any issue in normal case as most likely all the clockevent
devices are setup before the highres switch. But, can potentially be affecting
some corner case where HPET force detect happens after the highres switch.
This was a problem with HPET in MSI mode code that we have been experimenting
with.

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
2008-09-05 11:11:51 +02:00
..
clockevents.c clockevents: prevent clockevent event_handler ending up handler_noop 2008-09-05 11:11:51 +02:00
clocksource.c Merge branch 'cpus4096-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-07-23 18:37:44 -07:00
jiffies.c [PATCH] fix jiffies clocksource inittime 2007-04-04 21:12:47 -07:00
Kconfig clockevents: Allow build w/o run-tine usage for migration purposes 2007-10-12 23:04:05 +02:00
Makefile clockevents: Allow build w/o run-tine usage for migration purposes 2007-10-12 23:04:05 +02:00
ntp.c ntp: handle leap second via timer 2008-05-01 08:03:59 -07:00
tick-broadcast.c Merge branch 'linus' into cpus4096 2008-07-16 00:29:07 +02:00
tick-common.c clockevents: prevent clockevent event_handler ending up handler_noop 2008-09-05 11:11:51 +02:00
tick-internal.h timer: clean up tick-broadcast.c 2008-01-30 13:30:01 +01:00
tick-oneshot.c [S390] genirq/clockevents: move irq affinity prototypes/inlines to interrupt.h 2008-04-17 07:47:05 +02:00
tick-sched.c nohz: fix wrong event handler after online an offlined cpu 2008-08-21 09:54:06 +02:00
timekeeping.c ntp: handle leap second via timer 2008-05-01 08:03:59 -07:00
timer_list.c kernel: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00
timer_stats.c kernel: use non-racy method for proc entries creation 2008-04-29 08:06:22 -07:00