From: ethan zhao <ethan.zhao@oracle.com>
To: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Rafael Wysocki <rjw@rjwysocki.net>,
santosh shilimkar <santosh.shilimkar@oracle.com>,
Linaro Kernel Mailman List <linaro-kernel@lists.linaro.org>,
"linux-pm@vger.kernel.org" <linux-pm@vger.kernel.org>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH Resend] cpufreq: Set cpufreq_cpu_data to NULL before putting kobject
Date: Mon, 02 Feb 2015 12:45:58 +0800 [thread overview]
Message-ID: <54CF0106.5050601@oracle.com> (raw)
In-Reply-To: <CAKohpomBcBVXLW-RW1VXAtkTw-BKd7tHmeFJgmf9CM3vi1Ki-Q@mail.gmail.com>
On 2015/2/2 12:26, Viresh Kumar wrote:
> On 2 February 2015 at 09:46, ethan zhao <ethan.zhao@oracle.com> wrote:
>> We am talking about the policy allocation and de-allocation. right ?
>> I showed you the cpufreq_policy_free(policy) doesn't check kobject
>> refcount as above.
>>
>> Hmmm, you are still sleeping in the kobject, wake up and don't mix
>> water anymore.
> It would be nice if we give each other the respect we deserve, And talk
> about concrete points here.
Welcome back to the right way.
>>> if (!cpufreq_suspended)
>>> cpufreq_policy_put_kobj(policy);
>>>
>>> static void cpufreq_policy_put_kobj(struct cpufreq_policy *policy)
>>> {
>>> ...
>>>
>>> kobject_put(kobj);
>>>
>>> /*
>>> * We need to make sure that the underlying kobj is
>>> * actually not referenced anymore by anybody before we
>>> * proceed with unloading.
>>> */
>>> pr_debug("waiting for dropping of refcount\n");
>>> wait_for_completion(cmp);
>>> }
> I gave you exactly what you wanted to go through, but it seems you
> haven't tried enough.
>
> Before freeing policy with cpufreq_policy_free(), we call
> cpufreq_policy_put_kobj(). Now what does this function do? It waits
> for the completion to fire (wait_for_completion()). This completion
> will only fire when refcount of a kobject becomes zero.
>
> Initially when we create the kobject, it is initialized to one. And the
> last kobject_put() you see above in cpufreq_policy_put_kobj()
> makes it zero. All other cpufreq_cpu_get() and put() should happen
> in pairs, otherwise this refcount will never be zero again.
>
> As soon as the refcount becomes zero, we are sure no one else is
> using the policy structure anymore. And so we free it with
> cpufreq_policy_free().
But there is no checking against refcount in or before
cpufreq_policy_free(), that is one issue I mentioned.
>
> That routines doesn't have any tricks and simply frees the policy.
> Because, before calling cpufreq_policy_put_kobj(), we have set
> the per-cpu variable to NULL, nobody else will get the policy
It is possible cpufreq_cpu_get() within the PPC thread was called just
before __cpufreq_remove_dev_finish() is to be called in another thread,
so you set the per_cpu(cpufreq_cpu_data, cpu) to NULL will not prevent
the actions between cpufreq_cpu_get and cpufreq_cpu_put().
And then the freeing happens in __cpufreq_remove_dev_finish().
> structure by calling cpufreq_cpu_get(). And that's what my patch
> tried to solve.
>
> Let me know if I wasn't explanatory enough..
Ethan
>
> --
> viresh
next prev parent reply other threads:[~2015-02-02 4:46 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-31 0:32 [PATCH Resend] cpufreq: Set cpufreq_cpu_data to NULL before putting kobject Viresh Kumar
2015-01-31 2:14 ` Viresh Kumar
2015-02-02 3:20 ` ethan zhao
2015-02-02 3:24 ` Viresh Kumar
2015-02-02 3:38 ` ethan zhao
2015-02-02 3:43 ` Viresh Kumar
2015-02-02 3:56 ` ethan zhao
2015-02-02 3:59 ` Viresh Kumar
2015-02-02 4:06 ` ethan zhao
2015-02-02 4:09 ` Viresh Kumar
2015-02-02 4:16 ` ethan zhao
2015-02-02 4:26 ` Viresh Kumar
2015-02-02 4:45 ` ethan zhao [this message]
2015-02-02 4:54 ` Viresh Kumar
2015-02-02 15:04 ` ethan zhao
2015-02-25 3:24 ` Ethan Zhao
2015-02-25 4:35 ` viresh kumar
2015-02-25 5:47 ` Ethan Zhao
2015-02-25 16:31 ` santosh shilimkar
2015-02-25 16:31 ` santosh shilimkar
2015-03-09 1:34 ` Ethan Zhao
2015-03-09 4:06 ` Viresh Kumar
2015-03-09 4:14 ` ethan zhao
2015-03-09 4:14 ` ethan zhao
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=54CF0106.5050601@oracle.com \
--to=ethan.zhao@oracle.com \
--cc=linaro-kernel@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=santosh.shilimkar@oracle.com \
--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.