Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp1047580rdh; Mon, 25 Sep 2023 01:16:01 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHVawJW1aTsvVc2Ya/q0D8luypgyFQCgFXjI6vxN2m5HX7Pu5xHrm6vxTdY7/nQunjdQXG1 X-Received: by 2002:a05:6358:4406:b0:143:4fd:6001 with SMTP id z6-20020a056358440600b0014304fd6001mr8676553rwc.21.1695629760774; Mon, 25 Sep 2023 01:16:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695629760; cv=none; d=google.com; s=arc-20160816; b=KhPV61HFfpu2c/Fg76+qhVoJIJiWMeUf/EzR7PCngzwxq8sw72kBuSHAvuMTSGJ1nJ 4pec83pCCLNbxgK/6MhOVPevW9zmKbSQx68QVzoLcgMoH8KJl0d/O9U7CIbm6TdXSUmF CDPn2nDjctvgLa7Sb1nSxVPLbHKYDc2I6ph1Y2//a2fZa8bgCHPH9uVh8dwQV619ZxWW tPfENkDNtlPZWdRIsz9bts6QtM5HpaBtn5iBvqBUz5K3Anzz370yZtdPgd5/JxXZo+x6 NlNoIV5bklrauSPRhUn8DKeqPvIUXIGV6jfu7rY3I1InfAWaxHLlTj3Z1fU/e2cww2MK Lt1g== 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=OZGtcAO9gvKSB9TxBvOvG4wAGc013+YmWQ7pN5QSgPI=; fh=jF+j1UEDAwnYbShW3HmO1TshMsWh36Jt7pSLTP62NeE=; b=Ofk3bT4E8xmB/pEbyHt4AouGqVKIZAG5ni7R7awjcwBa/IK958Dws1huzrtVvtgpjN jPY351JZSy8tue+POXX8D4Q959bnwU2/CtEMNMc9eQvbomGCkGhHLFCCnOe0TVmk4sp9 Nc71Ht8ZGiJ5SUi/Ou5zGrfxA+lbSc92T1f3lRIDWhmw+xjL8IQZqgPiVm/Hi+FKsecN GFkroiVdzTTow7M3njmvl80yEoMcivUu7QwodQpSbfg9oggNAOOTS3LS2wQa9NjI77KD 849ZqTwEaRp7XFcaX3+6tCtLqxZCEidpj7rVtsWmdwmEzLbVS1cvXbzQ1ZWMQw7DzWRc Yspg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 agentk.vger.email (agentk.vger.email. [2620:137:e000::3:2]) by mx.google.com with ESMTPS id q18-20020a056a0002b200b0069023c19351si8989937pfs.154.2023.09.25.01.16.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 25 Sep 2023 01:16:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 as permitted sender) client-ip=2620:137:e000::3:2; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:2 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by agentk.vger.email (Postfix) with ESMTP id EB1BB81A1B88; Mon, 25 Sep 2023 01:12:23 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at agentk.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232776AbjIYIMK (ORCPT + 99 others); Mon, 25 Sep 2023 04:12:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55324 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232742AbjIYILq (ORCPT ); Mon, 25 Sep 2023 04:11:46 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id E30441A7; Mon, 25 Sep 2023 01:11:39 -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 D7D0DDA7; Mon, 25 Sep 2023 01:12:17 -0700 (PDT) Received: from e129166.arm.com (unknown [10.57.93.139]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 3B8E93F5A1; Mon, 25 Sep 2023 01:11:37 -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, mhiramat@kernel.org, qyousef@layalina.io, wvw@google.com Subject: [PATCH v4 10/18] PM: EM: Add RCU mechanism which safely cleans the old data Date: Mon, 25 Sep 2023 09:11:31 +0100 Message-Id: <20230925081139.1305766-11-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230925081139.1305766-1-lukasz.luba@arm.com> References: <20230925081139.1305766-1-lukasz.luba@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on agentk.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (agentk.vger.email [0.0.0.0]); Mon, 25 Sep 2023 01:12:24 -0700 (PDT) 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 | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index 5b40db38b745..2345837bfd2c 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,32 @@ 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_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); + + /* Don't free default table since it's used by other frameworks. */ + if (tmp != pd->default_table) + 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