From patchwork Thu Feb 11 12:01:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 61732 Delivered-To: patch@linaro.org Received: by 10.112.43.199 with SMTP id y7csp146069lbl; Thu, 11 Feb 2016 04:01:59 -0800 (PST) X-Received: by 10.98.19.205 with SMTP id 74mr66285376pft.31.1455192119238; Thu, 11 Feb 2016 04:01:59 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y29si12261993pfa.174.2016.02.11.04.01.58; Thu, 11 Feb 2016 04:01:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dkim=pass header.i=@linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752559AbcBKMBv (ORCPT + 30 others); Thu, 11 Feb 2016 07:01:51 -0500 Received: from mail-pf0-f180.google.com ([209.85.192.180]:34129 "EHLO mail-pf0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752360AbcBKMBr (ORCPT ); Thu, 11 Feb 2016 07:01:47 -0500 Received: by mail-pf0-f180.google.com with SMTP id x65so28595322pfb.1 for ; Thu, 11 Feb 2016 04:01:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=WMxUNwsNrSBmjAO3dj+m/5k8KaUtJbMCpo83jqtD3c4=; b=ISxe/KMGqvgMVVBem1CoF1iAi1LsguK2O87aOFRcUUhIYX6ur2gigEihJOsPVXkr97 Dq4tsZrqBDuJdt1d2XHHflFtp0QQrFUkCN9NaHVVkZN2wtKGO26t4cjriSkcKo1uCXk5 jOBxbklUVHNpvSsZ0P8Hoqn+Ir8zclWG2zVSY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=WMxUNwsNrSBmjAO3dj+m/5k8KaUtJbMCpo83jqtD3c4=; b=G6/PlY5j4qIp3uFBZqasfof/jwRTFF1HAWdewnjjTpOIYof6T9OPznrfZtBNVRiCgI 2In5y6dE6b9B/i6YaooKnDXfBdb66Wvrc8ZFt9SoHStvwvpx6iLU60Nxju8LzHqUuW/X e7sOmEmhEH5xsBLtwNMTPEud0UTjqEsBgbxpa8LaTzasfE3IUvKHsZmJ39otjL31Q4aG JITemwquFfQAmCQOsEwblTvO/wCafGHXwNemZtFi/GXytw/iZWNexWjfxIEBLZTDuSZF oUO2sXVlRvUjsyR4tasFQrQTS4345YGnvj/deKSnIkzFrlrRmcSdDtq3uoeHGSWvTOUd ie2w== X-Gm-Message-State: AG10YOTHVIco2qE73aAOW8dkrvx5QM2Ey6y7DEpvU80IOGWavlmJznICmQ8AJZC2/S2v7e8+ X-Received: by 10.98.86.139 with SMTP id h11mr66261178pfj.105.1455192106854; Thu, 11 Feb 2016 04:01:46 -0800 (PST) Received: from localhost ([122.172.89.184]) by smtp.gmail.com with ESMTPSA id mk3sm11972473pab.20.2016.02.11.04.01.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Feb 2016 04:01:46 -0800 (PST) From: Viresh Kumar To: Rafael Wysocki , juri.lelli@arm.com Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, shilpa.bhat@linux.vnet.ibm.com, linux-kernel@vger.kernel.org, Viresh Kumar Subject: [PATCH V5 4/6] cpufreq: governor: No need to manage state machine now Date: Thu, 11 Feb 2016 17:31:14 +0530 Message-Id: <36f3adcb78ff16deeab8db5104f25dfd96b3a631.1455191663.git.viresh.kumar@linaro.org> X-Mailer: git-send-email 2.7.1.370.gb2aa7f8 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The cpufreq core now guarantees that policy->rwsem won't be dropped while running the ->governor callback for the CPUFREQ_GOV_POLICY_EXIT event and will be held acquired until the complete sequence of governor state changes has finished. This allows governor state machine checks to be dropped from multiple functions in cpufreq_governor.c. This also means that policy_dbs->policy can be initialized upfront, so the entire initialization of struct policy_dbs is carried out in one place. Signed-off-by: Viresh Kumar Tested-by: Juri Lelli Tested-by: Shilpasri G Bhat --- drivers/cpufreq/cpufreq_governor.c | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) -- 2.7.1.370.gb2aa7f8 diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 3a9dab752148..481585611097 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c @@ -233,8 +233,10 @@ static inline void gov_clear_update_util(struct cpufreq_policy *policy) synchronize_rcu(); } -static void gov_cancel_work(struct policy_dbs_info *policy_dbs) +static void gov_cancel_work(struct cpufreq_policy *policy) { + struct policy_dbs_info *policy_dbs = policy->governor_data; + /* Tell dbs_update_util_handler() to skip queuing up work items. */ atomic_inc(&policy_dbs->skip_work); /* @@ -330,6 +332,7 @@ static struct policy_dbs_info *alloc_policy_dbs_info(struct cpufreq_policy *poli if (!policy_dbs) return NULL; + policy_dbs->policy = policy; mutex_init(&policy_dbs->timer_mutex); atomic_set(&policy_dbs->skip_work, 0); init_irq_work(&policy_dbs->irq_work, dbs_irq_work); @@ -460,10 +463,6 @@ static int cpufreq_governor_exit(struct cpufreq_policy *policy) struct dbs_data *dbs_data = policy_dbs->dbs_data; int count; - /* State should be equivalent to INIT */ - if (policy_dbs->policy) - return -EBUSY; - mutex_lock(&dbs_data->mutex); list_del(&policy_dbs->list); count = --dbs_data->usage_count; @@ -499,10 +498,6 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy) if (!policy->cur) return -EINVAL; - /* State should be equivalent to INIT */ - if (policy_dbs->policy) - return -EBUSY; - sampling_rate = dbs_data->sampling_rate; ignore_nice = dbs_data->ignore_nice_load; @@ -527,7 +522,6 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy) if (ignore_nice) j_cdbs->prev_cpu_nice = kcpustat_cpu(j).cpustat[CPUTIME_NICE]; } - policy_dbs->policy = policy; if (gov->governor == GOV_CONSERVATIVE) { struct cs_cpu_dbs_info_s *cs_dbs_info = @@ -550,14 +544,7 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy) static int cpufreq_governor_stop(struct cpufreq_policy *policy) { - struct policy_dbs_info *policy_dbs = policy->governor_data; - - /* State should be equivalent to START */ - if (!policy_dbs->policy) - return -EBUSY; - - gov_cancel_work(policy_dbs); - policy_dbs->policy = NULL; + gov_cancel_work(policy); return 0; } @@ -566,10 +553,6 @@ static int cpufreq_governor_limits(struct cpufreq_policy *policy) { struct policy_dbs_info *policy_dbs = policy->governor_data; - /* State should be equivalent to START */ - if (!policy_dbs->policy) - return -EBUSY; - mutex_lock(&policy_dbs->timer_mutex); if (policy->max < policy->cur) __cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H);