Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 110089
b: refs/heads/master
c: 41e1022
h: refs/heads/master
i:
  110087: d49feda
v: v3
  • Loading branch information
Thomas Gleixner committed Sep 29, 2008
1 parent eeb1de7 commit 9391d7f
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7659e349672bb0d378ef8d7d62bae4c53d2bdd18
refs/heads/master: 41e1022eae71707f1ce6801a746f70b1e57b7567
28 changes: 25 additions & 3 deletions trunk/kernel/hrtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1591,11 +1591,12 @@ static void __cpuinit init_hrtimers_cpu(int cpu)

#ifdef CONFIG_HOTPLUG_CPU

static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base,
static int migrate_hrtimer_list(struct hrtimer_clock_base *old_base,
struct hrtimer_clock_base *new_base)
{
struct hrtimer *timer;
struct rb_node *node;
int raise = 0;

while ((node = rb_first(&old_base->active))) {
timer = rb_entry(node, struct hrtimer, node);
Expand All @@ -1607,7 +1608,27 @@ static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base,
* Enqueue the timer. Allow reprogramming of the event device
*/
enqueue_hrtimer(timer, new_base, 1);

#ifdef CONFIG_HIGH_RES_TIMERS
/*
* Happens with high res enabled when the timer was
* already expired and the callback mode is
* HRTIMER_CB_IRQSAFE_NO_SOFTIRQ
* (hrtimer_sleeper). The enqueue code does not move
* them to the soft irq pending list for
* performance/latency reasons, but in the migration
* state, we need to do that otherwise we end up with
* a stale timer.
*/
if (timer->state == HRTIMER_STATE_INACTIVE) {
timer->state = HRTIMER_STATE_PENDING;
list_add_tail(&timer->cb_entry,
&new_base->cpu_base->cb_pending);
raise = 1;
}
#endif
}
return raise;
}

#ifdef CONFIG_HIGH_RES_TIMERS
Expand Down Expand Up @@ -1652,8 +1673,9 @@ static void migrate_hrtimers(int cpu)
spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING);

for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
migrate_hrtimer_list(&old_base->clock_base[i],
&new_base->clock_base[i]);
if (migrate_hrtimer_list(&old_base->clock_base[i],
&new_base->clock_base[i]))
raise = 1;
}

if (migrate_hrtimer_pending(old_base, new_base))
Expand Down

0 comments on commit 9391d7f

Please sign in to comment.