From patchwork Thu Dec 3 04:07:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Viresh Kumar X-Patchwork-Id: 57592 Delivered-To: patch@linaro.org Received: by 10.112.155.196 with SMTP id vy4csp3272087lbb; Wed, 2 Dec 2015 20:08:17 -0800 (PST) X-Received: by 10.98.14.15 with SMTP id w15mr10049338pfi.145.1449115696329; Wed, 02 Dec 2015 20:08:16 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id sq8si9154944pab.10.2015.12.02.20.08.16; Wed, 02 Dec 2015 20:08:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-pm-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-pm-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dkim=neutral (body hash did not verify) header.i=@linaro-org.20150623.gappssmtp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757464AbbLCEIO (ORCPT + 11 others); Wed, 2 Dec 2015 23:08:14 -0500 Received: from mail-pa0-f46.google.com ([209.85.220.46]:33534 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755716AbbLCEIE (ORCPT ); Wed, 2 Dec 2015 23:08:04 -0500 Received: by pabfh17 with SMTP id fh17so61124251pab.0 for ; Wed, 02 Dec 2015 20:08:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=VD4/P1XIv/AUv9eFeQI5JIEgZiWDAA8oiBMHpmBPKeU=; b=nY2mK1mQ6dHiIrYdTZVsCQeIcQ1D/Y9Wv/laHoaGjvSBxeElFpJxPrOKUP5m7/CRY5 JEEncdHWdZDKC2Wq/U5GBay24fsirn6SOqTwee3ZBXS9AKPvMJmRiSNOgnH79ZBwBPWk zQtS9Thfj8SJdhESwI4UwaR7EYKoko9/8DVz0sOOpKw6srjYFlx/mUmJ+Zv+ZjPhJ7zf ylMs7NiO6ucH3RWWtUWLx5s1RX4WaKT/6nMq4JK1tWndnCEj3XslGaZiey7zapod+G2y z7mbPYR+nT+nygZPbNyH3vmvfax+bWCkofAR1ICWOizF4a1FOELf9Wa4X6sCE7QqM3UU +5bA== 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=VD4/P1XIv/AUv9eFeQI5JIEgZiWDAA8oiBMHpmBPKeU=; b=DABPfaltiAxls0WEIhuOi456TcK6T3w4yhGyK16mlZWYE6Q4HwUN3Jhao1vOyPG++7 Tk/89K3dFCU9q97Zl1zBcgRxZIc9JcVMz4g3lXaqZnTE2N/7CYWuG/GTOLSTTrVvDiNC 5ySWuDs8gCulo8BXBj4enkYGYPFjhtonu/z+yZA7bAcnh7SqS3xfnWiQByi1P3o7HRH3 jqA472GjywMKO7vukuxp9IV59ta2QsDGZ44ROy3e3XWyDmwoyxaaj6jHemYF+iR0bnyH qJ51tYZIETckNgVfh+DmWCTY/wk+UVzQSQr4jp1lMJozwJ0kqeBDynddHllJBZyl0shO bDMg== X-Gm-Message-State: ALoCoQmREIqCBWJbbf8nFdpyYnaA7JvleRZ8V1S273x6d0eivVfdwbTAhSHNZzliYhwwbFBt41SN X-Received: by 10.66.248.106 with SMTP id yl10mr10008263pac.140.1449115684431; Wed, 02 Dec 2015 20:08:04 -0800 (PST) Received: from localhost ([122.172.170.156]) by smtp.gmail.com with ESMTPSA id ww5sm565020pac.35.2015.12.02.20.08.03 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 02 Dec 2015 20:08:03 -0800 (PST) From: Viresh Kumar To: Rafael Wysocki Cc: linaro-kernel@lists.linaro.org, linux-pm@vger.kernel.org, ashwin.chaugule@linaro.org, Viresh Kumar , linux-kernel@vger.kernel.org (open list) Subject: [PATCH V2 1/6] cpufreq: ondemand: Update sampling rate only for concerned policies Date: Thu, 3 Dec 2015 09:37:49 +0530 Message-Id: X-Mailer: git-send-email 2.6.2.198.g614a2ac In-Reply-To: References: In-Reply-To: References: Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org We are comparing policy->governor against cpufreq_gov_ondemand to make sure that we update sampling rate only for the concerned CPUs. But that isn't enough. In case of governor_per_policy, there can be multiple instances of ondemand governor and we will always end up updating all of them with current code. What we rather need to do, is to compare dbs_data with poilcy->governor_data, which will match only for the policies governed by dbs_data. This code is also racy as the governor might be getting stopped at that time and we may end up scheduling work for a policy, which we have just disabled. Fix that by protecting the entire function with &od_dbs_cdata.mutex, which will prevent against races with policy START/STOP/etc. After these locks are in place, we can safely get the policy via per-cpu dbs_info. Signed-off-by: Viresh Kumar --- drivers/cpufreq/cpufreq_ondemand.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) -- 2.6.2.198.g614a2ac -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 03ac6ce54042..089ca6a6ca02 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c @@ -252,20 +252,39 @@ static void update_sampling_rate(struct dbs_data *dbs_data, od_tuners->sampling_rate = new_rate = max(new_rate, dbs_data->min_sampling_rate); + /* + * Lock governor so that governor start/stop can't execute in parallel. + */ + mutex_lock(&od_dbs_cdata.mutex); + for_each_online_cpu(cpu) { struct cpufreq_policy *policy; struct od_cpu_dbs_info_s *dbs_info; + struct cpu_dbs_info *cdbs; + struct cpu_common_dbs_info *shared; unsigned long next_sampling, appointed_at; - policy = cpufreq_cpu_get(cpu); - if (!policy) + dbs_info = &per_cpu(od_cpu_dbs_info, cpu); + cdbs = &dbs_info->cdbs; + shared = cdbs->shared; + + /* + * A valid shared and shared->policy means governor hasn't + * stopped or exited yet. + */ + if (!shared || !shared->policy) continue; - if (policy->governor != &cpufreq_gov_ondemand) { - cpufreq_cpu_put(policy); + + policy = shared->policy; + + /* + * Update sampling rate for CPUs whose policy is governed by + * dbs_data. In case of governor_per_policy, only a single + * policy will be governed by dbs_data, otherwise there can be + * multiple policies that are governed by the same dbs_data. + */ + if (dbs_data != policy->governor_data) continue; - } - dbs_info = &per_cpu(od_cpu_dbs_info, cpu); - cpufreq_cpu_put(policy); if (!delayed_work_pending(&dbs_info->cdbs.dwork)) continue; @@ -281,6 +300,8 @@ static void update_sampling_rate(struct dbs_data *dbs_data, } } + + mutex_unlock(&od_dbs_cdata.mutex); } static ssize_t store_sampling_rate(struct dbs_data *dbs_data, const char *buf,