From patchwork Mon Mar 1 21:21:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 388755 Delivered-To: patch@linaro.org Received: by 2002:a02:290e:0:0:0:0:0 with SMTP id p14csp3708001jap; Mon, 1 Mar 2021 13:30:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJzgjgRYtXPFczmbhxl8SMQM0oBYF2ohcMOpKVb0cEeEcqAombCde8L601B0id+2ya1mWqul X-Received: by 2002:a17:907:76b6:: with SMTP id jw22mr7561933ejc.11.1614634221766; Mon, 01 Mar 2021 13:30:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614634221; cv=none; d=google.com; s=arc-20160816; b=qgIjCo4pqxG/4VbUzF3tjFv1ec6anV6Eltgi8jby/UnSms6OUUZ35RwPGWFQFYTAYE 5cPnBFHmWoES8v8sgW7DamVzgRS871K6ahKT00QwKyaAqn+cWDeuLY5kYdskQ82lPc76 x5+HRP2lugEt7KsufPmYhMgSrVgh7uYRmLmUCrCrXqXyINTcNuPYjYxPWFqg3jzcV/fI 4xIFo5TscUEPy17xmqWlsrv3hKB1DHt49mRyhCgmXol/XdC5Ik+dsxPQ0hO1sozboiZE x5D0Up6ywgg4U9treU0xi+pLlYoQgnDcbTRfbsYDAX//IJ0f5NHxpfXl05Imkvo7M3qA zgdw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=JL3ljQbtpiqfPq9g1CPXYgu2XQMsCxcmPuqJVVTE8zE=; b=nb7fss2ks8Jy0Efl/LgfvGyCWqq4kYKJJ7NZx5BJKWufxljJ4VDavjtUdjEDBHiHTl BQNAKkdGHw7dm15BqWhKo8wxUh2u7LuZZpZp0pcCvPOiWLsMhrhgt/BvSbFllsX3bd6r a2MHEE2hY3y6Wn2238/sI+jlzCMXz9ZFX3hlRIeb7IGW4gw11GoSAn+GWPdjnrRCrzIn f6I92uQ1wamawJBjRnn3Dgq7bV5Svz8ush6bc/JftvrgJBs2F+NY9SH1LcEX61Tv6Qb+ gTOVdDLX89lLNjnWaHc07XX3vS37RDtOShviDP8/8wjpccgFRqfAEH0ts4b2c7imvK5Q 1guw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=SCsNv4TG; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hr14si3825272ejc.394.2021.03.01.13.30.21; Mon, 01 Mar 2021 13:30:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=SCsNv4TG; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238861AbhCAV3C (ORCPT + 7 others); Mon, 1 Mar 2021 16:29:02 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244228AbhCAVXq (ORCPT ); Mon, 1 Mar 2021 16:23:46 -0500 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5ECA0C061756 for ; Mon, 1 Mar 2021 13:23:04 -0800 (PST) Received: by mail-wm1-x32a.google.com with SMTP id w7so505788wmb.5 for ; Mon, 01 Mar 2021 13:23:04 -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; bh=JL3ljQbtpiqfPq9g1CPXYgu2XQMsCxcmPuqJVVTE8zE=; b=SCsNv4TG/CcUIe9PBEhMJDWlwak3FKzyq2o+BdVRg/IfGDbVD8LjJLgOwG1MnKVQ5m JaT2LjuYfHjYQfz4mLaJyCPSFDWtsMth/XI9Bb39iOVewqbPC+K12ezykte9d3Cu+1NM 8D2TtQcPWA69zk0dXGu44wXDcltIHvAw7IFYiRU66tGhayv4vktaED7hwpuZEqI61RP5 3ULtHJtReGDLaFP+a+45apxs1RUv01ykTy/S48Sad9K57FD8hmjcIuFtPfwhhgec0T8u IolIsbsR+986BROVM5TyoAzhgI31mxIVPlGYaAgpw5PlgH1tf4PRDfXUSbiwXfWFj05M lJvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=JL3ljQbtpiqfPq9g1CPXYgu2XQMsCxcmPuqJVVTE8zE=; b=BBjPX1S5R2mS0M22MtX7WWi3xBX405iZwT82YywErHcETCLJQl7MVk6azq1rp2Udiw 70PeF8LgmdkdUPrMuwYhwggt23UGiItoC8lDWb7E8ePaKLfv65QQmXbO54cZkeEzdRpZ Aq3Q2xzBNl+4ABoibNTFZllI5FFea4YeWMzicBNv0SGC2VVwX3Z+Cp0zHdX6JCyyWodL OEdP6TCRf55aDSajpJJUAmBFfxLQJKOY/vS0ZzcpCP5zBT61gXVeeunJPUFSxrkPISJ/ iXjNeDd6zYnoLnMLkJt0wjASA3t7pjolpw+fqnfwMTq7uNqTLMAKo2YHUV0P/JQxqp5t FnPg== X-Gm-Message-State: AOAM531Fz/JlHRMY82egNHwuVkIliWakZngshF/yTa6nJQSmVrmrpvXc drYE4YgRW6+IL29axCPzIMd02g== X-Received: by 2002:a05:600c:290b:: with SMTP id i11mr735048wmd.129.1614633782959; Mon, 01 Mar 2021 13:23:02 -0800 (PST) Received: from localhost.localdomain (lns-bzn-59-82-252-144-192.adsl.proxad.net. [82.252.144.192]) by smtp.gmail.com with ESMTPSA id o11sm6783866wrq.74.2021.03.01.13.23.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 13:23:02 -0800 (PST) From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH 1/5] powercap/drivers/dtpm: Encapsulate even more the code Date: Mon, 1 Mar 2021 22:21:45 +0100 Message-Id: <20210301212149.22877-1-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.17.1 Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org In order to increase the self-encapsulation of the dtpm generic code, the following changes are adding a power update ops to the dtpm ops. That allows the generic code to call directly the dtpm backend function to update the power values. The power update function does compute the power characteristics when the function is invoked. In the case of the CPUs, the power consumption depends on the number of online CPUs. The online CPUs mask is not up to date at CPUHP_AP_ONLINE_DYN state in the tear down callback. That is the reason why the online / offline are at separate state. As there is already an existing state for DTPM, this one is only moved to the DEAD state, so there is no addition of new state with these changes. That simplifies the code for the next changes and results in a more self-encapsulated code. Signed-off-by: Daniel Lezcano --- drivers/powercap/dtpm.c | 54 ++++++++-------- drivers/powercap/dtpm_cpu.c | 124 +++++++++++++----------------------- include/linux/cpuhotplug.h | 2 +- include/linux/dtpm.h | 3 +- 4 files changed, 76 insertions(+), 107 deletions(-) -- 2.17.1 diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c index c2185ec5f887..1085dccf9c58 100644 --- a/drivers/powercap/dtpm.c +++ b/drivers/powercap/dtpm.c @@ -116,8 +116,6 @@ static void __dtpm_sub_power(struct dtpm *dtpm) parent->power_limit -= dtpm->power_limit; parent = parent->parent; } - - __dtpm_rebalance_weight(root); } static void __dtpm_add_power(struct dtpm *dtpm) @@ -130,45 +128,45 @@ static void __dtpm_add_power(struct dtpm *dtpm) parent->power_limit += dtpm->power_limit; parent = parent->parent; } +} + +static int __dtpm_update_power(struct dtpm *dtpm) +{ + int ret; + + __dtpm_sub_power(dtpm); - __dtpm_rebalance_weight(root); + ret = dtpm->ops->upt_power_uw(dtpm); + if (ret) + pr_err("Failed to update power for '%s': %d\n", + dtpm->zone.name, ret); + + if (!test_bit(DTPM_POWER_LIMIT_FLAG, &dtpm->flags)) + dtpm->power_limit = dtpm->power_max; + + __dtpm_add_power(dtpm); + + if (root) + __dtpm_rebalance_weight(root); + + return ret; } /** * dtpm_update_power - Update the power on the dtpm * @dtpm: a pointer to a dtpm structure to update - * @power_min: a u64 representing the new power_min value - * @power_max: a u64 representing the new power_max value * * Function to update the power values of the dtpm node specified in * parameter. These new values will be propagated to the tree. * * Return: zero on success, -EINVAL if the values are inconsistent */ -int dtpm_update_power(struct dtpm *dtpm, u64 power_min, u64 power_max) +int dtpm_update_power(struct dtpm *dtpm) { - int ret = 0; + int ret; mutex_lock(&dtpm_lock); - - if (power_min == dtpm->power_min && power_max == dtpm->power_max) - goto unlock; - - if (power_max < power_min) { - ret = -EINVAL; - goto unlock; - } - - __dtpm_sub_power(dtpm); - - dtpm->power_min = power_min; - dtpm->power_max = power_max; - if (!test_bit(DTPM_POWER_LIMIT_FLAG, &dtpm->flags)) - dtpm->power_limit = power_max; - - __dtpm_add_power(dtpm); - -unlock: + ret = __dtpm_update_power(dtpm); mutex_unlock(&dtpm_lock); return ret; @@ -436,6 +434,7 @@ int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent) if (dtpm->ops && !(dtpm->ops->set_power_uw && dtpm->ops->get_power_uw && + dtpm->ops->upt_power_uw && dtpm->ops->release)) return -EINVAL; @@ -455,7 +454,8 @@ int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent) root = dtpm; } - __dtpm_add_power(dtpm); + if (dtpm->ops && !dtpm->ops->upt_power_uw(dtpm)) + __dtpm_add_power(dtpm); pr_info("Registered dtpm node '%s' / %llu-%llu uW, \n", dtpm->zone.name, dtpm->power_min, dtpm->power_max); diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c index 51c366938acd..aff79c649345 100644 --- a/drivers/powercap/dtpm_cpu.c +++ b/drivers/powercap/dtpm_cpu.c @@ -14,6 +14,8 @@ * The CPU hotplug is supported and the power numbers will be updated * if a CPU is hot plugged / unplugged. */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + #include #include #include @@ -23,8 +25,6 @@ #include #include -static struct dtpm *__parent; - static DEFINE_PER_CPU(struct dtpm *, dtpm_per_cpu); struct dtpm_cpu { @@ -32,57 +32,16 @@ struct dtpm_cpu { int cpu; }; -/* - * When a new CPU is inserted at hotplug or boot time, add the power - * contribution and update the dtpm tree. - */ -static int power_add(struct dtpm *dtpm, struct em_perf_domain *em) -{ - u64 power_min, power_max; - - power_min = em->table[0].power; - power_min *= MICROWATT_PER_MILLIWATT; - power_min += dtpm->power_min; - - power_max = em->table[em->nr_perf_states - 1].power; - power_max *= MICROWATT_PER_MILLIWATT; - power_max += dtpm->power_max; - - return dtpm_update_power(dtpm, power_min, power_max); -} - -/* - * When a CPU is unplugged, remove its power contribution from the - * dtpm tree. - */ -static int power_sub(struct dtpm *dtpm, struct em_perf_domain *em) -{ - u64 power_min, power_max; - - power_min = em->table[0].power; - power_min *= MICROWATT_PER_MILLIWATT; - power_min = dtpm->power_min - power_min; - - power_max = em->table[em->nr_perf_states - 1].power; - power_max *= MICROWATT_PER_MILLIWATT; - power_max = dtpm->power_max - power_max; - - return dtpm_update_power(dtpm, power_min, power_max); -} - static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit) { struct dtpm_cpu *dtpm_cpu = dtpm->private; - struct em_perf_domain *pd; + struct em_perf_domain *pd = em_cpu_get(dtpm_cpu->cpu); struct cpumask cpus; unsigned long freq; u64 power; int i, nr_cpus; - pd = em_cpu_get(dtpm_cpu->cpu); - cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus)); - nr_cpus = cpumask_weight(&cpus); for (i = 0; i < pd->nr_perf_states; i++) { @@ -113,6 +72,7 @@ static u64 get_pd_power_uw(struct dtpm *dtpm) pd = em_cpu_get(dtpm_cpu->cpu); freq = cpufreq_quick_get(dtpm_cpu->cpu); + cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus)); nr_cpus = cpumask_weight(&cpus); @@ -128,6 +88,27 @@ static u64 get_pd_power_uw(struct dtpm *dtpm) return 0; } +static int upt_pd_power_uw(struct dtpm *dtpm) +{ + struct dtpm_cpu *dtpm_cpu = dtpm->private; + struct em_perf_domain *em = em_cpu_get(dtpm_cpu->cpu); + struct cpumask cpus; + int nr_cpus; + + cpumask_and(&cpus, cpu_online_mask, to_cpumask(em->cpus)); + nr_cpus = cpumask_weight(&cpus); + + dtpm->power_min = em->table[0].power; + dtpm->power_min *= MICROWATT_PER_MILLIWATT; + dtpm->power_min *= nr_cpus; + + dtpm->power_max = em->table[em->nr_perf_states - 1].power; + dtpm->power_max *= MICROWATT_PER_MILLIWATT; + dtpm->power_max *= nr_cpus; + + return 0; +} + static void pd_release(struct dtpm *dtpm) { struct dtpm_cpu *dtpm_cpu = dtpm->private; @@ -141,37 +122,25 @@ static void pd_release(struct dtpm *dtpm) static struct dtpm_ops dtpm_ops = { .set_power_uw = set_pd_power_limit, .get_power_uw = get_pd_power_uw, + .upt_power_uw = upt_pd_power_uw, .release = pd_release, }; static int cpuhp_dtpm_cpu_offline(unsigned int cpu) { - struct cpufreq_policy *policy; + struct cpumask cpus; struct em_perf_domain *pd; struct dtpm *dtpm; - policy = cpufreq_cpu_get(cpu); - - if (!policy) - return 0; - pd = em_cpu_get(cpu); if (!pd) return -EINVAL; - dtpm = per_cpu(dtpm_per_cpu, cpu); - - power_sub(dtpm, pd); - - if (cpumask_weight(policy->cpus) != 1) - return 0; - - for_each_cpu(cpu, policy->related_cpus) - per_cpu(dtpm_per_cpu, cpu) = NULL; + cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus)); - dtpm_unregister(dtpm); + dtpm = per_cpu(dtpm_per_cpu, cpu); - return 0; + return dtpm_update_power(dtpm); } static int cpuhp_dtpm_cpu_online(unsigned int cpu) @@ -184,7 +153,6 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) int ret = -ENOMEM; policy = cpufreq_cpu_get(cpu); - if (!policy) return 0; @@ -194,7 +162,7 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) dtpm = per_cpu(dtpm_per_cpu, cpu); if (dtpm) - return power_add(dtpm, pd); + return dtpm_update_power(dtpm); dtpm = dtpm_alloc(&dtpm_ops); if (!dtpm) @@ -210,27 +178,20 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) for_each_cpu(cpu, policy->related_cpus) per_cpu(dtpm_per_cpu, cpu) = dtpm; - sprintf(name, "cpu%d", dtpm_cpu->cpu); + sprintf(name, "cpu%d-cpufreq", dtpm_cpu->cpu); - ret = dtpm_register(name, dtpm, __parent); + ret = dtpm_register(name, dtpm, NULL); if (ret) goto out_kfree_dtpm_cpu; - ret = power_add(dtpm, pd); - if (ret) - goto out_dtpm_unregister; - ret = freq_qos_add_request(&policy->constraints, &dtpm_cpu->qos_req, FREQ_QOS_MAX, pd->table[pd->nr_perf_states - 1].frequency); if (ret) - goto out_power_sub; + goto out_dtpm_unregister; return 0; -out_power_sub: - power_sub(dtpm, pd); - out_dtpm_unregister: dtpm_unregister(dtpm); dtpm_cpu = NULL; @@ -248,10 +209,17 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) int dtpm_register_cpu(struct dtpm *parent) { - __parent = parent; + int ret; - return cpuhp_setup_state(CPUHP_AP_DTPM_CPU_ONLINE, - "dtpm_cpu:online", - cpuhp_dtpm_cpu_online, - cpuhp_dtpm_cpu_offline); + ret = cpuhp_setup_state(CPUHP_AP_DTPM_CPU_DEAD, "dtpm_cpu:offline", + NULL, cpuhp_dtpm_cpu_offline); + if (ret < 0) + return ret; + + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "dtpm_cpu:online", + cpuhp_dtpm_cpu_online, NULL); + if (ret < 0) + return ret; + + return 0; } diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h index ee09a39627d6..fcb2967fb5ba 100644 --- a/include/linux/cpuhotplug.h +++ b/include/linux/cpuhotplug.h @@ -61,6 +61,7 @@ enum cpuhp_state { CPUHP_LUSTRE_CFS_DEAD, CPUHP_AP_ARM_CACHE_B15_RAC_DEAD, CPUHP_PADATA_DEAD, + CPUHP_AP_DTPM_CPU_DEAD, CPUHP_WORKQUEUE_PREP, CPUHP_POWER_NUMA_PREPARE, CPUHP_HRTIMERS_PREPARE, @@ -193,7 +194,6 @@ enum cpuhp_state { CPUHP_AP_ONLINE_DYN_END = CPUHP_AP_ONLINE_DYN + 30, CPUHP_AP_X86_HPET_ONLINE, CPUHP_AP_X86_KVM_CLK_ONLINE, - CPUHP_AP_DTPM_CPU_ONLINE, CPUHP_AP_ACTIVE, CPUHP_ONLINE, }; diff --git a/include/linux/dtpm.h b/include/linux/dtpm.h index e80a332e3d8a..d29be6a0e513 100644 --- a/include/linux/dtpm.h +++ b/include/linux/dtpm.h @@ -29,6 +29,7 @@ struct dtpm { struct dtpm_ops { u64 (*set_power_uw)(struct dtpm *, u64); u64 (*get_power_uw)(struct dtpm *); + int (*upt_power_uw)(struct dtpm *); void (*release)(struct dtpm *); }; @@ -62,7 +63,7 @@ static inline struct dtpm *to_dtpm(struct powercap_zone *zone) return container_of(zone, struct dtpm, zone); } -int dtpm_update_power(struct dtpm *dtpm, u64 power_min, u64 power_max); +int dtpm_update_power(struct dtpm *dtpm); int dtpm_release_zone(struct powercap_zone *pcz); From patchwork Mon Mar 1 21:21:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 388754 Delivered-To: patch@linaro.org Received: by 2002:a02:290e:0:0:0:0:0 with SMTP id p14csp3707996jap; Mon, 1 Mar 2021 13:30:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRR6wi4e8G7UhntDeXUoT9oQXO1SCSRDnQdrIH5ejGrN+WrnQ2Wbg6yZsWHrwIs2M8r1WD X-Received: by 2002:a05:6402:5255:: with SMTP id t21mr3984969edd.91.1614634221390; Mon, 01 Mar 2021 13:30:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614634221; cv=none; d=google.com; s=arc-20160816; b=IBYCttOPCDHG+1U2pbbKLWDVHjRIg0Io9zTdkVbj2DUCWgrVmrK3D8map7b+sxzNDl N4K0QXXJakuVMBrAT02QjyW2qz5EiAWWJcsIiLemZUpGfPNCRrSaLJI8OPR2GbmFf75x VtxIIiQDliCtHkEYs1r0IkO9lq1rO7twUUUtbj1UW6ivfw5+X8lmHsyCV5HZMkJWb0Gy JjYvV/+rEAUttHYPpCuaWIGlOUrVEBM/tg+RMJkOD3abNlUPr2a0cKbihSIyikwem0AO /fsd+roKBjyd0zUDo6DYAN8rYRrRbyFBvsaMjvcmH1BIFxay6m7nmzNNGACdzh5n2dPx Rqew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=BolDG0rpbm3VJxsNNntCGEQCMwhe+8DOiuZcK45flWE=; b=RR0iN5RvaSvqq7BgPJsmlv089g1NwTXWBdlODPlNTl1Gg7Agw4/UkrR0AmP5kuRd9G 4GfKoqYtJaMJGIsUFcG5QdX+od60956O2v9rH/E/mxmTbmYu/0yJb+adRPEOyq0ysHKT TW2VzLqq85KY2MK1Ct41MqbQgkNyN1jOlLyOgKDiPVgUDi5JYLMeutY5QuUGdkAYLTRT mxBQ2Ey1PifTkSgK68FfC624u3XjFnSh70CA8lngZIirOhTqclL9uJDmen9CcdcRb/js MhqUd1ZPsX8Vg8wVLj7wrnZbZTuu+IHnxqyxs/Vl0NpdrXXmVaJlWUNpEWKuPxTAQ9bc ab5w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qZ+9kawy; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hr14si3825272ejc.394.2021.03.01.13.30.21; Mon, 01 Mar 2021 13:30:21 -0800 (PST) Received-SPF: pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=qZ+9kawy; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237988AbhCAV2z (ORCPT + 7 others); Mon, 1 Mar 2021 16:28:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244229AbhCAVXq (ORCPT ); Mon, 1 Mar 2021 16:23:46 -0500 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4DBAEC06178A for ; Mon, 1 Mar 2021 13:23:05 -0800 (PST) Received: by mail-wr1-x433.google.com with SMTP id e10so17428070wro.12 for ; Mon, 01 Mar 2021 13:23:05 -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; bh=BolDG0rpbm3VJxsNNntCGEQCMwhe+8DOiuZcK45flWE=; b=qZ+9kawyM2v99+BilQ8EwE5yFnTaRIxYSafi9R18pZ+5lRSabU7EhSbUKmUsO7e+aX v1qBjCVlPMRWNQydcgMnmM3sJNwTWnLCPyKzCn8RI3qxtwQcPy3w1NH0wOmzPMiqcdX2 RHq2FZkBjkqx5Z4POo/VhjZlK1fR02CWCIlOC2qZ38LtKysnJbtND5fU0C+lZJwcNa8+ 2eYM+IxySoIct5Xz3jTVfA1VO0FvKFK8AkGfAxMpOilokckVvwhqfkapQJNKpqEKXhVT 6U16uuPMl3uJH8PPWqIr1zzlqoMoHnmWDjFydtr0/Dm3Kmv576iunwsy7MkXhlGmWfHm ogCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BolDG0rpbm3VJxsNNntCGEQCMwhe+8DOiuZcK45flWE=; b=L97ObhtizaoxlBOHeyW+O6jEDcTXZs+3ltGuwvNkKUTlff518ba/+P+uO84G6P4jWq UY3H5TtqDY4rGXPAmSSR8nSA8DxpP93q58VeQNjSrXHMcD4+L0cJDI/lQMlazRYZ2Rpk Jw6W12g0zDSeyve+gGyrLWjavr6BzZwtlljMYhTtjUekidQw+uOROhukIYHu03DeMlzB hGljfkTlU75WJWQmuHNg61FDSFcpbXKbV5DxHNf+KxULN7R2hzguaATlZHfLzKfUYJLR iZqJ3qZPuFHj3Z9vTuNpmLVPqKiQdEJWBbvuORnf3oyjEO406X3gzHo/WAhrtt+nYQ8b YJ6Q== X-Gm-Message-State: AOAM530NdK2FzY6jQzo+tvfj+jF0byRc2zUDVUUZ52oDs6yNfQr/Fepi XDMvocwKAELBS77G+aaEYNI1Zw== X-Received: by 2002:adf:e582:: with SMTP id l2mr18920292wrm.207.1614633783911; Mon, 01 Mar 2021 13:23:03 -0800 (PST) Received: from localhost.localdomain (lns-bzn-59-82-252-144-192.adsl.proxad.net. [82.252.144.192]) by smtp.gmail.com with ESMTPSA id o11sm6783866wrq.74.2021.03.01.13.23.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 13:23:03 -0800 (PST) From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH 2/5] powercap/drivers/dtpm: Create a registering system Date: Mon, 1 Mar 2021 22:21:46 +0100 Message-Id: <20210301212149.22877-2-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301212149.22877-1-daniel.lezcano@linaro.org> References: <20210301212149.22877-1-daniel.lezcano@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org A SoC can be differently structured depending on the platform and the kernel can not be aware of all the combinations, as well as the specific tweaks for a particular board. The creation of the hierarchy must be delegated to userspace. These changes provide a registering mechanism where the different subsystems will initialize their dtpm backends and register with a name the dtpm node in a list. The next changes will provide an userspace interface to create hierachically the different nodes. Those will be created by name and found via the list filled by the different subsystem. If a specified name is not found in the list, it is assumed to be a virtual node which will have children and the default is to allocate such node. When the node register in the list, the function will be dtpm_register where the previous semantic was to create the node. Thus, the functions are renamed to reflect their purpose. Signed-off-by: Daniel Lezcano --- drivers/powercap/dtpm.c | 158 ++++++++++++++++++++++++++++++++++-- drivers/powercap/dtpm_cpu.c | 4 +- include/linux/dtpm.h | 12 ++- 3 files changed, 161 insertions(+), 13 deletions(-) -- 2.17.1 diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c index 1085dccf9c58..20728a28ff0d 100644 --- a/drivers/powercap/dtpm.c +++ b/drivers/powercap/dtpm.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,14 @@ static DEFINE_MUTEX(dtpm_lock); static struct powercap_control_type *pct; static struct dtpm *root; +struct dtpm_node { + const char *name; + struct dtpm *dtpm; + struct list_head node; +}; + +static LIST_HEAD(dtpm_list); + static int get_time_window_us(struct powercap_zone *pcz, int cid, u64 *window) { return -ENOSYS; @@ -152,6 +161,135 @@ static int __dtpm_update_power(struct dtpm *dtpm) return ret; } +static struct dtpm *__dtpm_lookup(const char *name) +{ + struct dtpm_node *node; + + list_for_each_entry(node, &dtpm_list, node) { + if (!strcmp(name, node->name)) + return node->dtpm; + } + + return NULL; +} + +/** + * dtpm_get - Get a reference to a dtpm structure + * @name: the name of the dtpm device + * + * The function looks up in the list of the registered dtpm + * devices. If the dtpm device is not found, a virtual one is + * allocated. This function must be called to create a dtpm node in + * the powercap hierarchy. + * + * Return: a pointer to a dtpm structure, NULL if there is not enough + * memory + */ +struct dtpm *dtpm_get(const char *name) +{ + struct dtpm *dtpm; + + mutex_lock(&dtpm_lock); + dtpm = __dtpm_lookup(name); + if (!dtpm) + dtpm = dtpm_alloc(NULL); + else + kref_get(&dtpm->kref); + mutex_unlock(&dtpm_lock); + + return dtpm; +} + +static void dtpm_release(struct kref *kref) +{ + struct dtpm *dtpm = container_of(kref, struct dtpm, kref); + + kfree(dtpm); +} + +/** + * dtpm_put - Release a reference on a dtpm device + * @dtpm: a pointer to a dtpm structure + * + * Release the reference on the specified dtpm device. The last + * reference leads to a memory release. + */ +void dtpm_put(struct dtpm *dtpm) +{ + kref_put(&dtpm->kref, dtpm_release); +} + +/** + * dtpm_register - Register the dtpm in the dtpm list + * @name: a name used as an identifier + * @dtpm: the dtpm node to be registered + * + * Stores the dtpm device in a list. + * + * Return: 0 on success, -EEXIST if the device name is already present + * in the list, -ENOMEM in case of memory allocation failure. + */ +int dtpm_register(const char *name, struct dtpm *dtpm) +{ + struct dtpm_node *node; + + mutex_lock(&dtpm_lock); + + if (__dtpm_lookup(name)) { + mutex_unlock(&dtpm_lock); + return -EEXIST; + } + + node = kzalloc(sizeof(*node), GFP_KERNEL); + if (!node) + return -ENOMEM; + + node->name = kstrdup(name, GFP_KERNEL); + if (!node->name) { + kfree(node); + return -ENOMEM; + } + + node->dtpm = dtpm; + + list_add(&node->node, &dtpm_list); + + pr_info("Registered %s\n", name); + + mutex_unlock(&dtpm_lock); + + return 0; +} + +/** + * dtpm_unregister - Remove the dtpm device from the list + * @name: the dtpm device name to be removed + * + * Remove the dtpm device from the list of the registered devices. + */ +void dtpm_unregister(const char *name) +{ + struct dtpm_node *node; + + mutex_lock(&dtpm_lock); + + list_for_each_entry(node, &dtpm_list, node) { + + if (strcmp(name, node->name)) + continue; + + list_del(&node->node); + kfree(node->name); + kfree(node); + + pr_info("Unregistered %s\n", name); + + break; + } + + mutex_unlock(&dtpm_lock); +} + /** * dtpm_update_power - Update the power on the dtpm * @dtpm: a pointer to a dtpm structure to update @@ -208,7 +346,7 @@ int dtpm_release_zone(struct powercap_zone *pcz) if (root == dtpm) root = NULL; - kfree(dtpm); + dtpm_put(dtpm); return 0; } @@ -370,6 +508,7 @@ struct dtpm *dtpm_alloc(struct dtpm_ops *ops) if (dtpm) { INIT_LIST_HEAD(&dtpm->children); INIT_LIST_HEAD(&dtpm->sibling); + kref_init(&dtpm->kref); dtpm->weight = 1024; dtpm->ops = ops; } @@ -378,28 +517,29 @@ struct dtpm *dtpm_alloc(struct dtpm_ops *ops) } /** - * dtpm_unregister - Unregister a dtpm node from the hierarchy tree - * @dtpm: a pointer to a dtpm structure corresponding to the node to be removed + * dtpm_destroy - Destroy a dtpm node from the hierarchy tree + * @dtpm: a pointer to a dtpm structure corresponding to the node to be + * removed and destroyed * * Call the underlying powercap unregister function. That will call * the release callback of the powercap zone. */ -void dtpm_unregister(struct dtpm *dtpm) +void dtpm_destroy(struct dtpm *dtpm) { powercap_unregister_zone(pct, &dtpm->zone); - pr_info("Unregistered dtpm node '%s'\n", dtpm->zone.name); + pr_info("Destroyed dtpm node '%s'\n", dtpm->zone.name); } /** - * dtpm_register - Register a dtpm node in the hierarchy tree + * dtpm_create - Create a dtpm node in the hierarchy tree * @name: a string specifying the name of the node * @dtpm: a pointer to a dtpm structure corresponding to the new node * @parent: a pointer to a dtpm structure corresponding to the parent node * * Create a dtpm node in the tree. If no parent is specified, the node * is the root node of the hierarchy. If the root node already exists, - * then the registration will fail. The powercap controller must be + * then the creation will fail. The powercap controller must be * initialized before calling this function. * * The dtpm structure must be initialized with the power numbers @@ -413,7 +553,7 @@ void dtpm_unregister(struct dtpm *dtpm) * * parent have ops which are reserved for leaves * Other negative values are reported back from the powercap framework */ -int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent) +int dtpm_create(const char *name, struct dtpm *dtpm, struct dtpm *parent) { struct powercap_zone *pcz; @@ -457,7 +597,7 @@ int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent) if (dtpm->ops && !dtpm->ops->upt_power_uw(dtpm)) __dtpm_add_power(dtpm); - pr_info("Registered dtpm node '%s' / %llu-%llu uW, \n", + pr_info("Created dtpm node '%s' / %llu-%llu uW, \n", dtpm->zone.name, dtpm->power_min, dtpm->power_max); mutex_unlock(&dtpm_lock); diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c index aff79c649345..1a10537c4434 100644 --- a/drivers/powercap/dtpm_cpu.c +++ b/drivers/powercap/dtpm_cpu.c @@ -180,7 +180,7 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) sprintf(name, "cpu%d-cpufreq", dtpm_cpu->cpu); - ret = dtpm_register(name, dtpm, NULL); + ret = dtpm_register(name, dtpm); if (ret) goto out_kfree_dtpm_cpu; @@ -193,7 +193,7 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) return 0; out_dtpm_unregister: - dtpm_unregister(dtpm); + dtpm_unregister(name); dtpm_cpu = NULL; dtpm = NULL; diff --git a/include/linux/dtpm.h b/include/linux/dtpm.h index d29be6a0e513..447ea6c60b59 100644 --- a/include/linux/dtpm.h +++ b/include/linux/dtpm.h @@ -14,6 +14,7 @@ struct dtpm { struct powercap_zone zone; + struct kref kref; struct dtpm *parent; struct list_head sibling; struct list_head children; @@ -69,10 +70,17 @@ int dtpm_release_zone(struct powercap_zone *pcz); struct dtpm *dtpm_alloc(struct dtpm_ops *ops); -void dtpm_unregister(struct dtpm *dtpm); +void dtpm_destroy(struct dtpm *dtpm); -int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent); +int dtpm_create(const char *name, struct dtpm *dtpm, struct dtpm *parent); int dtpm_register_cpu(struct dtpm *parent); +int dtpm_register(const char *name, struct dtpm *dtpm); + +void dtpm_unregister(const char *name); + +struct dtpm *dtpm_get(const char *name); + +void dtpm_put(struct dtpm *dtpm); #endif From patchwork Mon Mar 1 21:21:47 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 388756 Delivered-To: patch@linaro.org Received: by 2002:a02:290e:0:0:0:0:0 with SMTP id p14csp3708012jap; Mon, 1 Mar 2021 13:30:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJwsuri+H8XmgeoHRDS8n9u39CEN/bfQYFb5l/I7k+Q8dNdzdObcxiRnywFvYrzyRG7hvBC5 X-Received: by 2002:a17:906:d153:: with SMTP id br19mr10103744ejb.360.1614634222789; Mon, 01 Mar 2021 13:30:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614634222; cv=none; d=google.com; s=arc-20160816; b=l6iJ/Bzz245x2Y/jdUAkmxVmq8/tSeKB/C/sxJOsCq0Na4ttzA7y6aJg3Hj6p4ZEEY EMYaIxyfnqa67txI8bws4hozfV+eyROTfOXDKN2a95vX/GoB9YpaT+kKdwVVEQYnGihj hnbWotNYDsz5+vdZ2TO9pvSceF2Q3PnLudsgh7mSMEJILrJ0OH9Ui9OeoI/dHu0Z4vT4 yTQ5OAgeOqow0d1JWmoyNlbWZ+Y1wIDqFGKP4ebfn7RPwJxno5Zqky6vzimvEdENKRbz rYJdqi6BRksQFYKntdAq5xgoimb3gTs4+syg9rF1l0LW3olddEvTqmPDa9AElaFMDcSU Z4AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=tdxUTGi9m/Gz5i3ZHWaGA+tNFidX5BqMkBrNPYV1F7w=; b=vwGJDtsn1uTnQ3HX1ajRkIQEo91eKcF5q36OPj9pDkgcSxdVoFlZhFBjQHl1Sani6G nL2J7CJHXR276pWbZ2BIEuoyPEAVN1ZnaDSETM3t+keq2VGZfkHjQOC/RCxWNWt5n2BE dzEPHXFBw4RTP/Hlqai40v2qoWKzrplp35NifMMpzFfE6JVB5L6JEUlVsbFU5Xg0Ixfy C9PfKnJ0bx2gXHnd/RVTTQs9m6qQUnBMT2z/ATFjlmE1BF/W1uy3C8dKFsItBOxgrwDf rvtyr2Daz8e8+aq7rJyT2txyJ31D/VRVE95t9WWVIooJ6oNGh4VeNOn5GnQ65Hhi4alL D91g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KM2Hsdgm; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hr14si3825272ejc.394.2021.03.01.13.30.22; Mon, 01 Mar 2021 13:30:22 -0800 (PST) Received-SPF: pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=KM2Hsdgm; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240491AbhCAV3I (ORCPT + 7 others); Mon, 1 Mar 2021 16:29:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43508 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244234AbhCAVXq (ORCPT ); Mon, 1 Mar 2021 16:23:46 -0500 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64A91C061793 for ; Mon, 1 Mar 2021 13:23:06 -0800 (PST) Received: by mail-wr1-x42c.google.com with SMTP id a18so9463125wrc.13 for ; Mon, 01 Mar 2021 13:23:06 -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; bh=tdxUTGi9m/Gz5i3ZHWaGA+tNFidX5BqMkBrNPYV1F7w=; b=KM2HsdgmAOVLJ1XnyzbihJMlr8Fmo8S4dS1XE40nyf802ZCVjhThMwBuViSrCwPEYp W1HPDn+yN4tm3QqxdFwb6ItVi5mCFxFV9T9pMbc3s5ZfHRfCSDJTLq22lWPaE84n9Y5D MM+b0sy+zysJy7LMXUJQAThlED5fZM2zBWM9+Tokh1Dl1wi9/dFIN1EKEyB9IB4ZFiiC Nssx+OFx2DmKMgpvA4V269Srznwf6tzHDNmZ4gR9YQkb3fVwS8IhGvYJMkwHTCbKKznO J7YZX/Qk2OYQzim7Xjau1V6mnXnwVV+omdsa3narIoOl/YFuDq97NCm6gm2p97oWBe72 ZhTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tdxUTGi9m/Gz5i3ZHWaGA+tNFidX5BqMkBrNPYV1F7w=; b=NY2QombJvMw7hcgyiGmIeaz1APNHvLF+kWH3cFg1ekAWddG9QZn3URnIppBLCxZzOR 7kqRs7NmYR4wxmtmmMk8YiMPU6hlZ/upQhk+7dG8osb8NND6FyYCTMAb0BCqA6aPxca1 lis86vUiquxJ6klRzGiFhIbEG3EnAFJkK27h2FXU4ptJvC8x0gC20SIWRpzf7p937foX P+/6wOm18sATQyaQ8v8AdMqRGl+keAHUdPMShWeY7sM91SHUymnQzDlfrXG+rZ4pBOkZ U6S9ZGJmaNOHqLKyJedYRGhjg1xe1f+eHLvnFRS/ne2pJab/1eELEvdFm0zwA9xy4VeT rRqA== X-Gm-Message-State: AOAM532NiJg9WFQHd2lkjuOJIKda7lZV38DczvYiP2lh/v6KcK/3LQfs KERvC6sfJuxgzDl2ezuEb41leQ== X-Received: by 2002:a5d:570b:: with SMTP id a11mr18660666wrv.281.1614633785103; Mon, 01 Mar 2021 13:23:05 -0800 (PST) Received: from localhost.localdomain (lns-bzn-59-82-252-144-192.adsl.proxad.net. [82.252.144.192]) by smtp.gmail.com with ESMTPSA id o11sm6783866wrq.74.2021.03.01.13.23.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 13:23:04 -0800 (PST) From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH 3/5] powercap/drivers/dtpm: Simplify the dtpm table Date: Mon, 1 Mar 2021 22:21:47 +0100 Message-Id: <20210301212149.22877-3-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301212149.22877-1-daniel.lezcano@linaro.org> References: <20210301212149.22877-1-daniel.lezcano@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The dtpm table is an array of pointers, that forces the user of the table to define initdata along with the declaration of the table entry. It is more efficient to create an array of dtpm structure, so the declaration of the table entry can be done by initializing the different fields. Signed-off-by: Daniel Lezcano --- drivers/powercap/dtpm.c | 4 ++-- drivers/powercap/dtpm_cpu.c | 4 +++- include/linux/dtpm.h | 22 +++++++++------------- 3 files changed, 14 insertions(+), 16 deletions(-) -- 2.17.1 Reviewed-by: Lukasz Luba diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c index 20728a28ff0d..a1a70dc48f63 100644 --- a/drivers/powercap/dtpm.c +++ b/drivers/powercap/dtpm.c @@ -607,7 +607,7 @@ int dtpm_create(const char *name, struct dtpm *dtpm, struct dtpm *parent) static int __init dtpm_init(void) { - struct dtpm_descr **dtpm_descr; + struct dtpm_descr *dtpm_descr; pct = powercap_register_control_type(NULL, "dtpm", NULL); if (IS_ERR(pct)) { @@ -616,7 +616,7 @@ static int __init dtpm_init(void) } for_each_dtpm_table(dtpm_descr) - (*dtpm_descr)->init(*dtpm_descr); + dtpm_descr->init(); return 0; } diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c index 1a10537c4434..c5fe98eeec52 100644 --- a/drivers/powercap/dtpm_cpu.c +++ b/drivers/powercap/dtpm_cpu.c @@ -207,7 +207,7 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) return ret; } -int dtpm_register_cpu(struct dtpm *parent) +static int __init dtpm_cpu_init(void) { int ret; @@ -223,3 +223,5 @@ int dtpm_register_cpu(struct dtpm *parent) return 0; } + +DTPM_DECLARE(dtpm_cpu, dtpm_cpu_init); diff --git a/include/linux/dtpm.h b/include/linux/dtpm.h index 447ea6c60b59..8a2dbbc334b9 100644 --- a/include/linux/dtpm.h +++ b/include/linux/dtpm.h @@ -34,25 +34,23 @@ struct dtpm_ops { void (*release)(struct dtpm *); }; -struct dtpm_descr; - -typedef int (*dtpm_init_t)(struct dtpm_descr *); +typedef int (*dtpm_init_t)(void); struct dtpm_descr { - struct dtpm *parent; - const char *name; dtpm_init_t init; }; /* Init section thermal table */ -extern struct dtpm_descr *__dtpm_table[]; -extern struct dtpm_descr *__dtpm_table_end[]; +extern struct dtpm_descr __dtpm_table[]; +extern struct dtpm_descr __dtpm_table_end[]; -#define DTPM_TABLE_ENTRY(name) \ - static typeof(name) *__dtpm_table_entry_##name \ - __used __section("__dtpm_table") = &name +#define DTPM_TABLE_ENTRY(name, __init) \ + static struct dtpm_descr __dtpm_table_entry_##name \ + __used __section("__dtpm_table") = { \ + .init = __init, \ + } -#define DTPM_DECLARE(name) DTPM_TABLE_ENTRY(name) +#define DTPM_DECLARE(name, init) DTPM_TABLE_ENTRY(name, init) #define for_each_dtpm_table(__dtpm) \ for (__dtpm = __dtpm_table; \ @@ -74,8 +72,6 @@ void dtpm_destroy(struct dtpm *dtpm); int dtpm_create(const char *name, struct dtpm *dtpm, struct dtpm *parent); -int dtpm_register_cpu(struct dtpm *parent); - int dtpm_register(const char *name, struct dtpm *dtpm); void dtpm_unregister(const char *name); From patchwork Mon Mar 1 21:21:48 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 388758 Delivered-To: patch@linaro.org Received: by 2002:a02:290e:0:0:0:0:0 with SMTP id p14csp3708025jap; Mon, 1 Mar 2021 13:30:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJz5TvjCNwzWS/KcMI7fffpItsEfgX3UPi3WY3DfVKE//RMXp1nDEhRo0F4SZf0YwtWWkt59 X-Received: by 2002:a17:906:600f:: with SMTP id o15mr18162808ejj.76.1614634223573; Mon, 01 Mar 2021 13:30:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614634223; cv=none; d=google.com; s=arc-20160816; b=L+AUmj2OLsK019ucG8HkO5sjyWIY9HO0Age2lKuktRZhE2aEueGt/cRMIEFanTzTxQ ja2ZIg9dgVqOIidJUEmPlDR7x0Bh3HFXC/OX0Ozo06kj4dG1kHRtYX5RCzNuIfrBNrtw +vuzk1zd8DQ4ZHEY/Ic2K01vCM9AoisNVIT2FAokgjQAx0NrlbPmIliVDgZCVtocTHYF u07AlUF0AHpKdrPm3PIRq9i/BIxk7817A1MW4GDArXTBkNgba2YL/31QYhEngjPUpmDZ DaMfwe/k4AAW0NOgryEGHKD7G7G3lyM4+tHLCk+i4zYL+qlmB1M1Q/x2JYlwMMpw6sjn Vamg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=sdnHaT3I7vtPWrLDYXle+T3/u+KhICKSoOfF0Pa49SM=; b=ezRU3SLE8SYNiALQLLuZxMEbEzEiMNTrwC9GIn542tjD7MKPOn9pcnU9aboWnQMiW1 JS2TFVy/DKJwIoB6ianoRWDfyfW95gjgqqCR6/Xl1g1aCUE7JRtsSnxJpauCTaAtrOUo TEJxjOXf4dU3K6m3St6BvTroRA2qqHGeO3RiG/ddL2YchXfGheVmmnaF2x3nl3OeFW7z 1pHItZzgtT9odOtIDFHX2nNApg45s/wXweRNuNNVblV50xRhC/e2Ad6EoMRraCPN3xPE /Lw9WrVi3cmTPni3TfJ7et7V+yfUHiNouaNg1GcYRm5acQwmgLSUUuUsW3iO9r36gXnA j8eQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=tMEqfybU; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hr14si3825272ejc.394.2021.03.01.13.30.23; Mon, 01 Mar 2021 13:30:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=tMEqfybU; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241255AbhCAV30 (ORCPT + 7 others); Mon, 1 Mar 2021 16:29:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242918AbhCAV0f (ORCPT ); Mon, 1 Mar 2021 16:26:35 -0500 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4A00C061797 for ; Mon, 1 Mar 2021 13:23:07 -0800 (PST) Received: by mail-wr1-x42b.google.com with SMTP id v15so17683307wrx.4 for ; Mon, 01 Mar 2021 13:23:07 -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; bh=sdnHaT3I7vtPWrLDYXle+T3/u+KhICKSoOfF0Pa49SM=; b=tMEqfybU8jcTMuQYqHi/FVJEJEFJa1aXyPm5didxskFKVcEYE4qZ9dE+2LQzs2CN+f QNgpvyX3h4+MgI7hJ0rgtzYMSFxAG1XE4rm06kO2bV9gU2fZigBBzoBekyjb6sj9Fekk LIQCD7DvB3r9S+dqlYwsIoLlThvT+ei0bAiU8qh7A22SYWgGYHloITKtOLD3XC+lwsX7 uQWo2KYJeRfJ17QkAy1SNJylRjLAJYgsMMRs97W+06m7mNDuCwCW7Tvhygcfo0CI/h90 nht35jgrdiCP5/u90x71YJl2eH+XDeKU0fEhvRQmcDsQHg/FHZ3kXSaulAjAyRBf+EdW Euaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sdnHaT3I7vtPWrLDYXle+T3/u+KhICKSoOfF0Pa49SM=; b=cmHs7P7hLNCrcS33rStgqfz33gsovmgEOO28Vjm9rS+YE2XXnk/u5DMNvSz8jnKVuR TmmrQfYqh2yeaBcYEBVvsjVrdToRLK6PZFO1zRZGdKUJX2fsH8Vu/sEDc40BH6oSvYdJ GsvvYKxP/qSRDKkc0COpoi7LT2DWgIZq/nsIygNwW62Af2k9EW31g6c8eq0Ca2mlF1Dd EpRna1mODjxzfzdeYefxDzLScGbYnUiWLdEELZyWT+jzkWB2X1fejqFHSB0nUqeynheP ZPZ0mPtch9cRgeAtvTPrSJtoagILwrpkhwaw9xs41vUG4PdIHYtLDKRW7wtnohdwxGQE HVzQ== X-Gm-Message-State: AOAM533orcHX1Bw0QGXLSfN1O4dnA4PuqU8qy52gUqD5wJtAu1LrHVzu 0x6dxSaXDUj73RQqqZcgahmuhQ== X-Received: by 2002:a5d:4445:: with SMTP id x5mr17155686wrr.30.1614633786486; Mon, 01 Mar 2021 13:23:06 -0800 (PST) Received: from localhost.localdomain (lns-bzn-59-82-252-144-192.adsl.proxad.net. [82.252.144.192]) by smtp.gmail.com with ESMTPSA id o11sm6783866wrq.74.2021.03.01.13.23.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 13:23:06 -0800 (PST) From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH 4/5] powercap/drivers/dtpm: Use container_of instead of a private data field Date: Mon, 1 Mar 2021 22:21:48 +0100 Message-Id: <20210301212149.22877-4-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301212149.22877-1-daniel.lezcano@linaro.org> References: <20210301212149.22877-1-daniel.lezcano@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org The dtpm framework provides an API to allocate a dtpm node. However when a backend dtpm driver needs to allocate a dtpm node it must define its own structure and store the pointer of this structure in the private field of the dtpm structure. It is more elegant to use the container_of macro and add the dtpm structure inside the dtpm backend specific structure. The code will be able to deal properly with the dtpm structure as a generic entity, making all this even more self-encapsulated. The dtpm_alloc() function does no longer make sense as the dtpm structure will be allocated when allocating the device specific dtpm structure. The dtpm_init() is provided instead. Signed-off-by: Daniel Lezcano --- drivers/powercap/dtpm.c | 27 ++++++++++------------ drivers/powercap/dtpm_cpu.c | 46 ++++++++++++++++++------------------- include/linux/dtpm.h | 3 +-- 3 files changed, 35 insertions(+), 41 deletions(-) -- 2.17.1 Reviewed-by: Lukasz Luba diff --git a/drivers/powercap/dtpm.c b/drivers/powercap/dtpm.c index a1a70dc48f63..40157e720263 100644 --- a/drivers/powercap/dtpm.c +++ b/drivers/powercap/dtpm.c @@ -191,10 +191,13 @@ struct dtpm *dtpm_get(const char *name) mutex_lock(&dtpm_lock); dtpm = __dtpm_lookup(name); - if (!dtpm) - dtpm = dtpm_alloc(NULL); - else + if (!dtpm) { + dtpm = kzalloc(sizeof(*dtpm), GFP_KERNEL); + if (dtpm) + dtpm_init(dtpm, NULL); + } else { kref_get(&dtpm->kref); + } mutex_unlock(&dtpm_lock); return dtpm; @@ -495,16 +498,12 @@ static struct powercap_zone_ops zone_ops = { }; /** - * dtpm_alloc - Allocate and initialize a dtpm struct - * @name: a string specifying the name of the node - * - * Return: a struct dtpm pointer, NULL in case of error + * dtpm_init - Allocate and initialize a dtpm struct + * @dtpm: The dtpm struct pointer to be initialized + * @ops: The dtpm device specific ops, NULL for a virtual node */ -struct dtpm *dtpm_alloc(struct dtpm_ops *ops) +void dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops) { - struct dtpm *dtpm; - - dtpm = kzalloc(sizeof(*dtpm), GFP_KERNEL); if (dtpm) { INIT_LIST_HEAD(&dtpm->children); INIT_LIST_HEAD(&dtpm->sibling); @@ -512,8 +511,6 @@ struct dtpm *dtpm_alloc(struct dtpm_ops *ops) dtpm->weight = 1024; dtpm->ops = ops; } - - return dtpm; } /** @@ -605,7 +602,7 @@ int dtpm_create(const char *name, struct dtpm *dtpm, struct dtpm *parent) return 0; } -static int __init dtpm_init(void) +static int __init init_dtpm(void) { struct dtpm_descr *dtpm_descr; @@ -620,4 +617,4 @@ static int __init dtpm_init(void) return 0; } -late_initcall(dtpm_init); +late_initcall(init_dtpm); diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c index c5fe98eeec52..e728ebd6d0ca 100644 --- a/drivers/powercap/dtpm_cpu.c +++ b/drivers/powercap/dtpm_cpu.c @@ -25,16 +25,22 @@ #include #include -static DEFINE_PER_CPU(struct dtpm *, dtpm_per_cpu); - struct dtpm_cpu { + struct dtpm dtpm; struct freq_qos_request qos_req; int cpu; }; +static DEFINE_PER_CPU(struct dtpm_cpu *, dtpm_per_cpu); + +static struct dtpm_cpu *to_dtpm_cpu(struct dtpm *dtpm) +{ + return container_of(dtpm, struct dtpm_cpu, dtpm); +} + static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit) { - struct dtpm_cpu *dtpm_cpu = dtpm->private; + struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm); struct em_perf_domain *pd = em_cpu_get(dtpm_cpu->cpu); struct cpumask cpus; unsigned long freq; @@ -64,7 +70,7 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit) static u64 get_pd_power_uw(struct dtpm *dtpm) { - struct dtpm_cpu *dtpm_cpu = dtpm->private; + struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm); struct em_perf_domain *pd; struct cpumask cpus; unsigned long freq; @@ -90,7 +96,7 @@ static u64 get_pd_power_uw(struct dtpm *dtpm) static int upt_pd_power_uw(struct dtpm *dtpm) { - struct dtpm_cpu *dtpm_cpu = dtpm->private; + struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm); struct em_perf_domain *em = em_cpu_get(dtpm_cpu->cpu); struct cpumask cpus; int nr_cpus; @@ -111,7 +117,7 @@ static int upt_pd_power_uw(struct dtpm *dtpm) static void pd_release(struct dtpm *dtpm) { - struct dtpm_cpu *dtpm_cpu = dtpm->private; + struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm); if (freq_qos_request_active(&dtpm_cpu->qos_req)) freq_qos_remove_request(&dtpm_cpu->qos_req); @@ -130,7 +136,7 @@ static int cpuhp_dtpm_cpu_offline(unsigned int cpu) { struct cpumask cpus; struct em_perf_domain *pd; - struct dtpm *dtpm; + struct dtpm_cpu *dtpm_cpu; pd = em_cpu_get(cpu); if (!pd) @@ -138,14 +144,13 @@ static int cpuhp_dtpm_cpu_offline(unsigned int cpu) cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus)); - dtpm = per_cpu(dtpm_per_cpu, cpu); + dtpm_cpu = per_cpu(dtpm_per_cpu, cpu); - return dtpm_update_power(dtpm); + return dtpm_update_power(&dtpm_cpu->dtpm); } static int cpuhp_dtpm_cpu_online(unsigned int cpu) { - struct dtpm *dtpm; struct dtpm_cpu *dtpm_cpu; struct cpufreq_policy *policy; struct em_perf_domain *pd; @@ -160,27 +165,23 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) if (!pd) return -EINVAL; - dtpm = per_cpu(dtpm_per_cpu, cpu); - if (dtpm) - return dtpm_update_power(dtpm); - - dtpm = dtpm_alloc(&dtpm_ops); - if (!dtpm) - return -EINVAL; + dtpm_cpu = per_cpu(dtpm_per_cpu, cpu); + if (dtpm_cpu) + return dtpm_update_power(&dtpm_cpu->dtpm); dtpm_cpu = kzalloc(sizeof(*dtpm_cpu), GFP_KERNEL); if (!dtpm_cpu) - goto out_kfree_dtpm; + return -ENOMEM; - dtpm->private = dtpm_cpu; + dtpm_init(&dtpm_cpu->dtpm, &dtpm_ops); dtpm_cpu->cpu = cpu; for_each_cpu(cpu, policy->related_cpus) - per_cpu(dtpm_per_cpu, cpu) = dtpm; + per_cpu(dtpm_per_cpu, cpu) = dtpm_cpu; sprintf(name, "cpu%d-cpufreq", dtpm_cpu->cpu); - ret = dtpm_register(name, dtpm); + ret = dtpm_register(name, &dtpm_cpu->dtpm); if (ret) goto out_kfree_dtpm_cpu; @@ -195,15 +196,12 @@ static int cpuhp_dtpm_cpu_online(unsigned int cpu) out_dtpm_unregister: dtpm_unregister(name); dtpm_cpu = NULL; - dtpm = NULL; out_kfree_dtpm_cpu: for_each_cpu(cpu, policy->related_cpus) per_cpu(dtpm_per_cpu, cpu) = NULL; kfree(dtpm_cpu); -out_kfree_dtpm: - kfree(dtpm); return ret; } diff --git a/include/linux/dtpm.h b/include/linux/dtpm.h index 8a2dbbc334b9..bebb1c9a94c7 100644 --- a/include/linux/dtpm.h +++ b/include/linux/dtpm.h @@ -24,7 +24,6 @@ struct dtpm { u64 power_max; u64 power_min; int weight; - void *private; }; struct dtpm_ops { @@ -66,7 +65,7 @@ int dtpm_update_power(struct dtpm *dtpm); int dtpm_release_zone(struct powercap_zone *pcz); -struct dtpm *dtpm_alloc(struct dtpm_ops *ops); +void dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops); void dtpm_destroy(struct dtpm *dtpm); From patchwork Mon Mar 1 21:21:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 388757 Delivered-To: patch@linaro.org Received: by 2002:a02:290e:0:0:0:0:0 with SMTP id p14csp3708019jap; Mon, 1 Mar 2021 13:30:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzUzVIm1KoFZ9wGf+INsXLGSnt4/bSxPMmPRhxOr9FCXJ4dMDakEszsHSvTATc0Ydhv19lt X-Received: by 2002:a50:fe17:: with SMTP id f23mr18717462edt.258.1614634223148; Mon, 01 Mar 2021 13:30:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1614634223; cv=none; d=google.com; s=arc-20160816; b=Th4vNcIKqgifymvkFBziUHg1XfDSKAyA1ifzZQidEw8Fr6uXVNFjJ2+2b+Pxui7ZNc Xs2w4SVteCIf/6Hh5mVXyUel6fJI887QyyMAtvDp1XhPHsENlTPkfXndGc4xOI//vVm1 Zsvohk3SmkaJSCOraBMOVij20YU7jIeNM/08Yxcwt5Q+vSK2ruSNh3cXZ4PWmgpSDGda y0RGVlArj07zcvQRydqsR/oErFxdowrcSSS2IlYtgm8WFS2d75UuJ4OXpXUeIQ723U43 Hx1VR0sqCOltfvc9PK+PXRFpdewHVOqtkpsJtvzyQ4dzg9uY4PnX7yuRAWxZIZwVyzmk 0Kkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=c0ZvIjJHRTziXyViFMvrOdCl+6OVi36JkN8Az258FFk=; b=NtHbzX1jk8p0S04y0Ws/HvunuL5QWz6tc4qFAQG+J++WEAiKx4ui7VJVZaDu1NGNfg BQxstX6rgiFIODLpr4d6zMFmaNPKGd1JrwJLXqHg27ascyX2S3Vg+XgKDNpov9NOwmO/ nvvlIDwUu4MvrqoyUVRiI+0CfDbrzLR0d4A5Jv8VwxxWx/WLcVOOyhjbl3PKjFql0vV9 HudYxytBbyHS6LEVBXpY6vEDT6r5vEfkSnPWHAxo6HxyQWq74TmYQmYDiig9kbb+I4zR upvI3MLZeqjhLkaOGwsiwD84+BBWMYKJoqxebBxVfU7bs1MQIpeI51vYoQNlOIfMwLg7 Zy2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F25vV8Zw; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hr14si3825272ejc.394.2021.03.01.13.30.22; Mon, 01 Mar 2021 13:30:23 -0800 (PST) Received-SPF: pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=F25vV8Zw; spf=pass (google.com: domain of linux-pm-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-pm-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240737AbhCAV3T (ORCPT + 7 others); Mon, 1 Mar 2021 16:29:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241578AbhCAV0f (ORCPT ); Mon, 1 Mar 2021 16:26:35 -0500 Received: from mail-wm1-x330.google.com (mail-wm1-x330.google.com [IPv6:2a00:1450:4864:20::330]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 094F3C0617A7 for ; Mon, 1 Mar 2021 13:23:09 -0800 (PST) Received: by mail-wm1-x330.google.com with SMTP id w7so505918wmb.5 for ; Mon, 01 Mar 2021 13:23:08 -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; bh=c0ZvIjJHRTziXyViFMvrOdCl+6OVi36JkN8Az258FFk=; b=F25vV8ZwUlpswV28t5eTxSEqVwfPJQNQVhoJlps0ydBthIHOOzFTJorj0Ur44LRcZk HW16eoSIvgZ63I/rWT4Ff4UEEhg4wBOKXhP3zwKcytejl5hry5G3mgjouDundeg5D1qt bexwYHfW7XO58De9uz2Sw1Dn/ND6S89X0NkBTS95cWfGlWrVvzp1kSbl/CBXdA+vH+aN kymfJm5Hyb3FgLG9RNvPipPBW0IdoQaMuXu0TRf4vKeGfBo8Iy10fCTKOMSTtsoNDhh5 /QVAt3IxSaJBA3K+pMYmQi6eA1vl+wjcckwi4GpOraNUw43Rtpw/jscOxtwl84T5PqO7 VKLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=c0ZvIjJHRTziXyViFMvrOdCl+6OVi36JkN8Az258FFk=; b=M43gmZxkSl7ExvdSZwxAXdA9RC7duqSkxPRj/M+4xkf6YpvaGUqMvyjYd4gnAq5UPM K1vWAUWOh3onY53W2gDHdY55JSbz1N5CQnPh2sxpDNztkPAL+rqQ6DFINPVtuUv1BoMp /OuxHAarakJUJXSXjB1zf75XuzaX+mw3q7eAqmQPFwYAiUO4BIWwpnlwyW2YE1Qz5Tjh e6kN5z8zvOEinmO4s6OGLMeCNjxzx0z35yW9ZfwhP/WY2buBgHgPTtd6+x6dHOfEE+av 2RdrdV0xhDZbtYMAcq662wR46TbjFkHrOyMWl7ehAkrSirfQyPbDtgFcrvuHy9soQioQ +FdA== X-Gm-Message-State: AOAM532es5Q78bAj4z0yytYOdmILvWFKJUzb5H0HWM4nh2PRI4H4muvm pxMf8Kw2L6FlBw62Yxa8Vkxvvw== X-Received: by 2002:a7b:cf16:: with SMTP id l22mr759803wmg.26.1614633787709; Mon, 01 Mar 2021 13:23:07 -0800 (PST) Received: from localhost.localdomain (lns-bzn-59-82-252-144-192.adsl.proxad.net. [82.252.144.192]) by smtp.gmail.com with ESMTPSA id o11sm6783866wrq.74.2021.03.01.13.23.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Mar 2021 13:23:07 -0800 (PST) From: Daniel Lezcano To: daniel.lezcano@linaro.org, rafael@kernel.org Cc: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH 5/5] powercap/drivers/dtpm: Scale the power with the load Date: Mon, 1 Mar 2021 22:21:49 +0100 Message-Id: <20210301212149.22877-5-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210301212149.22877-1-daniel.lezcano@linaro.org> References: <20210301212149.22877-1-daniel.lezcano@linaro.org> Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org Currently the power consumption is based on the current OPP power assuming the entire performance domain is fully loaded. That gives very gross power estimation and we can do much better by using the load to scale the power consumption. Use the utilization to normalize and scale the power usage over the max possible power. Tested on a rock960 with 2 big CPUS, the power consumption estimation conforms with the expected one. Before this change: ~$ ~/dhrystone -t 1 -l 10000& ~$ cat /sys/devices/virtual/powercap/dtpm/dtpm:0/dtpm:0:1/constraint_0_max_power_uw 2260000 After this change: ~$ ~/dhrystone -t 1 -l 10000& ~$ cat /sys/devices/virtual/powercap/dtpm/dtpm:0/dtpm:0:1/constraint_0_max_power_uw 1130000 ~$ ~/dhrystone -t 2 -l 10000& ~$ cat /sys/devices/virtual/powercap/dtpm/dtpm:0/dtpm:0:1/constraint_0_max_power_uw 2260000 Signed-off-by: Daniel Lezcano --- drivers/powercap/dtpm_cpu.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) -- 2.17.1 diff --git a/drivers/powercap/dtpm_cpu.c b/drivers/powercap/dtpm_cpu.c index e728ebd6d0ca..8379b96468ef 100644 --- a/drivers/powercap/dtpm_cpu.c +++ b/drivers/powercap/dtpm_cpu.c @@ -68,27 +68,40 @@ static u64 set_pd_power_limit(struct dtpm *dtpm, u64 power_limit) return power_limit; } +static u64 scale_pd_power_uw(struct cpumask *cpus, u64 power) +{ + unsigned long max, util; + int cpu, load = 0; + + for_each_cpu(cpu, cpus) { + max = arch_scale_cpu_capacity(cpu); + util = sched_cpu_util(cpu, max); + load += ((util * 100) / max); + } + + return (power * load) / 100; +} + static u64 get_pd_power_uw(struct dtpm *dtpm) { struct dtpm_cpu *dtpm_cpu = to_dtpm_cpu(dtpm); struct em_perf_domain *pd; struct cpumask cpus; unsigned long freq; - int i, nr_cpus; + int i; pd = em_cpu_get(dtpm_cpu->cpu); freq = cpufreq_quick_get(dtpm_cpu->cpu); cpumask_and(&cpus, cpu_online_mask, to_cpumask(pd->cpus)); - nr_cpus = cpumask_weight(&cpus); for (i = 0; i < pd->nr_perf_states; i++) { if (pd->table[i].frequency < freq) continue; - return pd->table[i].power * - MICROWATT_PER_MILLIWATT * nr_cpus; + return scale_pd_power_uw(&cpus, pd->table[i].power * + MICROWATT_PER_MILLIWATT); } return 0;