Merge git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86
* git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86: ACPI: move timer broadcast before busmaster disable clockevents: warn once when program_event() is called with negative expiry hrtimers: avoid overflow for large relative timeouts
This commit is contained in:
commit
2c5ea0f2d8
@ -530,6 +530,11 @@ static void acpi_processor_idle(void)
|
||||
break;
|
||||
|
||||
case ACPI_STATE_C3:
|
||||
/*
|
||||
* Must be done before busmaster disable as we might
|
||||
* need to access HPET !
|
||||
*/
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
/*
|
||||
* disable bus master
|
||||
* bm_check implies we need ARB_DIS
|
||||
@ -557,7 +562,6 @@ static void acpi_processor_idle(void)
|
||||
/* Get start time (ticks) */
|
||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
/* Invoke C3 */
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
/* Tell the scheduler that we are going deep-idle: */
|
||||
sched_clock_idle_sleep_event();
|
||||
acpi_cstate_enter(cx);
|
||||
@ -1401,9 +1405,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
||||
if (acpi_idle_suspend)
|
||||
return(acpi_idle_enter_c1(dev, state));
|
||||
|
||||
if (pr->flags.bm_check)
|
||||
acpi_idle_update_bm_rld(pr, cx);
|
||||
|
||||
local_irq_disable();
|
||||
current_thread_info()->status &= ~TS_POLLING;
|
||||
/*
|
||||
@ -1418,13 +1419,21 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Must be done before busmaster disable as we might need to
|
||||
* access HPET !
|
||||
*/
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
|
||||
if (pr->flags.bm_check)
|
||||
acpi_idle_update_bm_rld(pr, cx);
|
||||
|
||||
if (cx->type == ACPI_STATE_C3)
|
||||
ACPI_FLUSH_CPU_CACHE();
|
||||
|
||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
/* Tell the scheduler that we are going deep-idle: */
|
||||
sched_clock_idle_sleep_event();
|
||||
acpi_state_timer_broadcast(pr, cx, 1);
|
||||
acpi_idle_do_entry(cx);
|
||||
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||
|
||||
|
@ -850,6 +850,14 @@ hrtimer_start(struct hrtimer *timer, ktime_t tim, const enum hrtimer_mode mode)
|
||||
#ifdef CONFIG_TIME_LOW_RES
|
||||
tim = ktime_add(tim, base->resolution);
|
||||
#endif
|
||||
/*
|
||||
* Careful here: User space might have asked for a
|
||||
* very long sleep, so the add above might result in a
|
||||
* negative number, which enqueues the timer in front
|
||||
* of the queue.
|
||||
*/
|
||||
if (tim.tv64 < 0)
|
||||
tim.tv64 = KTIME_MAX;
|
||||
}
|
||||
timer->expires = tim;
|
||||
|
||||
|
@ -78,6 +78,11 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
|
||||
unsigned long long clc;
|
||||
int64_t delta;
|
||||
|
||||
if (unlikely(expires.tv64 < 0)) {
|
||||
WARN_ON_ONCE(1);
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
delta = ktime_to_ns(ktime_sub(expires, now));
|
||||
|
||||
if (delta <= 0)
|
||||
|
Loading…
Reference in New Issue
Block a user