From patchwork Tue Mar 14 10:33:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 69487 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp1679062wrd; Tue, 14 Mar 2023 03:40:06 -0700 (PDT) X-Google-Smtp-Source: AK7set+/fhvjBKEhvuzpqGX90s4riN2V8PVTQuvahFbKgq6+Z0IKY60w9B6mfNdb/kz3m8eOTcWq X-Received: by 2002:a05:6a21:6da0:b0:d4:ca6d:2ac2 with SMTP id wl32-20020a056a216da000b000d4ca6d2ac2mr4604541pzb.42.1678790405820; Tue, 14 Mar 2023 03:40:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1678790405; cv=none; d=google.com; s=arc-20160816; b=APOGBVwRU85nWGgyNGntamiOIzwHIRdHrA8aG/flGv6BZjOZ1Gn4EAIfmX4fWt9J/h 1/LXN7TIQX6R1EOO5xynbkDz93LONpKHLaKe4ab+zFkUMPF8H5mdSSNjbrPI0fMfMyc3 UHc9arGtet4PLRTE5yC8ArLD4NczAfDvFvk29QfDI6Cy0yBCGwDnvr1bRfqHwYNDWxcJ QEqIUViO/Q/N1u7AbaFTjpJPNaC2RxSEK8ghyR+9j7zFR0z2iNTmL2GTK44wnECc6Pmg 6Xf2B//43cNB+cPXdEQuCxqcpP+E8zhScrx0YVlNs3sFqA0KP8SbPjC8I0EX/gwSoGeg eW/w== 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; bh=Ct/TM6a5VqLH/WjTWEt35LsDWNcDPvbaS4qvscpoeu8=; b=wj6xAunSOwQZ49q9pXss6sgg2xwJaViiii58UkkM9FycXpSTxRIqjVGWipzAdlZp12 NF9gYMZWDpRXX4322uso99YKGr9jVCCG//qBea0XXYzxIO835R6xngo/Q2f0ZG2+Rn5O 7onxwthQPkvOrJPvHHjoh7HmVNymnzjpFEoIm/4g6I+unLCKIo8O1syf7uQoJf5VF+JA 8MRi0C6EZaZ+7ZNueLU05/CKGnQQ81eCIRA6SxgzfMkQCF7fgkQEpRNitFL1JqcqAgDt TdszCOtaUxWrD90ZN/HQgrDMn1Gf5SlJgbGoenYCt+8lnO6R+54N1dR33wwEp8pcAO11 hJNw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a5-20020aa794a5000000b005939fff6d47si1839883pfl.326.2023.03.14.03.39.53; Tue, 14 Mar 2023 03:40:05 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230451AbjCNKg2 (ORCPT + 99 others); Tue, 14 Mar 2023 06:36:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54520 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231254AbjCNKgH (ORCPT ); Tue, 14 Mar 2023 06:36:07 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 4AD0B85B2D; Tue, 14 Mar 2023 03:35:19 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9243316F2; Tue, 14 Mar 2023 03:35:25 -0700 (PDT) Received: from e123648.arm.com (unknown [10.57.19.101]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1B8A23F71A; Tue, 14 Mar 2023 03:34:38 -0700 (PDT) From: Lukasz Luba To: linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, rafael@kernel.org Cc: lukasz.luba@arm.com, dietmar.eggemann@arm.com, rui.zhang@intel.com, amit.kucheria@verdurent.com, amit.kachhap@gmail.com, daniel.lezcano@linaro.org, viresh.kumar@linaro.org, len.brown@intel.com, pavel@ucw.cz, Pierre.Gondois@arm.com, ionela.voinescu@arm.com, rostedt@goodmis.org, mhiramat@kernel.org Subject: [PATCH 09/17] PM: EM: Add RCU mechanism which safely cleans the old data Date: Tue, 14 Mar 2023 10:33:49 +0000 Message-Id: <20230314103357.26010-10-lukasz.luba@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20230314103357.26010-1-lukasz.luba@arm.com> References: <20230314103357.26010-1-lukasz.luba@arm.com> X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760339328481884473?= X-GMAIL-MSGID: =?utf-8?q?1760339328481884473?= The EM is going to support runtime modifications of the power data. In order to achieve that prepare the internal mechanism. This patch introduces RCU safe mechanism to clean up the old allocated EM data. It also adds a mutex for the EM structure to serialize the modifiers. Signed-off-by: Lukasz Luba --- kernel/power/energy_model.c | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index 500b9cf26ba8..87962b877376 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c @@ -26,6 +26,9 @@ */ static DEFINE_MUTEX(em_pd_mutex); +static void em_cpufreq_update_efficiencies(struct device *dev, + struct em_perf_state *table); + static bool _is_cpu_device(struct device *dev) { return (dev->bus == &cpu_subsys); @@ -109,6 +112,60 @@ static void em_debug_create_pd(struct device *dev) {} static void em_debug_remove_pd(struct device *dev) {} #endif +static void em_destroy_rt_table_rcu(struct rcu_head *rp) +{ + struct em_perf_table *runtime_table; + + runtime_table = container_of(rp, struct em_perf_table, rcu); + kfree(runtime_table->state); + kfree(runtime_table); +} + +static void em_destroy_tmp_setup_rcu(struct rcu_head *rp) +{ + struct em_perf_table *runtime_table; + + runtime_table = container_of(rp, struct em_perf_table, rcu); + kfree(runtime_table); +} + +static void em_perf_runtime_table_set(struct device *dev, + struct em_perf_table *runtime_table) +{ + struct em_perf_domain *pd = dev->em_pd; + struct em_perf_table *tmp; + + tmp = pd->runtime_table; + + rcu_assign_pointer(pd->runtime_table, runtime_table); + + em_cpufreq_update_efficiencies(dev, runtime_table->state); + + if (trace_em_perf_state_enabled()) { + unsigned long freq, power, cost, flags; + int i; + + for (i = 0; i < pd->nr_perf_states; i++) { + freq = runtime_table->state[i].frequency; + power = runtime_table->state[i].power; + cost = runtime_table->state[i].cost; + flags = runtime_table->state[i].flags; + + trace_em_perf_state(dev_name(dev), pd->nr_perf_states, + i, freq, power, cost, flags); + } + } + + /* + * Check if the 'state' array is not actually the one from setup. + * If it is then don't free it. + */ + if (tmp->state == pd->table) + call_rcu(&tmp->rcu, em_destroy_tmp_setup_rcu); + else + call_rcu(&tmp->rcu, em_destroy_rt_table_rcu); +} + static int em_compute_costs(struct device *dev, struct em_perf_state *table, struct em_data_callback *cb, int nr_states, unsigned long flags)