All of lore.kernel.org
 help / color / mirror / Atom feed
From: Saravana Kannan <skannan@codeaurora.org>
To: Prarit Bhargava <prarit@redhat.com>
Cc: Viresh Kumar <viresh.kumar@linaro.org>,
	Stephen Boyd <sboyd@codeaurora.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Lenny Szubowicz <lszubowi@redhat.com>,
	"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>
Subject: Re: [PATCH] cpufreq, store_scaling_governor requires policy->rwsem to be held for duration of changing governors [v2]
Date: Tue, 05 Aug 2014 15:51:19 -0700	[thread overview]
Message-ID: <53E15FE7.4040808@codeaurora.org> (raw)
In-Reply-To: <53E15DBB.7080800@redhat.com>

On 08/05/2014 03:42 PM, Prarit Bhargava wrote:
> So back to the original problem, which in short, revolves around these two
> functions (with comments included by me):
>
> /* called with kernfs rwsem for this kobj held */
> static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
> {
>          struct cpufreq_policy *policy = to_policy(kobj);
>          struct freq_attr *fattr = to_attr(attr);
>          ssize_t ret;
>
>          if (!down_read_trylock(&cpufreq_rwsem))
>                  return -EINVAL;
>
>          down_read(&policy->rwsem);
>
>
> and
>
> static ssize_t store(struct kobject *kobj, struct attribute *attr,
>                       const char *buf, size_t count)
> {
>          struct cpufreq_policy *policy = to_policy(kobj);
>          struct freq_attr *fattr = to_attr(attr);
>          ssize_t ret = -EINVAL;
>
>          get_online_cpus();
>
>          if (!cpu_online(policy->cpu))
>                  goto unlock;
>
>          if (!down_read_trylock(&cpufreq_rwsem))
>                  goto unlock;
>
>          down_write(&policy->rwsem);
>
>          /* if governor switch, calls sysfs_remove_group
>           * and acquires kernfs rwsem for this kobj */
>
> There's another bug here which I haven't had a chance to discuss.  There's the
> possibility that we have multiple threads waiting at the store's
> down_write(&policy->rwsem) when another thread does a governor switch.  When
> the policy->rwsem is released by the governor switch thread, all the other
> threads will enter this code path and race through while looking at stale data.
>
> We hit some NULL pointers (very similar to the ones originally reported in this
> thread) and, of course, the system dies.
>
> I wonder if the show() down_read(&policy->rwsem) needs to be a
> down_read_trylock(), and similarily in the store the down_write(&policy->rwsem)
> needs to be a down_write_trylock() ?

This will create bigger issues if you make this change to the generic 
show/store. The writes would no longer be reliable even if the race 
could have been handled properly in the kernel (say, a race between a 
call to cpufreq_update_policy() and user space reading/writing 
something). This would be a serious userspace ABI change.

> We would also have to do a check on policy->governor_enabled to verify that
> the data was still valid after taking the lock.
>
> *If* we were to make this change, does that also happen to fix the risk of a
> deadlock in this code?

We should not do the change you are referring to.

>
> That might be too hacky ... gotta be a better way :/ ...
>
> Anyway, just a thought.
>

I definitely have a fix for this and the original race you reported. 
It's basically reverting that commit you reverted + a fix for the 
deadlock. That's the only way to fix the scaling_governor issue.

You fix the deadlock by moving the governor attribute group removing to 
the framework code and doing it before STOP+EXIT to governor without 
holding the policy lock. And the reverse for INIT+STOP.

I'll try to get to it if no one else does.

-Saravana

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

  reply	other threads:[~2014-08-05 22:51 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-29 11:46 [PATCH] cpufreq, store_scaling_governor requires policy->rwsem to be held for duration of changing governors [v2] Prarit Bhargava
2014-07-30  0:03 ` Rafael J. Wysocki
2014-07-30 14:18   ` Prarit Bhargava
2014-07-30 21:40     ` Rafael J. Wysocki
2014-07-31  1:36       ` Saravana Kannan
2014-07-31  2:16         ` Rafael J. Wysocki
2014-07-31  2:07           ` Saravana Kannan
2014-07-31 10:16           ` Prarit Bhargava
2014-07-31 10:21             ` Prarit Bhargava
2014-07-31 10:23           ` Prarit Bhargava
2014-07-31 16:36             ` Rafael J. Wysocki
2014-07-31 17:57               ` Prarit Bhargava
2014-07-31 18:38                 ` Rafael J. Wysocki
2014-07-31 18:26                   ` Prarit Bhargava
2014-07-31 20:24                     ` Saravana Kannan
2014-07-31 20:30                       ` Prarit Bhargava
2014-07-31 20:38                         ` Saravana Kannan
2014-07-31 21:08                           ` Prarit Bhargava
2014-07-31 22:13                             ` Saravana Kannan
2014-07-31 22:58                               ` Prarit Bhargava
2014-08-01  0:55                                 ` Saravana Kannan
2014-08-01 10:24                                   ` Prarit Bhargava
2014-08-01 10:27                                   ` Prarit Bhargava
2014-08-01 17:18                                     ` Stephen Boyd
2014-08-01 19:15                                       ` Prarit Bhargava
2014-08-01 19:36                                         ` Stephen Boyd
2014-08-01 19:43                                           ` Prarit Bhargava
2014-08-01 19:54                                             ` Stephen Boyd
2014-08-01 21:25                                               ` Saravana Kannan
2014-08-04 10:11                                                 ` Prarit Bhargava
2014-08-05  7:46                                           ` Viresh Kumar
2014-08-05 10:47                                             ` Prarit Bhargava
2014-08-05 10:53                                               ` Viresh Kumar
2014-08-05 22:06                                                 ` Saravana Kannan
2014-08-05 22:20                                                   ` Prarit Bhargava
2014-08-05 22:40                                                     ` Saravana Kannan
2014-08-05 22:42                                                   ` Prarit Bhargava
2014-08-05 22:51                                                     ` Saravana Kannan [this message]
2014-08-13 19:57                                                       ` Prarit Bhargava
2014-08-13 19:57                                                         ` Prarit Bhargava
2014-08-14 18:16                                                         ` Saravana Kannan
2014-08-14 18:16                                                           ` Saravana Kannan
2014-08-06  8:10                                                   ` Viresh Kumar
2014-08-06 10:09                                                     ` Prarit Bhargava
2014-08-06 10:09                                                       ` Prarit Bhargava
2014-08-06 15:08                                                       ` Stephen Boyd
2014-08-07  6:36                                                         ` Viresh Kumar
2014-08-07 10:12                                                           ` Prarit Bhargava
2014-08-07 10:15                                                             ` Viresh Kumar
2014-08-12  9:03                                                               ` Viresh Kumar
2014-08-12 11:33                                                                 ` Prarit Bhargava
2014-08-13  7:39                                                                   ` Viresh Kumar
2014-08-13  9:58                                                                     ` Prarit Bhargava
2014-08-13  9:58                                                                       ` Prarit Bhargava
2014-08-14  4:19                                                                       ` Viresh Kumar
2014-08-04 10:36                                       ` Viresh Kumar
2014-08-04 12:25                                         ` Prarit Bhargava
2014-08-04 13:38                                           ` Viresh Kumar
2014-08-04 14:00                                             ` Prarit Bhargava
2014-08-04 15:04                                               ` Prarit Bhargava
2014-08-04 20:16                                             ` Saravana Kannan
2014-08-05  6:14                                               ` Viresh Kumar
2014-08-05  6:29                                                 ` skannan
2014-08-05  6:43                                                   ` Viresh Kumar
2014-10-13 10:43                                       ` Viresh Kumar
2014-10-13 11:52                                         ` Prarit Bhargava

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=53E15FE7.4040808@codeaurora.org \
    --to=skannan@codeaurora.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=lszubowi@redhat.com \
    --cc=prarit@redhat.com \
    --cc=rjw@rjwysocki.net \
    --cc=sboyd@codeaurora.org \
    --cc=viresh.kumar@linaro.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.