Re: v2.6.22.1-rt3

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2007-07-13 at 10:11 -0600, David Bahi wrote:
> On Fri, 2007-07-13 at 13:36 +0200, Remy Bohmer wrote:
> > Thomas,
> > 
> 
> > It should be: http://www.tglx.de/projects/preempt-rt/2.6.22.1-rt3/
> > 
> > Remy
> > 
> > > This release is bugfix release:
> > >
> > > - update of the x8664 -hrt queue (resolve boot problems)
> > > - gtod vsyscall fix from Gregory Haskins
> > >
> 
> excellent. this definitely de-bricks -rt2 for my box.
> 
> still, there's this -rt1 acpi + spinlock panic if ! acpi=off 
> (attached - now with some debug)
> 
> db
> 

Below is an only compile tested patch to drop the spinlocks out of the
c3 enter idle function, and use atomics instead. It looks related to
your panic.. I'm in the process of testing it, but you more than welcome
to try it..

---
 drivers/acpi/processor_idle.c |   13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)

Index: linux-2.6.22.1/drivers/acpi/processor_idle.c
===================================================================
--- linux-2.6.22.1.orig/drivers/acpi/processor_idle.c
+++ linux-2.6.22.1/drivers/acpi/processor_idle.c
@@ -950,8 +950,7 @@ static int acpi_idle_enter_c2(struct cpu
 	return ticks_elapsed_in_us(t1, t2);
 }
 
-static int c3_cpu_count;
-static DEFINE_SPINLOCK(c3_lock);
+static atomic_t c3_cpu_count;
 
 /**
  * acpi_idle_enter_c3 - enters an ACPI C3 state-type
@@ -990,16 +989,13 @@ static int acpi_idle_enter_c3(struct cpu
 
 	/* disable bus master */
 	if (pr->flags.bm_check) {
-		spin_lock(&c3_lock);
-			c3_cpu_count++;
-		if (c3_cpu_count == num_online_cpus()) {
+		if (atomic_inc_return(&c3_cpu_count) == num_online_cpus()) {
 			/*
 			 * All CPUs are trying to go to C3
 			 * Disable bus master arbitration
 			 */
 			acpi_set_register(ACPI_BITREG_ARB_DISABLE, 1);
 		}
-		spin_unlock(&c3_lock);
 	} else {
 		/* SMP with no shared cache... Invalidate cache  */
 		ACPI_FLUSH_CPU_CACHE();
@@ -1012,12 +1008,9 @@ static int acpi_idle_enter_c3(struct cpu
 	t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
 
 	if (pr->flags.bm_check) {
-		spin_lock(&c3_lock);
 		/* Enable bus master arbitration */
-		if (c3_cpu_count == num_online_cpus())
+		if (atomic_dec_return(&c3_cpu_count) == (num_online_cpus() - 1))
 			acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0);
-		c3_cpu_count--;
-		spin_unlock(&c3_lock);
 	}
 
 #ifdef CONFIG_GENERIC_TIME


-
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux