|
@@ -880,12 +880,14 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
|
return(acpi_idle_enter_c1(dev, state));
|
|
return(acpi_idle_enter_c1(dev, state));
|
|
|
|
|
|
local_irq_disable();
|
|
local_irq_disable();
|
|
- current_thread_info()->status &= ~TS_POLLING;
|
|
|
|
- /*
|
|
|
|
- * TS_POLLING-cleared state must be visible before we test
|
|
|
|
- * NEED_RESCHED:
|
|
|
|
- */
|
|
|
|
- smp_mb();
|
|
|
|
|
|
+ if (cx->entry_method != ACPI_CSTATE_FFH) {
|
|
|
|
+ current_thread_info()->status &= ~TS_POLLING;
|
|
|
|
+ /*
|
|
|
|
+ * TS_POLLING-cleared state must be visible before we test
|
|
|
|
+ * NEED_RESCHED:
|
|
|
|
+ */
|
|
|
|
+ smp_mb();
|
|
|
|
+ }
|
|
|
|
|
|
if (unlikely(need_resched())) {
|
|
if (unlikely(need_resched())) {
|
|
current_thread_info()->status |= TS_POLLING;
|
|
current_thread_info()->status |= TS_POLLING;
|
|
@@ -965,12 +967,14 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
|
|
}
|
|
}
|
|
|
|
|
|
local_irq_disable();
|
|
local_irq_disable();
|
|
- current_thread_info()->status &= ~TS_POLLING;
|
|
|
|
- /*
|
|
|
|
- * TS_POLLING-cleared state must be visible before we test
|
|
|
|
- * NEED_RESCHED:
|
|
|
|
- */
|
|
|
|
- smp_mb();
|
|
|
|
|
|
+ if (cx->entry_method != ACPI_CSTATE_FFH) {
|
|
|
|
+ current_thread_info()->status &= ~TS_POLLING;
|
|
|
|
+ /*
|
|
|
|
+ * TS_POLLING-cleared state must be visible before we test
|
|
|
|
+ * NEED_RESCHED:
|
|
|
|
+ */
|
|
|
|
+ smp_mb();
|
|
|
|
+ }
|
|
|
|
|
|
if (unlikely(need_resched())) {
|
|
if (unlikely(need_resched())) {
|
|
current_thread_info()->status |= TS_POLLING;
|
|
current_thread_info()->status |= TS_POLLING;
|