Re: [PATCH] OMAP2+: CPUfreq: Allow the CPU scaling when secondary CPUs are offline.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jun 2, 2011 at 09:51, Santosh Shilimkar
<santosh.shilimkar@xxxxxx> 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
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux