From patchwork Wed Dec 9 06:19:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Muckle X-Patchwork-Id: 7804821 Return-Path: X-Original-To: patchwork-linux-pm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 8DBAABEEE1 for ; Wed, 9 Dec 2015 06:20:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A409D204D3 for ; Wed, 9 Dec 2015 06:20:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 291BC204C9 for ; Wed, 9 Dec 2015 06:20:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752591AbbLIGUA (ORCPT ); Wed, 9 Dec 2015 01:20:00 -0500 Received: from mail-pf0-f180.google.com ([209.85.192.180]:34419 "EHLO mail-pf0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752021AbbLIGTj (ORCPT ); Wed, 9 Dec 2015 01:19:39 -0500 Received: by pfbg73 with SMTP id g73so25315068pfb.1 for ; Tue, 08 Dec 2015 22:19:38 -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; bh=yjXajGvcWyJF2dLxBqzYWcBeoBd9TjJ+qcPLBHW7z0o=; b=d+WBEiotwx3aUyiIG9D09KataC2Jab2yWy8ERd6qlg/GBVDWidCqkPLlCX7a2jgAXT vAsbYYmPH63nQHQ2Obb0pFh8Uc5kKU3GKrrlVfOtTRNdF0ZPdpsutm2Sjg50r0eBakNY jt2IEBvtiOeCiujqk+Ul5mXM6D+rw3Kok57fMcaamFD6ieJkACcCX/8QRTkLJrJjVVYW IjDwnN0MdDwjOap6/8Fte/xQ9/0r7km3y22gNTECOT6G65PhKnRl8iQezI4U2zY2WiHj Rn3QvSIEzUgdqPySW9JuP3JaZGogW8waGgExt/GXYdSztvAESq0pQLXKlIIpAZLkrMBC ZJ+Q== 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; bh=yjXajGvcWyJF2dLxBqzYWcBeoBd9TjJ+qcPLBHW7z0o=; b=iu+bisedyJ1nX71QYrBG3GJd01upnRQXemmREu6RY3PZ33LlwOM51VQRMvQH6+jEyK /Ok+qtnKK+qcP+UZQyi4mJXDSUaCmzNqIYK9K/7y0zhx/8cd38yLQm4c97oiUOdciWqR uNh3jSd31kDJ8dvEQ5N5dLZKncWOtMiU+HbRqpaGygKJhcYD5m6rCh27TrzmeSosczQb ZKzkx0AVv2QNPVRyd0B06i5kNtgiPg3WY/ixNR+AWKAdkFuSSXzqrrOICxOp6ackGTN2 pLnlJ4Vc/AVViEYELb2mN/6aTVafEFV5qXec5ViPP8hlzrPd/KPQpNwCuPmwPYOP0iK2 hPMw== X-Gm-Message-State: ALoCoQmakCFHDX05GLKHf73qWONzw2MqQQbqfQZ33rJJjghZJSyU3aSeMtrQXRM4loVH8qNxpZCAqlTv22147/zzMnRGXn9E4Q== X-Received: by 10.98.79.206 with SMTP id f75mr10701087pfj.24.1449641978537; Tue, 08 Dec 2015 22:19:38 -0800 (PST) Received: from graphite.smuckle.net (cpe-75-80-155-7.san.res.rr.com. [75.80.155.7]) by smtp.gmail.com with ESMTPSA id l84sm8643078pfb.15.2015.12.08.22.19.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 08 Dec 2015 22:19:37 -0800 (PST) From: Steve Muckle X-Google-Original-From: Steve Muckle To: Peter Zijlstra , Ingo Molnar Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, Vincent Guittot , Morten Rasmussen , Dietmar Eggemann , Juri Lelli , Patrick Bellasi , Michael Turquette , "Rafael J. Wysocki" , Viresh Kumar Subject: [RFCv6 PATCH 02/10] cpufreq: introduce cpufreq_driver_is_slow Date: Tue, 8 Dec 2015 22:19:23 -0800 Message-Id: <1449641971-20827-3-git-send-email-smuckle@linaro.org> X-Mailer: git-send-email 2.4.10 In-Reply-To: <1449641971-20827-1-git-send-email-smuckle@linaro.org> References: <1449641971-20827-1-git-send-email-smuckle@linaro.org> Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Michael Turquette Some architectures and platforms perform CPU frequency transitions through a non-blocking method, while some might block or sleep. Even when frequency transitions do not block or sleep they may be very slow. This distinction is important when trying to change frequency from a non-interruptible context in a scheduler hot path. Describe this distinction with a cpufreq driver flag, CPUFREQ_DRIVER_FAST. The default is to not have this flag set, thus erring on the side of caution. cpufreq_driver_is_slow() is also introduced in this patch. Setting the above flag will allow this function to return false. [smuckle@linaro.org: change flag/API to include drivers that are too slow for scheduler hot paths, in addition to those that block/sleep] Cc: Rafael J. Wysocki Cc: Viresh Kumar Signed-off-by: Michael Turquette Signed-off-by: Steve Muckle --- drivers/cpufreq/cpufreq.c | 6 ++++++ include/linux/cpufreq.h | 9 +++++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 7c48e73..8482820 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -154,6 +154,12 @@ bool have_governor_per_policy(void) } EXPORT_SYMBOL_GPL(have_governor_per_policy); +bool cpufreq_driver_is_slow(void) +{ + return !(cpufreq_driver->flags & CPUFREQ_DRIVER_FAST); +} +EXPORT_SYMBOL_GPL(cpufreq_driver_is_slow); + struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy) { if (have_governor_per_policy()) diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index ef4c5b1..7f8c63d 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -159,6 +159,7 @@ u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy); int cpufreq_get_policy(struct cpufreq_policy *policy, unsigned int cpu); int cpufreq_update_policy(unsigned int cpu); bool have_governor_per_policy(void); +bool cpufreq_driver_is_slow(void); struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy); #else static inline unsigned int cpufreq_get(unsigned int cpu) @@ -316,6 +317,14 @@ struct cpufreq_driver { */ #define CPUFREQ_NEED_INITIAL_FREQ_CHECK (1 << 5) +/* + * Indicates that it is safe to call cpufreq_driver_target from + * non-interruptable context in scheduler hot paths. Drivers must + * opt-in to this flag, as the safe default is that they might sleep + * or be too slow for hot path use. + */ +#define CPUFREQ_DRIVER_FAST (1 << 6) + int cpufreq_register_driver(struct cpufreq_driver *driver_data); int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);