|
|
|
|
|
|
|
|
|
|
xen-changelog
[Xen-changelog] [xen-unstable] CPUIDLE: Write to ARB_DISABLE conditional
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1220523557 -3600
# Node ID bed1b98b63cc98364b2b5ad04bffc00d588c5ef4
# Parent c9db93b0660ae644491c862e47744a2349ba630f
CPUIDLE: Write to ARB_DISABLE conditionally to reduce some idle overheads.
By protecting entry/exit with a spinlock we can safely determine
precisely when it is required that we assert/deassert ARB_DISABLE.
Signed-off-by: Wei Gang <gang.wei@xxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
xen/arch/x86/acpi/cpu_idle.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff -r c9db93b0660a -r bed1b98b63cc xen/arch/x86/acpi/cpu_idle.c
--- a/xen/arch/x86/acpi/cpu_idle.c Wed Sep 03 14:56:08 2008 +0100
+++ b/xen/arch/x86/acpi/cpu_idle.c Thu Sep 04 11:19:17 2008 +0100
@@ -263,7 +263,10 @@ static void acpi_idle_do_entry(struct ac
}
}
-static atomic_t c3_cpu_count;
+static struct {
+ spinlock_t lock;
+ unsigned int count;
+} c3_cpu_status = { .lock = SPIN_LOCK_UNLOCKED };
static void acpi_processor_idle(void)
{
@@ -416,8 +419,8 @@ static void acpi_processor_idle(void)
*/
if ( power->flags.bm_check && power->flags.bm_control )
{
- atomic_inc(&c3_cpu_count);
- if ( atomic_read(&c3_cpu_count) == num_online_cpus() )
+ spin_lock(&c3_cpu_status.lock);
+ if ( ++c3_cpu_status.count == num_online_cpus() )
{
/*
* All CPUs are trying to go to C3
@@ -425,6 +428,7 @@ static void acpi_processor_idle(void)
*/
acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
}
+ spin_unlock(&c3_cpu_status.lock);
}
else if ( !power->flags.bm_check )
{
@@ -455,8 +459,10 @@ static void acpi_processor_idle(void)
if ( power->flags.bm_check && power->flags.bm_control )
{
/* Enable bus master arbitration */
- atomic_dec(&c3_cpu_count);
- acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
+ spin_lock(&c3_cpu_status.lock);
+ if ( c3_cpu_status.count-- == num_online_cpus() )
+ acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
+ spin_unlock(&c3_cpu_status.lock);
}
/* Re-enable interrupts */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-changelog] [xen-unstable] CPUIDLE: Write to ARB_DISABLE conditionally to reduce some idle overheads.,
Xen patchbot-unstable <=
|
|
|
|
|