| @@ -880,12 +880,14 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev, · 879 unmodified lines |
| 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, · 73 unmodified lines |
| 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; |