Re: [PATCH v3] cpufreq: Avoid attempts to create duplicate symbolic links

Rafael J. Wysocki
2015-07-27T12:39:17Z

On Mon, Jul 27, 2015 at 4:29 AM, Viresh Kumar <viresh.kumar@linaro.org> wrote:
> On 26-07-15, 02:28, Rafael J. Wysocki wrote:
>> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>>
>> After commit 87549141d516 (cpufreq: Stop migrating sysfs files on
>> hotplug) there is a problem with CPUs that share cpufreq policy
>> objects with other CPUs and are initially offline.
>>
>> Say CPU1 shares a policy with CPU0 which is online and is registered
>> first. As part of the registration process, cpufreq_add_dev() is
>> called for it. It creates the policy object and a symbolic link
>> to it from the CPU1's sysfs directory. If CPU1 is registered
>> subsequently and it is offline at that time, cpufreq_add_dev() will
>> attempt to create a symbolic link to the policy object for it, but
>> that link is present already, so a warning about that will be
>> triggered.
>>
>> To avoid that warning, make cpufreq use an additional CPU mask
>> containing related CPUs that are actually present for each policy
>> object. That mask is initialized when the policy object is populated
>> after its creation (for the first online CPU using it) and it includes
>> CPUs from the "policy CPUs" mask returned by the cpufreq driver's
>> ->init() callback that are physically present at that time. Symbolic
>> links to the policy are created only for the CPUs in that mask.
>>
>> If cpufreq_add_dev() is invoked for an offline CPU, it checks the
>> new mask and only creates the symlink if the CPU was not in it (the
>> CPU is added to the mask at the same time).
>>
>> In turn, cpufreq_remove_dev() drops the given CPU from the new mask,
>> removes its symlink to the policy object and returns, unless it is
>> the CPU owning the policy object. In that case, the policy object
>> is moved to a new CPU's sysfs directory or deleted if the CPU being
>> removed was the last user of the policy.
>>
>> While at it, notice that cpufreq_remove_dev() can't fail, because
>> its return value is ignored, so make it ignore return values from
>> __cpufreq_remove_dev_prepare() and __cpufreq_remove_dev_finish()
>> and prevent these functions from aborting on errors returned by
>> __cpufreq_governor(). Also drop the now unused sif argument from
>> them.
>>
>> Fixes: 87549141d516 (cpufreq: Stop migrating sysfs files on hotplug)
>> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>> Reported-by: Russell King <linux@arm.linux.org.uk>
>> ---
>>
>> This goes back to the https://patchwork.kernel.org/patch/6856011/
>> idea, but has a couple of bugs fixed and goes a it further with
>> cleaning things up.
>>
>> ---
>> drivers/cpufreq/cpufreq.c | 108 +++++++++++++++++++++++-----------------------
>> include/linux/cpufreq.h | 1
>> 2 files changed, 56 insertions(+), 53 deletions(-)
>
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

Thanks!

Russell, can you test this one, please?

Rafael