diff mbox

[RFC,09/19] cpufreq: fix warning for show_scaling_available_governors unlocked access to cpufreq_governor_list

Message ID 1452533760-13787-10-git-send-email-juri.lelli@arm.com
State New
Headers show

Commit Message

Juri Lelli Jan. 11, 2016, 5:35 p.m. UTC
show_scaling_available_governors iterates through cpufreq_governor_list
without holding cpufreq_governor_mutex; this generates the following
warning:

[  700.910381] ------------[ cut here ]------------
[  700.924282] WARNING: CPU: 2 PID: 1756 at kernel/drivers/cpufreq/cpufreq.c:700 show_scaling_available_governors+0x6f/0xb8()
[  700.965473] Modules linked in:
[  700.974637] CPU: 2 PID: 1756 Comm: cat Tainted: G        W       4.4.0-rc2+ #299
[  700.996813] Hardware name: ARM-Versatile Express
[  701.010674] [<c0014215>] (unwind_backtrace) from [<c0010e25>] (show_stack+0x11/0x14)
[  701.033905] [<c0010e25>] (show_stack) from [<c02eca5d>] (dump_stack+0x55/0x78)
[  701.055561] [<c02eca5d>] (dump_stack) from [<c00202cd>] (warn_slowpath_common+0x59/0x84)
[  701.079839] [<c00202cd>] (warn_slowpath_common) from [<c002030f>] (warn_slowpath_null+0x17/0x1c)
[  701.106182] [<c002030f>] (warn_slowpath_null) from [<c03b7bef>] (show_scaling_available_governors+0x6f/0xb8)
[  701.135656] [<c03b7bef>] (show_scaling_available_governors) from [<c03b7dc3>] (show+0x27/0x38)
[  701.161488] [<c03b7dc3>] (show) from [<c015469f>] (sysfs_kf_seq_show+0x5f/0xa0)
[  701.183409] [<c015469f>] (sysfs_kf_seq_show) from [<c01536a7>] (kernfs_seq_show+0x1b/0x1c)
[  701.208188] [<c01536a7>] (kernfs_seq_show) from [<c011a6d5>] (seq_read+0x129/0x33c)
[  701.231161] [<c011a6d5>] (seq_read) from [<c00ff7c7>] (__vfs_read+0x1b/0x84)
[  701.252300] [<c00ff7c7>] (__vfs_read) from [<c010000f>] (vfs_read+0x5f/0xb0)
[  701.273436] [<c010000f>] (vfs_read) from [<c0100099>] (SyS_read+0x39/0x68)
[  701.294049] [<c0100099>] (SyS_read) from [<c000df21>] (ret_fast_syscall+0x1/0x1a)
[  701.316484] ---[ end trace 5dd15744a4da127c ]---

Fix this by locking cpufreq_governor_mutex before for_each_governor().

Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Juri Lelli <juri.lelli@arm.com>

---
 drivers/cpufreq/cpufreq.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

-- 
2.2.2

Comments

Viresh Kumar Jan. 12, 2016, 10:13 a.m. UTC | #1
On 11-01-16, 17:35, Juri Lelli wrote:
> show_scaling_available_governors iterates through cpufreq_governor_list

> without holding cpufreq_governor_mutex; this generates the following

> warning:

> 

> [  700.910381] ------------[ cut here ]------------

> [  700.924282] WARNING: CPU: 2 PID: 1756 at kernel/drivers/cpufreq/cpufreq.c:700 show_scaling_available_governors+0x6f/0xb8()

> [  700.965473] Modules linked in:

> [  700.974637] CPU: 2 PID: 1756 Comm: cat Tainted: G        W       4.4.0-rc2+ #299

> [  700.996813] Hardware name: ARM-Versatile Express

> [  701.010674] [<c0014215>] (unwind_backtrace) from [<c0010e25>] (show_stack+0x11/0x14)

> [  701.033905] [<c0010e25>] (show_stack) from [<c02eca5d>] (dump_stack+0x55/0x78)

> [  701.055561] [<c02eca5d>] (dump_stack) from [<c00202cd>] (warn_slowpath_common+0x59/0x84)

> [  701.079839] [<c00202cd>] (warn_slowpath_common) from [<c002030f>] (warn_slowpath_null+0x17/0x1c)

