From: "Menon, Nishanth" <nm@ti.com>
To: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: linux-omap@vger.kernel.org
Subject: Re: [PATCH] OMAP2+: CPUfreq: Allow the CPU scaling when secondary CPUs are offline.
Date: Thu, 2 Jun 2011 21:44:16 -0500 [thread overview]
Message-ID: <BANLkTi=LUMdrTzsOXtVwU_aTcecodaJiPg@mail.gmail.com> (raw)
In-Reply-To: <1307026270-313-1-git-send-email-santosh.shilimkar@ti.com>
On Thu, Jun 2, 2011 at 09:51, Santosh Shilimkar
<santosh.shilimkar@ti.com> wrote:
> Current OMAP2PLUS CPUfreq tagret() functions returns when all
> the CPU's are not online. This will break DVFS when secondary
> CPUs are offlined.
>
> The intention of that check was just avoid CPU frequency change
> during the window when CPU becomes online but it's cpufreq_init is
> not done yet.
is it this requirement a boot requirement or a necessity for
cpufreq_driver.init being called for online cpus? Since we maintain
just a single freq_table... why do we care about multiple cpu_inits?
Anyways, tried testing this and .config with CONFIG_SMP_ON_UP and
USERSPACE. it works with one cpu and does not scale 2 cpus :(
After applying this patch on kevin's cpufreq branch, I added some
prints for logging:
diff --git a/arch/arm/mach-omap2/omap2plus-cpufreq.c
b/arch/arm/mach-omap2/omap2plus-cpufreq.c
index 909bfcb..89856d5 100644
--- a/arch/arm/mach-omap2/omap2plus-cpufreq.c
+++ b/arch/arm/mach-omap2/omap2plus-cpufreq.c
@@ -83,8 +83,13 @@ static int omap_target(struct cpufreq_policy *policy,
struct cpufreq_freqs freqs;
/* Changes not allowed until all CPUs are online */
- if (is_smp() && (cpus_initialized < num_online_cpus()))
+ if (is_smp() && (cpus_initialized < num_online_cpus())) {
+ pr_err("%s: cpu %d not ready to go to %d (inits=%d vs
online=%d)\n", __func__,
+ policy->cpu, target_freq,
cpus_initialized, num_online_cpus());
return ret;
+ }
+ pr_err("%s: cpu %d ready to go to %d (inits=%d vs online=%d)\n", __func__,
+ policy->cpu, target_freq, cpus_initialized, num_online_cpus());
/* Ensure desired rate is within allowed range. Some govenors
* (ondemand) will just pass target_freq=0 to get the minimum. */
@@ -197,6 +202,9 @@ static int __cpuinit omap_cpu_init(struct
cpufreq_policy *policy)
cpumask_copy(policy->cpus, cpumask);
cpus_initialized++;
smp_wmb();
+ pr_err("%s: cpu %d cpus_initialized = %d online=%d\n", __func__,
+ policy->cpu, cpus_initialized, num_online_cpus());
+
}
/* FIXME: what's the actual transition time? */
@@ -212,6 +220,8 @@ static int omap_cpu_exit(struct cpufreq_policy *policy)
if (is_smp()) {
cpus_initialized--;
smp_wmb();
+ pr_err("%s: cpu %d cpus_initialized = %d online=%d\n", __func__,
+ policy->cpu, cpus_initialized, num_online_cpus());
}
return 0;
}
on boot, this is what I see:
[ 0.421020] omap_cpu_init: cpu 0 cpus_initialized = 1 online=2
[ 0.421264] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
[ 0.421630] omap_cpu_init: cpu 1 cpus_initialized = 2 online=2
[ 0.421691] omap_cpu_exit: cpu 1 cpus_initialized = 1 online=2
...
snip
...
[ 2.044128] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
[ 2.051849] omap_target: cpu 0 not ready to go to 1008000 (inits=1
vs online=2)
... snip..
...boots up to busybox shell..
/ # head /sys/devices/system/cpu/cpu1/online /sys/devices/system/cpu/cpu0/online
==> /sys/devices/system/cpu/cpu1/online <==
1
==> /sys/devices/system/cpu/cpu0/online <==
1
/ # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
300000 600000 800000 1008000
/ # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
1008000
/ # echo -n "300000">/sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
[ 130.257385] omap_target: cpu 0 not ready to go to 300000 (inits=1
vs online=2)
/ # echo -n "0" > /sys/devices/system/cpu/cpu1/online
[ 144.749877] CPU1: shutdown
/ # head /sys/devices/system/cpu/cpu1/online /sys/devices/system/cpu/cpu0/online
==> /sys/devices/system/cpu/cpu1/online <==
0
==> /sys/devices/system/cpu/cpu0/online <==
1
/ # echo -n "350000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
[ 165.881927] omap_target: cpu 0 ready to go to 350000 (inits=1 vs online=1)
[ 165.889526] cpufreq-omap: transition: 1008000 --> 0
/ #
/ # echo -n "1" > /sys/devices/system/cpu/cpu1/online
[ 176.469360] CPU1: Booted secondary processor
[ 176.469421] CPU1: Unknown IPI message 0x1
[ 176.475280] Switched to NOHz mode on CPU #1
[ 176.600891] omap_cpu_init: cpu 1 cpus_initialized = 2 online=2
[ 176.620178] omap_cpu_exit: cpu 1 cpus_initialized = 1 online=2
[ 176.626373] omap_target: cpu 0 not ready to go to 350000 (inits=1
vs online=2)
Regards,
Nishanth Menon
next prev parent reply other threads:[~2011-06-03 2:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-02 14:51 [PATCH] OMAP2+: CPUfreq: Allow the CPU scaling when secondary CPUs are offline Santosh Shilimkar
2011-06-02 23:10 ` Kevin Hilman
2011-06-03 6:26 ` Santosh Shilimkar
2011-06-03 8:31 ` Santosh Shilimkar
2011-06-03 12:05 ` Santosh Shilimkar
2011-06-03 2:44 ` Menon, Nishanth [this message]
2011-06-03 6:39 ` Santosh Shilimkar
2011-06-03 12:04 ` Santosh Shilimkar
-- strict thread matches above, loose matches on Subject: below --
2011-06-02 14:53 Santosh Shilimkar
2011-06-03 10:07 ` Igor Dmitriev
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='BANLkTi=LUMdrTzsOXtVwU_aTcecodaJiPg@mail.gmail.com' \
--to=nm@ti.com \
--cc=linux-omap@vger.kernel.org \
--cc=santosh.shilimkar@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).