diff options
Diffstat (limited to 'drivers/acpi/processor_idle.c')
| -rw-r--r-- | drivers/acpi/processor_idle.c | 46 | 
1 files changed, 10 insertions, 36 deletions
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index f98dd00b51a9..c7414a545a4f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c @@ -119,17 +119,10 @@ static struct dmi_system_id processor_power_dmi_table[] = {   */  static void acpi_safe_halt(void)  { -	current_thread_info()->status &= ~TS_POLLING; -	/* -	 * TS_POLLING-cleared state must be visible before we -	 * test NEED_RESCHED: -	 */ -	smp_mb(); -	if (!need_resched()) { +	if (!tif_need_resched()) {  		safe_halt();  		local_irq_disable();  	} -	current_thread_info()->status |= TS_POLLING;  }  #ifdef ARCH_APICTIMER_STOPS_ON_C3 @@ -737,6 +730,11 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,  	if (unlikely(!pr))  		return -EINVAL; +	if (cx->entry_method == ACPI_CSTATE_FFH) { +		if (current_set_polling_and_test()) +			return -EINVAL; +	} +  	lapic_timer_state_broadcast(pr, cx, 1);  	acpi_idle_do_entry(cx); @@ -790,18 +788,9 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,  	if (unlikely(!pr))  		return -EINVAL; -	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())) { -			current_thread_info()->status |= TS_POLLING; +	if (cx->entry_method == ACPI_CSTATE_FFH) { +		if (current_set_polling_and_test())  			return -EINVAL; -		}  	}  	/* @@ -819,9 +808,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,  	sched_clock_idle_wakeup_event(0); -	if (cx->entry_method != ACPI_CSTATE_FFH) -		current_thread_info()->status |= TS_POLLING; -  	lapic_timer_state_broadcast(pr, cx, 0);  	return index;  } @@ -858,18 +844,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,  		}  	} -	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())) { -			current_thread_info()->status |= TS_POLLING; +	if (cx->entry_method == ACPI_CSTATE_FFH) { +		if (current_set_polling_and_test())  			return -EINVAL; -		}  	}  	acpi_unlazy_tlb(smp_processor_id()); @@ -915,9 +892,6 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,  	sched_clock_idle_wakeup_event(0); -	if (cx->entry_method != ACPI_CSTATE_FFH) -		current_thread_info()->status |= TS_POLLING; -  	lapic_timer_state_broadcast(pr, cx, 0);  	return index;  }  | 
