Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp163587rwo; Fri, 21 Jul 2023 09:57:19 -0700 (PDT) X-Google-Smtp-Source: APBJJlG/hVq16AC3WDzWE4y17NICJu1JENUBNzLc/5ZkQF4qHVOh3mBB7slW7N3EXFM0n8JbX1Q+ X-Received: by 2002:a17:906:768f:b0:993:d8a2:385 with SMTP id o15-20020a170906768f00b00993d8a20385mr2222469ejm.22.1689958639581; Fri, 21 Jul 2023 09:57:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689958639; cv=none; d=google.com; s=arc-20160816; b=H6GTp51JT6LfAQN9jCI1GMgYMrFd8gbZsblsMzvamfuCFRwN8tKl9aErrZ8o1fSTRa VaO8N318GcnY+WsH3xFSGy2iO8gGbJKFS7559VoqrmpfS0d0aEoLh/JFy6M+OH7BzWAm Jn0sUk3g4DTFiG44EAEdFFBtOs0tLqxiapFuqZ0sCVG/qVNA9wpk0gM2SSwvTAF92yR5 28SBXqgtMYUoZF5KHI9dwMNP+Qq+Am0z6bkIjcu5MBbwQ03c7fX4J8TjT2P7J4HlfsgE CNc95uK9qOgmFD+si57NWqxoO1/0Ue+kkWxOuE+tlcg97gl7gW1diawfXGyy8HBJe6nM Lyqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=HYfalbfp7IhGPFcXM+1U/4cV6tes22NXZEjV6EK0MWU=; fh=X59gKo2bTEq2VHcwIFizOsXoeGl1m0HuKLr4L9qvQjg=; b=e3nFXq4mcXzsvZYsH//TIg63lHZPj/jyByIJQk/fPEcunB+66SrlizlqpwwOSBxUvV sb5oT22s3GBWugIEg5dIdR6+AJCQDOKuO0om8ZCAE4uTTlrxPhvElTjjoSyUlA502qDR orL6+7+MRzn7+LCEc4THy0vsxZU/oxXyvEMugF2e14lQw3dBALN9H6zRdY1DDHm4IJ7v jRNxJpRMM/Q6aCBIig1cXo2XL5BmVKfMhQS+TXiQvko20V71aVV1y2NUmHDfbA9ENhVz UuwdEUQPg+MiHa9WpTeTR8ZR7rL/HazVFsYtyS2HwdEfDZXHDBTMXZMxHzOfVkj/a1/J kypA== 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 Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k13-20020a170906680d00b009888e599645si2409189ejr.771.2023.07.21.09.56.54; Fri, 21 Jul 2023 09:57:19 -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 S232359AbjGUPvE (ORCPT + 99 others); Fri, 21 Jul 2023 11:51:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50978 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231775AbjGUPut (ORCPT ); Fri, 21 Jul 2023 11:50:49 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 557683C35; Fri, 21 Jul 2023 08:50:28 -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 2998014BF; Fri, 21 Jul 2023 08:51:11 -0700 (PDT) Received: from e129166.arm.com (unknown [10.57.0.79]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 011F43F738; Fri, 21 Jul 2023 08:50:24 -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, mhiramat@kernel.org Subject: [PATCH v3 09/12] PM: EM: Add RCU mechanism which safely cleans the old data Date: Fri, 21 Jul 2023 16:50:19 +0100 Message-Id: <20230721155022.2339982-10-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230721155022.2339982-1-lukasz.luba@arm.com> References: <20230721155022.2339982-1-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE 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 The EM is going to support runtime modifications of the power data. Introduce 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 | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index c2f8a0046f8a..4596bfe7398e 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c @@ -23,6 +23,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); @@ -104,6 +107,45 @@ 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); + + /* + * Check if the 'state' array is not actually the one from setup. + * If it is then don't free it. + */ + if (tmp->state == pd->default_table->state) + 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) -- 2.25.1