> [  701.106182] [<c002030f>] (warn_slowpath_null) from [<c03b7bef>] (show_scaling_available_governors+0x6f/0xb8)

> [  701.135656] [<c03b7bef>] (show_scaling_available_governors) from [<c03b7dc3>] (show+0x27/0x38)

> [  701.161488] [<c03b7dc3>] (show) from [<c015469f>] (sysfs_kf_seq_show+0x5f/0xa0)

> [  701.183409] [<c015469f>] (sysfs_kf_seq_show) from [<c01536a7>] (kernfs_seq_show+0x1b/0x1c)

> [  701.208188] [<c01536a7>] (kernfs_seq_show) from [<c011a6d5>] (seq_read+0x129/0x33c)

> [  701.231161] [<c011a6d5>] (seq_read) from [<c00ff7c7>] (__vfs_read+0x1b/0x84)

> [  701.252300] [<c00ff7c7>] (__vfs_read) from [<c010000f>] (vfs_read+0x5f/0xb0)

> [  701.273436] [<c010000f>] (vfs_read) from [<c0100099>] (SyS_read+0x39/0x68)

> [  701.294049] [<c0100099>] (SyS_read) from [<c000df21>] (ret_fast_syscall+0x1/0x1a)

> [  701.316484] ---[ end trace 5dd15744a4da127c ]---


FWIW, I would suggest you to use cpufreq-dt for Juno instead of
arm_bL. I have asked Sudeep to do it earlier, but perhaps he was busy.

> Fix this by locking cpufreq_governor_mutex before for_each_governor().

> 

> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>

> Cc: Viresh Kumar <viresh.kumar@linaro.org>

> Signed-off-by: Juri Lelli <juri.lelli@arm.com>

> ---

>  drivers/cpufreq/cpufreq.c | 3 ++-

>  1 file changed, 2 insertions(+), 1 deletion(-)

> 

> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c

> index d065435..d91fdb8 100644

> --- a/drivers/cpufreq/cpufreq.c

> +++ b/drivers/cpufreq/cpufreq.c

> @@ -694,7 +694,7 @@ static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,

>  		goto out;

>  	}

>  

> -	lockdep_assert_held(&cpufreq_governor_mutex);

> +	mutex_lock(&cpufreq_governor_mutex);

>  	for_each_governor(t) {

>  		if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))

>  		    - (CPUFREQ_NAME_LEN + 2)))

> @@ -702,6 +702,7 @@ static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,

>  		i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);

>  	}

>  out:

> +	mutex_unlock(&cpufreq_governor_mutex);

>  	i += sprintf(&buf[i], "\n");

>  	return i;

>  }


Just move this patch before before the patch that added the
lockdep-assert and we wouldn't be required to add the
lockdep_assert_held() in the first place.

-- 
viresh
Juri Lelli Jan. 13, 2016, 10:25 a.m. UTC | #2
Hi,

On 12/01/16 15:43, Viresh Kumar wrote:
> On 11-01-16, 17:35, Juri Lelli wrote:

> > show_scaling_available_governors iterates through cpufreq_governor_list

> > without holding cpufreq_governor_mutex; this generates the following

> > warning:

> > 

> > [  700.910381] ------------[ cut here ]------------

> > [  700.924282] WARNING: CPU: 2 PID: 1756 at kernel/drivers/cpufreq/cpufreq.c:700 show_scaling_available_governors+0x6f/0xb8()

> > [  700.965473] Modules linked in:

> > [  700.974637] CPU: 2 PID: 1756 Comm: cat Tainted: G        W       4.4.0-rc2+ #299

> > [  700.996813] Hardware name: ARM-Versatile Express

> > [  701.010674] [<c0014215>] (unwind_backtrace) from [<c0010e25>] (show_stack+0x11/0x14)

> > [  701.033905] [<c0010e25>] (show_stack) from [<c02eca5d>] (dump_stack+0x55/0x78)

> > [  701.055561] [<c02eca5d>] (dump_stack) from [<c00202cd>] (warn_slowpath_common+0x59/0x84)

> > [  701.079839] [<c00202cd>] (warn_slowpath_common) from [<c002030f>] (warn_slowpath_null+0x17/0x1c)

> > [  701.106182] [<c002030f>] (warn_slowpath_null) from [<c03b7bef>] (show_scaling_available_governors+0x6f/0xb8)

