Skip to content

Commit

Permalink
freezer: shorten freezer sleep time using exponential backoff
Browse files Browse the repository at this point in the history
  • Loading branch information
colincross authored and neobuddy89 committed Jun 23, 2013
1 parent fd316e8 commit e5058e1
Showing 1 changed file with 15 additions and 11 deletions.
26 changes: 15 additions & 11 deletions kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,10 @@ static int try_to_freeze_tasks(bool sig_only)
unsigned int todo;
bool wq_busy = false;
struct timeval start, end;
u64 elapsed_csecs64;
unsigned int elapsed_csecs;
u64 elapsed_msecs64;
unsigned int elapsed_msecs;
bool wakeup = false;
int sleep_usecs = USEC_PER_MSEC;

do_gettimeofday(&start);

Expand Down Expand Up @@ -99,13 +100,15 @@ static int try_to_freeze_tasks(bool sig_only)
* We need to retry, but first give the freezing tasks some
* time to enter the regrigerator.
*/
msleep(10);
usleep_range(sleep_usecs / 2, sleep_usecs);
if (sleep_usecs < 8 * USEC_PER_MSEC)
sleep_usecs *= 2;
}

do_gettimeofday(&end);
elapsed_csecs64 = timeval_to_ns(&end) - timeval_to_ns(&start);
do_div(elapsed_csecs64, NSEC_PER_SEC / 100);
elapsed_csecs = elapsed_csecs64;
elapsed_msecs64 = timeval_to_ns(&end) - timeval_to_ns(&start);
do_div(elapsed_msecs64, NSEC_PER_MSEC);
elapsed_msecs = elapsed_msecs64;

if (todo) {
/* This does not unfreeze processes that are already frozen
Expand All @@ -120,9 +123,10 @@ static int try_to_freeze_tasks(bool sig_only)
}
else {
printk("\n");
printk(KERN_ERR "Freezing of tasks failed after %d.%02d seconds "
printk(KERN_ERR "Freezing of tasks %s after %d.%03d seconds "
"(%d tasks refusing to freeze, wq_busy=%d):\n",
elapsed_csecs / 100, elapsed_csecs % 100,
wakeup ? "aborted" : "failed",
elapsed_msecs / 1000, elapsed_msecs % 1000,
todo - wq_busy, wq_busy);
}
thaw_workqueues();
Expand All @@ -131,15 +135,15 @@ static int try_to_freeze_tasks(bool sig_only)
do_each_thread(g, p) {
task_lock(p);
if (freezing(p) && !freezer_should_skip(p) &&
elapsed_csecs > 100)
elapsed_msecs > 1000)
sched_show_task(p);
cancel_freezing(p);
task_unlock(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
} else {
printk("(elapsed %d.%02d seconds) ", elapsed_csecs / 100,
elapsed_csecs % 100);
printk("(elapsed %d.%03d seconds) ", elapsed_msecs / 1000,
elapsed_msecs % 1000);
}

return todo ? -EBUSY : 0;
Expand Down

0 comments on commit e5058e1

Please sign in to comment.