[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] CPUIDLE: Write to ARB_DISABLE conditionally to reduce some idle overheads.
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |