Received: by 2002:a17:90b:8d0:0:0:0:0 with SMTP id ds16csp4862240pjb; Mon, 27 Jul 2020 07:05:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwH9XtgvdZm4yKAB+j7qBGZCJJS6fblJui1rQD8N2BXnipU4e8k6kX5l5VffGfq9YWgIM9G X-Received: by 2002:aa7:d155:: with SMTP id r21mr19444349edo.87.1595858757962; Mon, 27 Jul 2020 07:05:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1595858757; cv=none; d=google.com; s=arc-20160816; b=nLXNorEdJTedOD9L4Vj9BlIq6IVQDfGouY/B3TToVCTvI6f5DTev3uk74udgnK5xRK jMMckvQSCtPy5GRegQWmGoAXQjqti2QvsXK9EC77+h8ENo/RD9AY5xD4I3OrScsc7OuO AvW2intIhw+SncY6wyM7X+qBl5px7ry25ghsHJvmXzuuK1kFitwqyceCgRL5m/AktNex 1IYXy3g+0wNE7p5KypwN4zSBn06WP+TW7WdaPhm6DizhkWfrbEl6AX7rRyElcmynZgFO 7IUNWOW30VMpK1TN9Vsbs63gGHXcwKarSeXjaSNp2PQ9jP1gmv6X4e/JRk2okQpoYqQn 2t/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version; bh=mRY3UX2NBXS9aSshDQuKlv62KiLkLKBPXBEuh/ff5bQ=; b=wJVKOHv4OHBgS/9Bz8b11CwHTN09YwamHeFgoXw6b52zSuLyGw9VhvNTEKbtF5d+si eJibXHKv90nfMkHPOnlJ8RuQHbVp5b15nT3Y2zJM4lYxb5eeb+iBSx2LwQgNzJUPjZp5 VzVmevl40LnpSdHO2rVnu7wyH7k0hc0Ta61OXYKi8fHqmRPF+p1HxfzkrbO5hui92cd2 29TDzAaAJymi975AgHsFtm6r7SUIu/k10o929Mwg+Tc+qWOafFE/tFRjizfFbhP5IYTV hgjlUKqX91EFFxLqSf88CaQKxZdTgOJhFw2fdmXxvK7uFIkSYjB/w+GizgrjBdls72qV igog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e10si5369453ejj.546.2020.07.27.07.05.35; Mon, 27 Jul 2020 07:05:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728264AbgG0OCb (ORCPT + 99 others); Mon, 27 Jul 2020 10:02:31 -0400 Received: from mail-oi1-f193.google.com ([209.85.167.193]:35720 "EHLO mail-oi1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726298AbgG0OCa (ORCPT ); Mon, 27 Jul 2020 10:02:30 -0400 Received: by mail-oi1-f193.google.com with SMTP id k4so14414251oik.2; Mon, 27 Jul 2020 07:02:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=mRY3UX2NBXS9aSshDQuKlv62KiLkLKBPXBEuh/ff5bQ=; b=VZSmWFSCFyGTLM566ozWQhgVUteuGMUYaoXa9BG44LFRqw1G5DrZBZNJ62ADFNOGb8 iFkvT+SOwbwhZrPvbhPFAWvvBdX7lb5Mn0hUXE/v+4jyiMfh2tzRuQMKd6UQsSV/9jnw +G+HKy93qhzOFhdrv7BI1MhGfvVBiU3qlkWc0FE74hrA7MLuX1WUCWdWsGJ1WALS8NM2 VNTmu7I6K6IjnlYfMHLlebau8zeEvmDuPxf0bysUUCDlaEMJstnCEpQV2KEo7p0J1UBM 7PDz86fG561/8xGuB8yHbCadYlJmGENpvaCogo2+TJTEAN5so005tHFoFvleQi1r67QU H3hw== X-Gm-Message-State: AOAM532vU3HiT73XGhfXmUdNw41TTbcshn4WfuvjI16YclzPNC9t5zFS SSiNHLmKrzygkoNmuQiMFucu6yPjl1697WEV+bU= X-Received: by 2002:aca:4a89:: with SMTP id x131mr19034751oia.103.1595858549233; Mon, 27 Jul 2020 07:02:29 -0700 (PDT) MIME-Version: 1.0 References: <20200722093732.14297-1-ionela.voinescu@arm.com> <20200722093732.14297-5-ionela.voinescu@arm.com> In-Reply-To: <20200722093732.14297-5-ionela.voinescu@arm.com> From: "Rafael J. Wysocki" Date: Mon, 27 Jul 2020 16:02:18 +0200 Message-ID: Subject: Re: [PATCH v2 4/7] cpufreq: report whether cpufreq supports Frequency Invariance (FI) To: Ionela Voinescu Cc: "Rafael J. Wysocki" , Viresh Kumar , Dietmar Eggemann , Catalin Marinas , Sudeep Holla , Will Deacon , Russell King - ARM Linux , Ingo Molnar , Peter Zijlstra , Linux PM , Linux ARM , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 22, 2020 at 11:38 AM Ionela Voinescu wrote: > > Now that the update of the FI scale factor is done in cpufreq core for > selected functions - target(), target_index() and fast_switch(), > we can provide feedback to the task scheduler and architecture code > on whether cpufreq supports FI. > > For this purpose, provide error and debug messages, together with an > external function to expose whether the cpufreq drivers support FI, by > using a static key. > > The logic behind the enablement of cpufreq-based invariance is as > follows: > - cpufreq-based invariance is disabled by default > - cpufreq-based invariance is enabled if any of the callbacks > above is implemented while the unsupported setpolicy() is not > - if enabled, cpufreq-based invariance will be disabled during the > call of the default arch_set_freq_scale() function which does > not set a scale factor. > > Signed-off-by: Ionela Voinescu > Cc: Rafael J. Wysocki > Cc: Viresh Kumar > --- > drivers/cpufreq/cpufreq.c | 28 ++++++++++++++++++++++++++++ > include/linux/cpufreq.h | 5 +++++ > 2 files changed, 33 insertions(+) > > diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > index 3497c1cd6818..1d0b046fe8e9 100644 > --- a/drivers/cpufreq/cpufreq.c > +++ b/drivers/cpufreq/cpufreq.c > @@ -61,6 +61,9 @@ static struct cpufreq_driver *cpufreq_driver; > static DEFINE_PER_CPU(struct cpufreq_policy *, cpufreq_cpu_data); > static DEFINE_RWLOCK(cpufreq_driver_lock); > > +/* Mark support for the scheduler's frequency invariance engine */ > +static DEFINE_STATIC_KEY_FALSE(cpufreq_set_freq_scale); > + > /* Flag to suspend/resume CPUFreq governors */ > static bool cpufreq_suspended; > > @@ -69,6 +72,25 @@ static inline bool has_target(void) > return cpufreq_driver->target_index || cpufreq_driver->target; > } > > +static inline > +void enable_cpufreq_freq_invariance(struct cpufreq_driver *driver) > +{ > + if ((driver->target || driver->target_index || driver->fast_switch) && > + !driver->setpolicy) { > + > + static_branch_enable_cpuslocked(&cpufreq_set_freq_scale); > + pr_debug("%s: Driver %s can provide frequency invariance.", > + __func__, driver->name); > + } else > + pr_err("%s: Driver %s cannot provide frequency invariance.", > + __func__, driver->name); This doesn't follow the kernel coding style (the braces around the pr_err() statement are missing). Besides, IMO on architectures where arch_set_freq_scale() is empty, this should be empty as well. > +} > + > +bool cpufreq_sets_freq_scale(void) > +{ > + return static_branch_likely(&cpufreq_set_freq_scale); > +} > + > /* internal prototypes */ > static unsigned int __cpufreq_get(struct cpufreq_policy *policy); > static int cpufreq_init_governor(struct cpufreq_policy *policy); > @@ -159,6 +181,9 @@ EXPORT_SYMBOL_GPL(get_cpu_idle_time); > __weak void arch_set_freq_scale(struct cpumask *cpus, unsigned long cur_freq, > unsigned long max_freq) > { > + if (cpufreq_sets_freq_scale()) > + static_branch_disable_cpuslocked(&cpufreq_set_freq_scale); > + > } > EXPORT_SYMBOL_GPL(arch_set_freq_scale); > > @@ -2722,6 +2747,8 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) > cpufreq_driver = driver_data; > write_unlock_irqrestore(&cpufreq_driver_lock, flags); > > + enable_cpufreq_freq_invariance(cpufreq_driver); > + > if (driver_data->setpolicy) > driver_data->flags |= CPUFREQ_CONST_LOOPS; > > @@ -2791,6 +2818,7 @@ int cpufreq_unregister_driver(struct cpufreq_driver *driver) > cpus_read_lock(); > subsys_interface_unregister(&cpufreq_interface); > remove_boost_sysfs_file(); > + static_branch_disable_cpuslocked(&cpufreq_set_freq_scale); > cpuhp_remove_state_nocalls_cpuslocked(hp_online); > > write_lock_irqsave(&cpufreq_driver_lock, flags); > diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h > index e62b022cb07e..f81215ad76f1 100644 > --- a/include/linux/cpufreq.h > +++ b/include/linux/cpufreq.h > @@ -217,6 +217,7 @@ void refresh_frequency_limits(struct cpufreq_policy *policy); > void cpufreq_update_policy(unsigned int cpu); > void cpufreq_update_limits(unsigned int cpu); > bool have_governor_per_policy(void); > +bool cpufreq_sets_freq_scale(void); > struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy); > void cpufreq_enable_fast_switch(struct cpufreq_policy *policy); > void cpufreq_disable_fast_switch(struct cpufreq_policy *policy); > @@ -237,6 +238,10 @@ static inline unsigned int cpufreq_get_hw_max_freq(unsigned int cpu) > { > return 0; > } > +static inline bool cpufreq_sets_freq_scale(void) > +{ > + return false; > +} > static inline void disable_cpufreq(void) { } > #endif > > -- > 2.17.1 >