diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-06-17 08:53:12 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-06-17 08:53:12 +0100 |
commit | a038a9b44bc165513de3f250e743228e8fed61c6 (patch) | |
tree | 5772f57c741222c2390e29eca4f0951c2240b7d1 | |
parent | df52a1391236928859f95290a21713fc533386bf (diff) | |
download | xen-a038a9b44bc165513de3f250e743228e8fed61c6.tar.gz xen-a038a9b44bc165513de3f250e743228e8fed61c6.tar.bz2 xen-a038a9b44bc165513de3f250e743228e8fed61c6.zip |
cpuidle: redefine cpumask_lock as rwlock_t
Multiple cpus clear hpet channel cpumask simultaneously is ok. So we
can change the cpumask_lock to rwlock_t.
Signed-off-by: Wei Gang <gang.wei@intel.com>
-rw-r--r-- | xen/arch/x86/hpet.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c index d1fe7a5ee0..25e4434cc1 100644 --- a/xen/arch/x86/hpet.c +++ b/xen/arch/x86/hpet.c @@ -34,7 +34,7 @@ struct hpet_event_channel int shift; s_time_t next_event; cpumask_t cpumask; - spinlock_t cpumask_lock; + rwlock_t cpumask_lock; spinlock_t lock; void (*event_handler)(struct hpet_event_channel *); @@ -197,7 +197,7 @@ again: /* find all expired events */ for_each_cpu_mask(cpu, ch->cpumask) { - spin_lock_irq(&ch->cpumask_lock); + write_lock_irq(&ch->cpumask_lock); if ( cpumask_test_cpu(cpu, ch->cpumask) ) { @@ -207,7 +207,7 @@ again: next_event = per_cpu(timer_deadline_end, cpu); } - spin_unlock_irq(&ch->cpumask_lock); + write_unlock_irq(&ch->cpumask_lock); } /* wakeup the cpus which have an expired event. */ @@ -580,7 +580,7 @@ void hpet_broadcast_init(void) hpet_events[i].next_event = STIME_MAX; hpet_events[i].event_handler = handle_hpet_broadcast; spin_lock_init(&hpet_events[i].lock); - spin_lock_init(&hpet_events[i].cpumask_lock); + rwlock_init(&hpet_events[i].cpumask_lock); } return; @@ -615,7 +615,7 @@ void hpet_broadcast_init(void) legacy_hpet_event.idx = 0; legacy_hpet_event.flags = 0; spin_lock_init(&legacy_hpet_event.lock); - spin_lock_init(&legacy_hpet_event.cpumask_lock); + rwlock_init(&legacy_hpet_event.cpumask_lock); if ( !force_hpet_broadcast ) pv_rtc_handler = handle_rtc_once; @@ -692,9 +692,9 @@ void hpet_broadcast_exit(void) if ( !reprogram_timer(this_cpu(timer_deadline_start)) ) raise_softirq(TIMER_SOFTIRQ); - spin_lock_irq(&ch->cpumask_lock); + read_lock_irq(&ch->cpumask_lock); cpu_clear(cpu, ch->cpumask); - spin_unlock_irq(&ch->cpumask_lock); + read_unlock_irq(&ch->cpumask_lock); if ( ch != &legacy_hpet_event ) { |