applied.

thanks,
-len

On Thursday 31 January 2008 20:35, [EMAIL PROTECTED] wrote:
> acpi_safe_halt() needs interrupts to be disabled for atomic
> need_resched check and safe halt. Otherwise we may miss an
> interrupt and go into halt.
> 
> acpi_safe_halt() also does not enable interrupts on all return paths.
> 
> So the callers should handle enable and disable interrupts around it.
> 
> There were multiple places where this was not happening. Below is the fix.
> 
> Signed-off-by: Venkatesh Pallipadi <[EMAIL PROTECTED]>
> 
> Index: linux-2.6.25-rc/drivers/acpi/processor_idle.c
> ===================================================================
> --- linux-2.6.25-rc.orig/drivers/acpi/processor_idle.c
> +++ linux-2.6.25-rc/drivers/acpi/processor_idle.c
> @@ -201,6 +201,10 @@ static inline u32 ticks_elapsed_in_us(u3
>               return PM_TIMER_TICKS_TO_US((0xFFFFFFFF - t1) + t2);
>  }
>  
> +/*
> + * Callers should disable interrupts before the call and enable
> + * interrupts after return.
> + */
>  static void acpi_safe_halt(void)
>  {
>       current_thread_info()->status &= ~TS_POLLING;
> @@ -393,6 +397,8 @@ static void acpi_processor_idle(void)
>                       pm_idle_save();
>               else
>                       acpi_safe_halt();
> +
> +             local_irq_enable();
>               return;
>       }
>  
> @@ -501,6 +507,7 @@ static void acpi_processor_idle(void)
>                *       skew otherwise.
>                */
>               sleep_ticks = 0xFFFFFFFF;
> +             local_irq_enable();
>               break;
>  
>       case ACPI_STATE_C2:
> @@ -1378,11 +1385,13 @@ static int acpi_idle_enter_c1(struct cpu
>       if (unlikely(!pr))
>               return 0;
>  
> +     local_irq_disable();
>       if (pr->flags.bm_check)
>               acpi_idle_update_bm_rld(pr, cx);
>  
>       acpi_safe_halt();
>  
> +     local_irq_enable();
>       cx->usage++;
>  
>       return 0;
> @@ -1490,7 +1499,9 @@ static int acpi_idle_enter_bm(struct cpu
>               if (dev->safe_state) {
>                       return dev->safe_state->enter(dev, dev->safe_state);
>               } else {
> +                     local_irq_disable();
>                       acpi_safe_halt();
> +                     local_irq_enable();
>                       return 0;
>               }
>       }
> 
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to