Commit 7afe1845 authored by Sameer Nanda's avatar Sameer Nanda Committed by Linus Torvalds

init: skip calibration delay if previously done

For each CPU, do the calibration delay only once.  For subsequent calls,
use the cached per-CPU value of loops_per_jiffy.

This saves about 200ms of resume time on dual core Intel Atom N5xx based
systems.  This helps bring down the kernel resume time on such systems
from about 500ms to about 300ms.

[akpm@linux-foundation.org: make cpu_loops_per_jiffy static]
[akpm@linux-foundation.org: clean up message text]
[akpm@linux-foundation.org: fix things up after upstream rmk changes]
Signed-off-by: default avatarSameer Nanda <snanda@chromium.org>
Cc: Phil Carmody <ext-phil.2.carmody@nokia.com>
Cc: Andrew Worsley <amworsley@gmail.com>
Cc: David Daney <ddaney@caviumnetworks.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 469dded1
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/percpu.h>
unsigned long lpj_fine; unsigned long lpj_fine;
unsigned long preset_lpj; unsigned long preset_lpj;
...@@ -243,12 +244,19 @@ static unsigned long __cpuinit calibrate_delay_converge(void) ...@@ -243,12 +244,19 @@ static unsigned long __cpuinit calibrate_delay_converge(void)
return lpj; return lpj;
} }
static DEFINE_PER_CPU(unsigned long, cpu_loops_per_jiffy) = { 0 };
void __cpuinit calibrate_delay(void) void __cpuinit calibrate_delay(void)
{ {
unsigned long lpj; unsigned long lpj;
static bool printed; static bool printed;
int this_cpu = smp_processor_id();
if (preset_lpj) { if (per_cpu(cpu_loops_per_jiffy, this_cpu)) {
lpj = per_cpu(cpu_loops_per_jiffy, this_cpu);
pr_info("Calibrating delay loop (skipped) "
"already calibrated this CPU");
} else if (preset_lpj) {
lpj = preset_lpj; lpj = preset_lpj;
if (!printed) if (!printed)
pr_info("Calibrating delay loop (skipped) " pr_info("Calibrating delay loop (skipped) "
...@@ -266,6 +274,7 @@ void __cpuinit calibrate_delay(void) ...@@ -266,6 +274,7 @@ void __cpuinit calibrate_delay(void)
pr_info("Calibrating delay loop... "); pr_info("Calibrating delay loop... ");
lpj = calibrate_delay_converge(); lpj = calibrate_delay_converge();
} }
per_cpu(cpu_loops_per_jiffy, this_cpu) = lpj;
if (!printed) if (!printed)
pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n", pr_cont("%lu.%02lu BogoMIPS (lpj=%lu)\n",
lpj/(500000/HZ), lpj/(500000/HZ),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment