From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965650AbbJ0Rdx (ORCPT ); Tue, 27 Oct 2015 13:33:53 -0400 Received: from mail-wi0-f177.google.com ([209.85.212.177]:34751 "EHLO mail-wi0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965221AbbJ0Rdu (ORCPT ); Tue, 27 Oct 2015 13:33:50 -0400 From: =?UTF-8?q?B=C3=A1lint=20Czobor?= To: "Rafael J. Wysocki" , Viresh Kumar Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Greg Hackmann , =?UTF-8?q?B=C3=A1lint=20Czobor?= Subject: [PATCH 60/70] cpufreq: interactive: hold reference on global cpufreq kobject if needed Date: Tue, 27 Oct 2015 18:30:48 +0100 Message-Id: <1445967059-6897-60-git-send-email-czoborbalint@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1445967059-6897-1-git-send-email-czoborbalint@gmail.com> References: <1445967059-6897-1-git-send-email-czoborbalint@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Greg Hackmann 2361be23666232dbb4851a527f466c4cbf5340fc changed cpufreq to add the global cpufreq kobject to sysfs on demand. To ensure this happens, cpufreq_interactive must hold a reference on this object on devices where it intends to use it (i.e., devices where have_governor_per_policy() returns false). Otherwise a parentless kobject will be passed to sysfs_create_group() which will subsequently BUG(). Change-Id: I7dd03956e1d3c6c3c0cc17c799882c235804ae09 Signed-off-by: Greg Hackmann Signed-off-by: Bálint Czobor --- drivers/cpufreq/cpufreq_interactive.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index ff77b30..786fd01 100644 --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -1154,8 +1154,10 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, spin_lock_init(&tunables->above_hispeed_delay_lock); policy->governor_data = tunables; - if (!have_governor_per_policy()) + if (!have_governor_per_policy()) { common_tunables = tunables; + WARN_ON(cpufreq_get_global_kobject()); + } rc = sysfs_create_group(get_governor_parent_kobj(policy), get_sysfs_attr()); @@ -1185,6 +1187,10 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, sysfs_remove_group(get_governor_parent_kobj(policy), get_sysfs_attr()); + + if (!have_governor_per_policy()) + cpufreq_put_global_kobject(); + kfree(tunables); common_tunables = NULL; } -- 1.7.9.5