diff mbox

cpufreq, store_scaling_governor requires policy->rwsem to be held for duration of changing governors [v2]

Message ID CAKohpoky1-hj7cwnKc58svh8Z1Yas1=q4uJEK8mWcb56uqAcng@mail.gmail.com
State New
Headers show

Commit Message

Viresh Kumar Aug. 6, 2014, 8:10 a.m. UTC
On 6 August 2014 03:36, Saravana Kannan <skannan@codeaurora.org> wrote:
> Stephen and I looked into this. This is not a sysfs framework difference.
> The reason we don't have this issue when we use global tunables is because
> we add the attribute group to the cpufreq_global_kobject and that kobject
> doesn't have a kobj_type ops similar to the per policy kobject. So,
> read/write to those attributes do NOT go through the generic show/store ops
> that wrap every other cpufreq framework attribute read/writes.
>
> So, none of those read/write do any kind of locking. They don't race with
> POLICY_EXIT (because we remove the sysfs group first thing in POLICY_EXIT)
> but might still race with START/STOPs (not sure, haven't looked closely
> yet).
>
> For example, writing to sampling_rate of ondemand governor might cause a
> race in update_sampling_rate(). It could race and happen between a STOP and
> POLICY_EXIT (triggered by hotplug, gov change, etc).

This sounds good but I couldn't prove it. Doing this on my dual core exynos
doesn't give me that crash report and it should?

        .target_index   = exynos_target,
        .get            = cpufreq_generic_get,
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Prarit Bhargava Aug. 6, 2014, 10:09 a.m. UTC | #1
On 08/06/2014 04:10 AM, Viresh Kumar wrote:
> On 6 August 2014 03:36, Saravana Kannan <skannan@codeaurora.org> wrote:
>> Stephen and I looked into this. This is not a sysfs framework difference.
>> The reason we don't have this issue when we use global tunables is because
>> we add the attribute group to the cpufreq_global_kobject and that kobject
>> doesn't have a kobj_type ops similar to the per policy kobject. So,
>> read/write to those attributes do NOT go through the generic show/store ops
>> that wrap every other cpufreq framework attribute read/writes.
>>
>> So, none of those read/write do any kind of locking. They don't race with
>> POLICY_EXIT (because we remove the sysfs group first thing in POLICY_EXIT)
>> but might still race with START/STOPs (not sure, haven't looked closely
>> yet).
>>
>> For example, writing to sampling_rate of ondemand governor might cause a
>> race in update_sampling_rate(). It could race and happen between a STOP and
>> POLICY_EXIT (triggered by hotplug, gov change, etc).
> 
> This sounds good but I couldn't prove it. Doing this on my dual core exynos
> doesn't give me that crash report and it should?

Are you sure you're not seeing another lockdep warning?  That was my problem --
there was an xfs related lockdep warning which then resulted in lockdep being
disabled from that point on.

P.

> 
> diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
> index 1e0ec57..027b6f7 100644
> --- a/drivers/cpufreq/exynos-cpufreq.c
> +++ b/drivers/cpufreq/exynos-cpufreq.c
> @@ -139,7 +139,7 @@ static int exynos_cpufreq_cpu_init(struct
> cpufreq_policy *policy)
>  }
> 
>  static struct cpufreq_driver exynos_driver = {
> -       .flags          = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK,
> +       .flags          = CPUFREQ_STICKY |
> CPUFREQ_NEED_INITIAL_FREQ_CHECK | CPUFREQ_HAVE_GOVERNOR_PER_POLICY,
>         .verify         = cpufreq_generic_frequency_table_verify,
>         .target_index   = exynos_target,
>         .get            = cpufreq_generic_get,
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Stephen Boyd Aug. 6, 2014, 3:08 p.m. UTC | #2
On 08/06, Prarit Bhargava wrote:
> 
> 
> On 08/06/2014 04:10 AM, Viresh Kumar wrote:
> > On 6 August 2014 03:36, Saravana Kannan <skannan@codeaurora.org> wrote:
> >> Stephen and I looked into this. This is not a sysfs framework difference.
> >> The reason we don't have this issue when we use global tunables is because
> >> we add the attribute group to the cpufreq_global_kobject and that kobject
> >> doesn't have a kobj_type ops similar to the per policy kobject. So,
> >> read/write to those attributes do NOT go through the generic show/store ops
> >> that wrap every other cpufreq framework attribute read/writes.
> >>
> >> So, none of those read/write do any kind of locking. They don't race with
> >> POLICY_EXIT (because we remove the sysfs group first thing in POLICY_EXIT)
> >> but might still race with START/STOPs (not sure, haven't looked closely
> >> yet).
> >>
> >> For example, writing to sampling_rate of ondemand governor might cause a
> >> race in update_sampling_rate(). It could race and happen between a STOP and
> >> POLICY_EXIT (triggered by hotplug, gov change, etc).
> > 
> > This sounds good but I couldn't prove it. Doing this on my dual core exynos
> > doesn't give me that crash report and it should?
> 
> Are you sure you're not seeing another lockdep warning?  That was my problem --
> there was an xfs related lockdep warning which then resulted in lockdep being
> disabled from that point on.
> 

Are we talking about the lockdep splat or the crash that started
this thread or something else? For the lockdep splat you need the
corrected patch in this thread and the per policy governor flag.
I'm not sure how to recreate the crash that started this thread.
diff mbox

Patch

diff --git a/drivers/cpufreq/exynos-cpufreq.c b/drivers/cpufreq/exynos-cpufreq.c
index 1e0ec57..027b6f7 100644
--- a/drivers/cpufreq/exynos-cpufreq.c
+++ b/drivers/cpufreq/exynos-cpufreq.c
@@ -139,7 +139,7 @@  static int exynos_cpufreq_cpu_init(struct
cpufreq_policy *policy)
 }

 static struct cpufreq_driver exynos_driver = {
-       .flags          = CPUFREQ_STICKY | CPUFREQ_NEED_INITIAL_FREQ_CHECK,
+       .flags          = CPUFREQ_STICKY |
CPUFREQ_NEED_INITIAL_FREQ_CHECK | CPUFREQ_HAVE_GOVERNOR_PER_POLICY,
        .verify         = cpufreq_generic_frequency_table_verify,