diff options
Diffstat (limited to 'drivers/acpi/processor_idle.c')
-rw-r--r-- | drivers/acpi/processor_idle.c | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index e88e8ae04fdb..cc978a8c00b7 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -880,12 +880,14 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, | |||
880 | return(acpi_idle_enter_c1(dev, state)); | 880 | return(acpi_idle_enter_c1(dev, state)); |
881 | 881 | ||
882 | local_irq_disable(); | 882 | local_irq_disable(); |
883 | current_thread_info()->status &= ~TS_POLLING; | 883 | if (cx->entry_method != ACPI_CSTATE_FFH) { |
884 | /* | 884 | current_thread_info()->status &= ~TS_POLLING; |
885 | * TS_POLLING-cleared state must be visible before we test | 885 | /* |
886 | * NEED_RESCHED: | 886 | * TS_POLLING-cleared state must be visible before we test |
887 | */ | 887 | * NEED_RESCHED: |
888 | smp_mb(); | 888 | */ |
889 | smp_mb(); | ||
890 | } | ||
889 | 891 | ||
890 | if (unlikely(need_resched())) { | 892 | if (unlikely(need_resched())) { |
891 | current_thread_info()->status |= TS_POLLING; | 893 | current_thread_info()->status |= TS_POLLING; |
@@ -965,12 +967,14 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
965 | } | 967 | } |
966 | 968 | ||
967 | local_irq_disable(); | 969 | local_irq_disable(); |
968 | current_thread_info()->status &= ~TS_POLLING; | 970 | if (cx->entry_method != ACPI_CSTATE_FFH) { |
969 | /* | 971 | current_thread_info()->status &= ~TS_POLLING; |
970 | * TS_POLLING-cleared state must be visible before we test | 972 | /* |
971 | * NEED_RESCHED: | 973 | * TS_POLLING-cleared state must be visible before we test |
972 | */ | 974 | * NEED_RESCHED: |
973 | smp_mb(); | 975 | */ |
976 | smp_mb(); | ||
977 | } | ||
974 | 978 | ||
975 | if (unlikely(need_resched())) { | 979 | if (unlikely(need_resched())) { |
976 | current_thread_info()->status |= TS_POLLING; | 980 | current_thread_info()->status |= TS_POLLING; |