aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-06-17 08:53:12 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-06-17 08:53:12 +0100
commita038a9b44bc165513de3f250e743228e8fed61c6 (patch)
tree5772f57c741222c2390e29eca4f0951c2240b7d1
parentdf52a1391236928859f95290a21713fc533386bf (diff)
downloadxen-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.c14
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 )
{