mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 14:41:27 +00:00
Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (34 commits) time: Prevent 32 bit overflow with set_normalized_timespec() clocksource: Delay clocksource down rating to late boot clocksource: clocksource_select must be called with mutex locked clocksource: Resolve cpu hotplug dead lock with TSC unstable, fix crash timers: Drop a function prototype clocksource: Resolve cpu hotplug dead lock with TSC unstable timer.c: Fix S/390 comments timekeeping: Fix invalid getboottime() value timekeeping: Fix up read_persistent_clock() breakage on sh timekeeping: Increase granularity of read_persistent_clock(), build fix time: Introduce CLOCK_REALTIME_COARSE x86: Do not unregister PIT clocksource on PIT oneshot setup/shutdown clocksource: Avoid clocksource watchdog circular locking dependency clocksource: Protect the watchdog rating changes with clocksource_mutex clocksource: Call clocksource_change_rating() outside of watchdog_lock timekeeping: Introduce read_boot_clock timekeeping: Increase granularity of read_persistent_clock() timekeeping: Update clocksource with stop_machine timekeeping: Add timekeeper read_clock helper functions timekeeping: Move NTP adjusted clock multiplier to struct timekeeper ... Fix trivial conflict due to MIPS lemote -> loongson renaming.
This commit is contained in:
commit
a03fdb7612
32 changed files with 932 additions and 655 deletions
|
@ -72,6 +72,7 @@ struct tvec_base {
|
|||
spinlock_t lock;
|
||||
struct timer_list *running_timer;
|
||||
unsigned long timer_jiffies;
|
||||
unsigned long next_timer;
|
||||
struct tvec_root tv1;
|
||||
struct tvec tv2;
|
||||
struct tvec tv3;
|
||||
|
@ -622,6 +623,9 @@ __mod_timer(struct timer_list *timer, unsigned long expires,
|
|||
|
||||
if (timer_pending(timer)) {
|
||||
detach_timer(timer, 0);
|
||||
if (timer->expires == base->next_timer &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
base->next_timer = base->timer_jiffies;
|
||||
ret = 1;
|
||||
} else {
|
||||
if (pending_only)
|
||||
|
@ -663,6 +667,9 @@ __mod_timer(struct timer_list *timer, unsigned long expires,
|
|||
}
|
||||
|
||||
timer->expires = expires;
|
||||
if (time_before(timer->expires, base->next_timer) &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
base->next_timer = timer->expires;
|
||||
internal_add_timer(base, timer);
|
||||
|
||||
out_unlock:
|
||||
|
@ -781,6 +788,9 @@ void add_timer_on(struct timer_list *timer, int cpu)
|
|||
spin_lock_irqsave(&base->lock, flags);
|
||||
timer_set_base(timer, base);
|
||||
debug_timer_activate(timer);
|
||||
if (time_before(timer->expires, base->next_timer) &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
base->next_timer = timer->expires;
|
||||
internal_add_timer(base, timer);
|
||||
/*
|
||||
* Check whether the other CPU is idle and needs to be
|
||||
|
@ -817,6 +827,9 @@ int del_timer(struct timer_list *timer)
|
|||
base = lock_timer_base(timer, &flags);
|
||||
if (timer_pending(timer)) {
|
||||
detach_timer(timer, 1);
|
||||
if (timer->expires == base->next_timer &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
base->next_timer = base->timer_jiffies;
|
||||
ret = 1;
|
||||
}
|
||||
spin_unlock_irqrestore(&base->lock, flags);
|
||||
|
@ -850,6 +863,9 @@ int try_to_del_timer_sync(struct timer_list *timer)
|
|||
ret = 0;
|
||||
if (timer_pending(timer)) {
|
||||
detach_timer(timer, 1);
|
||||
if (timer->expires == base->next_timer &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
base->next_timer = base->timer_jiffies;
|
||||
ret = 1;
|
||||
}
|
||||
out:
|
||||
|
@ -1007,8 +1023,8 @@ static inline void __run_timers(struct tvec_base *base)
|
|||
#ifdef CONFIG_NO_HZ
|
||||
/*
|
||||
* Find out when the next timer event is due to happen. This
|
||||
* is used on S/390 to stop all activity when a cpus is idle.
|
||||
* This functions needs to be called disabled.
|
||||
* is used on S/390 to stop all activity when a CPU is idle.
|
||||
* This function needs to be called with interrupts disabled.
|
||||
*/
|
||||
static unsigned long __next_timer_interrupt(struct tvec_base *base)
|
||||
{
|
||||
|
@ -1134,7 +1150,9 @@ unsigned long get_next_timer_interrupt(unsigned long now)
|
|||
unsigned long expires;
|
||||
|
||||
spin_lock(&base->lock);
|
||||
expires = __next_timer_interrupt(base);
|
||||
if (time_before_eq(base->next_timer, base->timer_jiffies))
|
||||
base->next_timer = __next_timer_interrupt(base);
|
||||
expires = base->next_timer;
|
||||
spin_unlock(&base->lock);
|
||||
|
||||
if (time_before_eq(expires, now))
|
||||
|
@ -1522,6 +1540,7 @@ static int __cpuinit init_timers_cpu(int cpu)
|
|||
INIT_LIST_HEAD(base->tv1.vec + j);
|
||||
|
||||
base->timer_jiffies = jiffies;
|
||||
base->next_timer = base->timer_jiffies;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1534,6 +1553,9 @@ static void migrate_timer_list(struct tvec_base *new_base, struct list_head *hea
|
|||
timer = list_first_entry(head, struct timer_list, entry);
|
||||
detach_timer(timer, 0);
|
||||
timer_set_base(timer, new_base);
|
||||
if (time_before(timer->expires, new_base->next_timer) &&
|
||||
!tbase_get_deferrable(timer->base))
|
||||
new_base->next_timer = timer->expires;
|
||||
internal_add_timer(new_base, timer);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue