diff options
author | Jan Beulich <jbeulich@novell.com> | 2011-03-12 13:28:05 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2011-03-12 13:28:05 +0000 |
commit | 721dab2acdeb00a458719e549ab1916fc415b49b (patch) | |
tree | a9ec056d70cc5d578da354372550d33885f75430 | |
parent | 48dc4855022cdedbd6c1cfd6d2c6eb70350aa7b1 (diff) | |
download | xen-721dab2acdeb00a458719e549ab1916fc415b49b.tar.gz xen-721dab2acdeb00a458719e549ab1916fc415b49b.tar.bz2 xen-721dab2acdeb00a458719e549ab1916fc415b49b.zip |
x86/HPET: fix initialization order
At least the legacy path can enter its interrupt handler callout while
initialization is still in progress - that handler checks whether
->event_handler is non-NULL, and hence all other initialization must
happen before setting this field.
Do the same to the MSI initialization just in case (and to keep the
code in sync).
Signed-off-by: Jan Beulich <jbeulich@novell.com>
Acked-by: Wei Gang <gang.wei@intel.com>
xen-unstable changeset: 23030:87aa1277eae0
xen-unstable date: Sat Mar 12 13:19:02 2011 +0000
-rw-r--r-- | xen/arch/x86/hpet.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index 0e099de8ec..c47b527035 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -567,8 +567,9 @@ void hpet_broadcast_init(void) 1000000000ul, 32); hpet_events[i].shift = 32; hpet_events[i].next_event = STIME_MAX; - hpet_events[i].event_handler = handle_hpet_broadcast; spin_lock_init(&hpet_events[i].lock); + wmb(); + hpet_events[i].event_handler = handle_hpet_broadcast; } if ( num_hpets_used < num_possible_cpus() ) @@ -605,10 +606,11 @@ void hpet_broadcast_init(void) legacy_hpet_event.mult = div_sc((unsigned long)hpet_rate, 1000000000ul, 32); legacy_hpet_event.shift = 32; legacy_hpet_event.next_event = STIME_MAX; - legacy_hpet_event.event_handler = handle_hpet_broadcast; legacy_hpet_event.idx = 0; legacy_hpet_event.flags = 0; spin_lock_init(&legacy_hpet_event.lock); + wmb(); + legacy_hpet_event.event_handler = handle_hpet_broadcast; for_each_possible_cpu(i) per_cpu(cpu_bc_channel, i) = &legacy_hpet_event; |