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;
|
break;
|
||||||
|
|
||||||
case ACPI_STATE_C3:
|
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
|
* disable bus master
|
||||||
* bm_check implies we need ARB_DIS
|
* bm_check implies we need ARB_DIS
|
||||||
|
@ -557,7 +562,6 @@ static void acpi_processor_idle(void)
|
||||||
/* Get start time (ticks) */
|
/* Get start time (ticks) */
|
||||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||||
/* Invoke C3 */
|
/* Invoke C3 */
|
||||||
acpi_state_timer_broadcast(pr, cx, 1);
|
|
||||||
/* Tell the scheduler that we are going deep-idle: */
|
/* Tell the scheduler that we are going deep-idle: */
|
||||||
sched_clock_idle_sleep_event();
|
sched_clock_idle_sleep_event();
|
||||||
acpi_cstate_enter(cx);
|
acpi_cstate_enter(cx);
|
||||||
|
@ -1401,9 +1405,6 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
||||||
if (acpi_idle_suspend)
|
if (acpi_idle_suspend)
|
||||||
return(acpi_idle_enter_c1(dev, state));
|
return(acpi_idle_enter_c1(dev, state));
|
||||||
|
|
||||||
if (pr->flags.bm_check)
|
|
||||||
acpi_idle_update_bm_rld(pr, cx);
|
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
current_thread_info()->status &= ~TS_POLLING;
|
current_thread_info()->status &= ~TS_POLLING;
|
||||||
/*
|
/*
|
||||||
|
@ -1418,13 +1419,21 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
|
||||||
return 0;
|
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)
|
if (cx->type == ACPI_STATE_C3)
|
||||||
ACPI_FLUSH_CPU_CACHE();
|
ACPI_FLUSH_CPU_CACHE();
|
||||||
|
|
||||||
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
||||||
/* Tell the scheduler that we are going deep-idle: */
|
/* Tell the scheduler that we are going deep-idle: */
|
||||||
sched_clock_idle_sleep_event();
|
sched_clock_idle_sleep_event();
|
||||||
acpi_state_timer_broadcast(pr, cx, 1);
|
|
||||||
acpi_idle_do_entry(cx);
|
acpi_idle_do_entry(cx);
|
||||||
t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
|
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
|
#ifdef CONFIG_TIME_LOW_RES
|
||||||
tim = ktime_add(tim, base->resolution);
|
tim = ktime_add(tim, base->resolution);
|
||||||
#endif
|
#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;
|
timer->expires = tim;
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,11 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
|
||||||
unsigned long long clc;
|
unsigned long long clc;
|
||||||
int64_t delta;
|
int64_t delta;
|
||||||
|
|
||||||
|
if (unlikely(expires.tv64 < 0)) {
|
||||||
|
WARN_ON_ONCE(1);
|
||||||
|
return -ETIME;
|
||||||
|
}
|
||||||
|
|
||||||
delta = ktime_to_ns(ktime_sub(expires, now));
|
delta = ktime_to_ns(ktime_sub(expires, now));
|
||||||
|
|
||||||
if (delta <= 0)
|
if (delta <= 0)
|
||||||
|
|
Loading…
Reference in New Issue