> > [  701.135656] [<c03b7bef>] (show_scaling_available_governors) from [<c03b7dc3>] (show+0x27/0x38)

> > [  701.161488] [<c03b7dc3>] (show) from [<c015469f>] (sysfs_kf_seq_show+0x5f/0xa0)

> > [  701.183409] [<c015469f>] (sysfs_kf_seq_show) from [<c01536a7>] (kernfs_seq_show+0x1b/0x1c)

> > [  701.208188] [<c01536a7>] (kernfs_seq_show) from [<c011a6d5>] (seq_read+0x129/0x33c)

> > [  701.231161] [<c011a6d5>] (seq_read) from [<c00ff7c7>] (__vfs_read+0x1b/0x84)

> > [  701.252300] [<c00ff7c7>] (__vfs_read) from [<c010000f>] (vfs_read+0x5f/0xb0)

> > [  701.273436] [<c010000f>] (vfs_read) from [<c0100099>] (SyS_read+0x39/0x68)

> > [  701.294049] [<c0100099>] (SyS_read) from [<c000df21>] (ret_fast_syscall+0x1/0x1a)

> > [  701.316484] ---[ end trace 5dd15744a4da127c ]---

> 

> FWIW, I would suggest you to use cpufreq-dt for Juno instead of

> arm_bL. I have asked Sudeep to do it earlier, but perhaps he was busy.

>


I couldn't really relate this comment with this patch or the backtrace.
Can you please clarify why you are referring to switching to use
cpufreq-dt here?

> > Fix this by locking cpufreq_governor_mutex before for_each_governor().

> > 

> > Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>

> > Cc: Viresh Kumar <viresh.kumar@linaro.org>

> > Signed-off-by: Juri Lelli <juri.lelli@arm.com>

> > ---

> >  drivers/cpufreq/cpufreq.c | 3 ++-

> >  1 file changed, 2 insertions(+), 1 deletion(-)

> > 

> > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c

> > index d065435..d91fdb8 100644

> > --- a/drivers/cpufreq/cpufreq.c

> > +++ b/drivers/cpufreq/cpufreq.c

> > @@ -694,7 +694,7 @@ static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,

> >  		goto out;

> >  	}

> >  

> > -	lockdep_assert_held(&cpufreq_governor_mutex);

> > +	mutex_lock(&cpufreq_governor_mutex);

> >  	for_each_governor(t) {

> >  		if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))

> >  		    - (CPUFREQ_NAME_LEN + 2)))

> > @@ -702,6 +702,7 @@ static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,

> >  		i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);

> >  	}

> >  out:

> > +	mutex_unlock(&cpufreq_governor_mutex);

> >  	i += sprintf(&buf[i], "\n");

> >  	return i;

> >  }

> 

> Just move this patch before before the patch that added the

> lockdep-assert and we wouldn't be required to add the

> lockdep_assert_held() in the first place.

> 


Yep. As said, I just wanted to try to highlight possible problems with
this RFC.

Thanks,

- Juri
Viresh Kumar Jan. 13, 2016, 10:32 a.m. UTC | #3
On 13-01-16, 10:25, Juri Lelli wrote:
> I couldn't really relate this comment with this patch or the backtrace.

> Can you please clarify why you are referring to switching to use

> cpufreq-dt here?


Yeah, sorry about that. One of your previous patches had backtrace
mentioning bL and so I wanted to mention that thing to you. But by
that time, I moved to the new patch and thought of just adding the
point before forgetting it completely.

-- 
viresh
diff mbox

Patch

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index d065435..d91fdb8 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -694,7 +694,7 @@  static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
 		goto out;
 	}
 
-	lockdep_assert_held(&cpufreq_governor_mutex);
+	mutex_lock(&cpufreq_governor_mutex);
 	for_each_governor(t) {
 		if (i >= (ssize_t) ((PAGE_SIZE / sizeof(char))
 		    - (CPUFREQ_NAME_LEN + 2)))
@@ -702,6 +702,7 @@  static ssize_t show_scaling_available_governors(struct cpufreq_policy *policy,
 		i += scnprintf(&buf[i], CPUFREQ_NAME_PLEN, "%s ", t->name);
 	}
 out:
+	mutex_unlock(&cpufreq_governor_mutex);
 	i += sprintf(&buf[i], "\n");
 	return i;
 }