Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 312380
b: refs/heads/master
c: 2ac0d98
h: refs/heads/master
v: v3
  • Loading branch information
Frederic Weisbecker committed Jun 11, 2012
1 parent c7f1085 commit be89aae
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 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: 19f5f7364a1cc770b14692f609bb9b802fc334d5
refs/heads/master: 2ac0d98fd624ae50f5e6ae9c800977a9dbbfcde6
37 changes: 22 additions & 15 deletions trunk/kernel/time/tick-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,6 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts, ktime_t now)

ts->idle_tick = hrtimer_get_expires(&ts->sched_timer);
ts->tick_stopped = 1;
ts->idle_jiffies = last_jiffies;
}

ts->idle_sleeps++;
Expand Down Expand Up @@ -445,9 +444,13 @@ static void tick_nohz_stop_sched_tick(struct tick_sched *ts, ktime_t now)
static void __tick_nohz_idle_enter(struct tick_sched *ts)
{
ktime_t now;
int was_stopped = ts->tick_stopped;

now = tick_nohz_start_idle(smp_processor_id(), ts);
tick_nohz_stop_sched_tick(ts, now);

if (!was_stopped && ts->tick_stopped)
ts->idle_jiffies = ts->last_jiffies;
}

/**
Expand Down Expand Up @@ -548,15 +551,25 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now)

static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)
{
#ifndef CONFIG_VIRT_CPU_ACCOUNTING
unsigned long ticks;
#endif
/* Update jiffies first */
select_nohz_load_balancer(0);
tick_do_update_jiffies64(now);
update_cpu_load_nohz();

touch_softlockup_watchdog();
/*
* Cancel the scheduled timer and restore the tick
*/
ts->tick_stopped = 0;
ts->idle_exittime = now;

tick_nohz_restart(ts, now);
}

static void tick_nohz_account_idle_ticks(struct tick_sched *ts)
{
#ifndef CONFIG_VIRT_CPU_ACCOUNTING
unsigned long ticks;
/*
* We stopped the tick in idle. Update process times would miss the
* time we slept as update_process_times does only a 1 tick
Expand All @@ -569,15 +582,6 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)
if (ticks && ticks < LONG_MAX)
account_idle_ticks(ticks);
#endif

touch_softlockup_watchdog();
/*
* Cancel the scheduled timer and restore the tick
*/
ts->tick_stopped = 0;
ts->idle_exittime = now;

tick_nohz_restart(ts, now);
}

/**
Expand Down Expand Up @@ -605,8 +609,10 @@ void tick_nohz_idle_exit(void)
if (ts->idle_active)
tick_nohz_stop_idle(cpu, now);

if (ts->tick_stopped)
if (ts->tick_stopped) {
tick_nohz_restart_sched_tick(ts, now);
tick_nohz_account_idle_ticks(ts);
}

local_irq_enable();
}
Expand Down Expand Up @@ -811,7 +817,8 @@ static enum hrtimer_restart tick_sched_timer(struct hrtimer *timer)
*/
if (ts->tick_stopped) {
touch_softlockup_watchdog();
ts->idle_jiffies++;
if (idle_cpu(cpu))
ts->idle_jiffies++;
}
update_process_times(user_mode(regs));
profile_tick(CPU_PROFILING);
Expand Down

0 comments on commit be89aae

Please sign in to comment.