From patchwork Wed Dec 20 23:17:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181877 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp67671dyi; Wed, 20 Dec 2023 15:17:29 -0800 (PST) X-Google-Smtp-Source: AGHT+IGzCW2xfBFiylVmx2xmyW+owEGL8yk55AU90vapiI3ruZXaujmmrFTJtUhb51rZvX4gM7hF X-Received: by 2002:a50:f60b:0:b0:554:1c46:1e0e with SMTP id c11-20020a50f60b000000b005541c461e0emr3368edn.9.1703114249792; Wed, 20 Dec 2023 15:17:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114249; cv=none; d=google.com; s=arc-20160816; b=TBeYTQJefQUOVwfVRCR97cgrPPBKp+HYcC45J5GDWYKYcFFclJkTOmcxNSdDJAKV8n IoJLkF476zYFRLBEKTmfxvESjxcWoHKXCO9cF11mA8kD1BMjlug/0RGNMbVGYd3IEGoZ UrCly+xWvID88sM6YMAmirAGacT+dXv8J8nJ4fjY5J9gCCzf0E1SQnCyLXrPWSgFa3iO FETbc8uyCeLLB8VkOs80JxtyHd7VYlrfgH7IQIYqmjdTAeUS9sDwdE7d3BVqM93BfUKu eIi25dW3E0TxT1geT/g5mafVUy4DXOwedm36L62x6wh77PvJCm0E04FxfTOEXXJBAbLj JPUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=ly7ipnpmtIcXHCxakBHDhT+/RXv3auA8nuzXY+WDP00=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=OMB0RoMFGusPBKJvC8OQnmQlCktuWjTx1TrBQu2bO67jTS4DjF0yQusk6bSxY0/DEg gOLYh2ILCEI5iVxNW+vPtXlgsPnicO4Aab3BlD5Yz0BlnoF4YvE/7IiQu+vmyot3xzSX PqDggxKomga9DFGrq/KYsCKVoJAx26YAa0UGyIJX6LJeNj/wVD6ihv92nQhIbaYqry8c 6BXehwXhNotCgzLdJfAvA8XGhWn74RoIU2qvUsuAPic0xsIwZJ1IYfo3LNBrUN4gBtvl HTnKGxNf7XdFW9Z3RMXHdazrkkyVTLK3n86zYN0bXFvBoMEG40+GJ4BObgW/8VwOG5UD mOXw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7623-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7623-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from am.mirrors.kernel.org (am.mirrors.kernel.org. [147.75.80.249]) by mx.google.com with ESMTPS id h26-20020a50cdda000000b00553ff0649a3si260596edj.361.2023.12.20.15.17.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:17:29 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7623-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) client-ip=147.75.80.249; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7623-ouuuleilei=gmail.com@vger.kernel.org designates 147.75.80.249 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7623-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by am.mirrors.kernel.org (Postfix) with ESMTPS id 597111F234ED for ; Wed, 20 Dec 2023 23:17:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CFC9E4B5C9; Wed, 20 Dec 2023 23:16:58 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B7C3C482E6; Wed, 20 Dec 2023 23:16:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 2D6671063; Wed, 20 Dec 2023 15:17:40 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id F29473F64C; Wed, 20 Dec 2023 15:16:53 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 1/9] thermal: core: Add governor callback for thermal zone change Date: Wed, 20 Dec 2023 23:17:45 +0000 Message-Id: <20231220231753.1824364-2-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844727405699699 X-GMAIL-MSGID: 1785844727405699699 Add a new callback to the struct thermal_governor. It can be used for updating governors when there is a change in the thermal zone internals, e.g. thermal cooling device is bind to the thermal zone. That makes possible to move some heavy operations like memory allocations related to the number of cooling instances out of the throttle() callback. Both callback code paths (throttle() and update_tz()) are protected with the same thermal zone lock, which guaranties the consistency. Signed-off-by: Lukasz Luba --- drivers/thermal/thermal_core.c | 14 ++++++++++++++ drivers/thermal/thermal_core.h | 2 ++ include/linux/thermal.h | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 0d761afb7cbc..62979c5401c3 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c @@ -311,6 +311,15 @@ static void handle_non_critical_trips(struct thermal_zone_device *tz, def_governor->throttle(tz, trip); } +void thermal_governor_update_tz(struct thermal_zone_device *tz, + enum thermal_notify_event reason) +{ + if (!tz->governor || !tz->governor->update_tz) + return; + + tz->governor->update_tz(tz, reason); +} + static void thermal_zone_device_halt(struct thermal_zone_device *tz, bool shutdown) { /* @@ -727,6 +736,8 @@ int thermal_bind_cdev_to_trip(struct thermal_zone_device *tz, list_add_tail(&dev->tz_node, &tz->thermal_instances); list_add_tail(&dev->cdev_node, &cdev->thermal_instances); atomic_set(&tz->need_update, 1); + + thermal_governor_update_tz(tz, THERMAL_TZ_BIND_CDEV); } mutex_unlock(&cdev->lock); mutex_unlock(&tz->lock); @@ -785,6 +796,9 @@ int thermal_unbind_cdev_from_trip(struct thermal_zone_device *tz, if (pos->tz == tz && pos->trip == trip && pos->cdev == cdev) { list_del(&pos->tz_node); list_del(&pos->cdev_node); + + thermal_governor_update_tz(tz, THERMAL_TZ_UNBIND_CDEV); + mutex_unlock(&cdev->lock); mutex_unlock(&tz->lock); goto unbind; diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h index b5e6743bd157..e6a2b6f97be8 100644 --- a/drivers/thermal/thermal_core.h +++ b/drivers/thermal/thermal_core.h @@ -115,6 +115,8 @@ int thermal_build_list_of_policies(char *buf); void __thermal_zone_device_update(struct thermal_zone_device *tz, enum thermal_notify_event event); void thermal_zone_device_critical_reboot(struct thermal_zone_device *tz); +void thermal_governor_update_tz(struct thermal_zone_device *tz, + enum thermal_notify_event reason); /* Helpers */ #define for_each_trip(__tz, __trip) \ diff --git a/include/linux/thermal.h b/include/linux/thermal.h index c0fabbcdefb9..1b76878cea46 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -51,6 +51,8 @@ enum thermal_notify_event { THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */ THERMAL_TABLE_CHANGED, /* Thermal table(s) changed */ THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */ + THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */ + THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */ }; /** @@ -197,6 +199,8 @@ struct thermal_zone_device { * thermal zone. * @throttle: callback called for every trip point even if temperature is * below the trip point temperature + * @update_tz: callback called when thermal zone internals have changed, e.g. + * thermal cooling instance was added/removed * @governor_list: node in thermal_governor_list (in thermal_core.c) */ struct thermal_governor { @@ -205,6 +209,8 @@ struct thermal_governor { void (*unbind_from_tz)(struct thermal_zone_device *tz); int (*throttle)(struct thermal_zone_device *tz, const struct thermal_trip *trip); + void (*update_tz)(struct thermal_zone_device *tz, + enum thermal_notify_event reason); struct list_head governor_list; }; From patchwork Wed Dec 20 23:17:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181879 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp67801dyi; Wed, 20 Dec 2023 15:17:47 -0800 (PST) X-Google-Smtp-Source: AGHT+IEDgu0HId+oo0juxFdwv7a8ICYcWnSc1XiVkgbK1JgjmjXeKG1sotDes0O0eot9Tmi+M8Vu X-Received: by 2002:a05:622a:251:b0:425:4043:50bb with SMTP id c17-20020a05622a025100b00425404350bbmr26291259qtx.74.1703114266969; Wed, 20 Dec 2023 15:17:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114266; cv=none; d=google.com; s=arc-20160816; b=ae1fTZCKSGKbUDT7nrMtzDK3MHylrG+rmDoYGuuVFtOqbgyXhEzEbyJ3CSEHaxCgN7 dD4kIQ12ia/dTtctsHnkNzIZIE3nZXPSb5ZQaekmnI7Hnw4z0O2T0SUs1mhw79WggCtW K0Qc241pP2ypotReyiK4vkeQqEi6SgnIREC4RMgtgT7Fmf8fUibSK+A0kJj0DzN1EhFR T553El4DB2+6Kmi8qciduEZxOGu97TDlU5udoVO22gJbUL0wQqRdLzRIIm+NQO9riKf0 5l22TqRhtVGY2h7GaN0vB1kbaYrZwdkANxHUdWeZcrk6qrxTtCncAPxqSSU015Y/hEut rRrw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=vuRRxVe9sVJjVCKH96ozoj5wyhgpvD/0DQ+YXa9RHfI=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=mNuWz+kjTaYtyYg+Q5GGcAgpzIlAZzAI3zB3kKeUAjI6ZGEu+iADrGX0cVJq17c45P /8rINspnS4Q5gSMkD0F+dimLoDNQ9oBYgJWCmVT0mJ9bza2jJUE2uQYRzifVzcAJTeLQ qkzC8jibsYc5jAloI4JFZ517zQvHmKJzu2OXRNNFQU6JraKfHW+NphY8WB5mVqGiaBEf fwb3lCHJhPpiFuzUBFTs+dR2iRE7y+EFJPHvYsNAotz0ueRuzRa0cO/3BbC/gcpSY9gr /+pe82FDLWIISFCRRApqUJVcR6qS2dYCpwnlrYvz7OKqAhbBU1Qplr8t2WJtrxKMNM9F rbvg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7624-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7624-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id p19-20020a05622a00d300b00425484f1f49si796671qtw.310.2023.12.20.15.17.46 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:17:46 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7624-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7624-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7624-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id B61E81C24A19 for ; Wed, 20 Dec 2023 23:17:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5B1CD4BAB7; Wed, 20 Dec 2023 23:17:00 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4AE674AF63; Wed, 20 Dec 2023 23:16:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 A2CFC1515; Wed, 20 Dec 2023 15:17:41 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 737A03F64C; Wed, 20 Dec 2023 15:16:55 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 2/9] thermal: gov_power_allocator: Refactor check_power_actors() Date: Wed, 20 Dec 2023 23:17:46 +0000 Message-Id: <20231220231753.1824364-3-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844745597330571 X-GMAIL-MSGID: 1785844745597330571 In preparation for a subsequent change, rearrange check_power_actors(). No intentional functional impact. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index 785fff14223d..d9175d9f5e3f 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -581,8 +581,9 @@ static void allow_maximum_power(struct thermal_zone_device *tz, bool update) * power actor API. The warning should help to investigate the issue, which * could be e.g. lack of Energy Model for a given device. * - * Return: 0 on success, -EINVAL if any cooling device does not implement - * the power actor API. + * If all of the cooling devices currently attached to @tz implement the power + * actor API, return the number of them (which may be 0, because some cooling + * devices may be attached later). Otherwise, return -EINVAL. */ static int check_power_actors(struct thermal_zone_device *tz, struct power_allocator_params *params) @@ -597,8 +598,9 @@ static int check_power_actors(struct thermal_zone_device *tz, if (!cdev_is_power_actor(instance->cdev)) { dev_warn(&tz->device, "power_allocator: %s is not a power actor\n", instance->cdev->type); - ret = -EINVAL; + return -EINVAL; } + ret++; } return ret; @@ -631,7 +633,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz) } ret = check_power_actors(tz, params); - if (ret) { + if (ret < 0) { dev_warn(&tz->device, "power_allocator: binding failed\n"); kfree(params); return ret; From patchwork Wed Dec 20 23:17:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181893 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp72289dyi; Wed, 20 Dec 2023 15:29:06 -0800 (PST) X-Google-Smtp-Source: AGHT+IGSofgzQgMzqzsGbyGqO+KsG50nPVmCrB7ybuGp5ezSEJaLTVRfcb+dlqEH/51mUre58+Xx X-Received: by 2002:a9d:69cb:0:b0:6db:b688:8c8b with SMTP id v11-20020a9d69cb000000b006dbb6888c8bmr227897oto.17.1703114946449; Wed, 20 Dec 2023 15:29:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114946; cv=none; d=google.com; s=arc-20160816; b=mvxaG7V9NdAPjEyZHLaRYAjb0AO3kdaR3XL2/pPOGHailS080ibJLCIEWHZySFHSna Pw8j+k7kfYmNkUsRHmEp0P3MTT9AMzE4SWJEPwvOwxE/GqpnnirCuJxvRGFoQV6Uromm X6SRvRaaTkWQoHEEZOFjImFlyZJZ5UJAYY+uearCSLo+pKBvrIUM7tGjAF11KqT01dNA O3ZHdEEEPfn5JPcYFCA0gD8uZdedX/JIa87+y+1dYOrKB943iNu/QkmLucxvLtOV6TXp qS/ayFrANGUE5UeycDxXd1vW9+GIH2u2cHet8k3toevdo1ELfFfxHil+SW9rPuE013Jo g73A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=2eTCM7EnA/yOVrukdarNu4f8Sq56+XBAvEEAORlUsTc=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=ItTdrxfhgkinMcHww86b4bCLJLOucdmElh2utcAUOdgDA4Z6Y5N7chyL49X8+Jr1Xu oPzebVPcEFsOZr3mIS2vJxOGyx6tTt9lk0oWNISdB4dN5vBzE2Gi0lfJm/bbAX1MWfYG AGgFUTaC9hKMzwO/o16hWMGgqJGJyWRcSfjx6NE17nID+aQNxfvmE+hIwzJebgGNJm6G 9ha5j4iv7e13AR1739FoaejppixwNcwLBQ0IjCNxpAnFil1lC6FfMlrU7V7UeoKT+grH SDZaKMLu8GCMy7fO4R3Ez8ka4qWMkbhFkS0gJIQAjjLk1V0c27WkIZHJG7lItHXfreji ynxQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7625-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7625-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [2604:1380:40f1:3f00::1]) by mx.google.com with ESMTPS id s40-20020a056a0017a800b006d69b130fe3si468647pfg.345.2023.12.20.15.29.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:29:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7625-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) client-ip=2604:1380:40f1:3f00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7625-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:40f1:3f00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7625-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 927A9B23E73 for ; Wed, 20 Dec 2023 23:17:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 842A14C3CD; Wed, 20 Dec 2023 23:17:01 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 78AAD4B5BB; Wed, 20 Dec 2023 23:16:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 247892F4; Wed, 20 Dec 2023 15:17:43 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E90F13F64C; Wed, 20 Dec 2023 15:16:56 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 3/9] thermal: gov_power_allocator: Refactor checks in divvy_up_power() Date: Wed, 20 Dec 2023 23:17:47 +0000 Message-Id: <20231220231753.1824364-4-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785845457961273105 X-GMAIL-MSGID: 1785845457961273105 Simplify the code and remove one extra 'if' block. No intentional functional impact. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index d9175d9f5e3f..9e35ebd7cb03 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -332,7 +332,8 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, u32 total_req_power, u32 power_range, u32 *granted_power, u32 *extra_actor_power) { - u32 extra_power, capped_extra_power; + u32 capped_extra_power = 0; + u32 extra_power = 0; int i; /* @@ -341,8 +342,6 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, if (!total_req_power) total_req_power = 1; - capped_extra_power = 0; - extra_power = 0; for (i = 0; i < num_actors; i++) { u64 req_range = (u64)req_power[i] * power_range; @@ -358,7 +357,7 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, capped_extra_power += extra_actor_power[i]; } - if (!extra_power) + if (!extra_power || !capped_extra_power) return; /* @@ -366,12 +365,13 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, * how far they are from the max */ extra_power = min(extra_power, capped_extra_power); - if (capped_extra_power > 0) - for (i = 0; i < num_actors; i++) { - u64 extra_range = (u64)extra_actor_power[i] * extra_power; - granted_power[i] += DIV_ROUND_CLOSEST_ULL(extra_range, - capped_extra_power); - } + + for (i = 0; i < num_actors; i++) { + u64 extra_range = (u64)extra_actor_power[i] * extra_power; + + granted_power[i] += DIV_ROUND_CLOSEST_ULL(extra_range, + capped_extra_power); + } } static int allocate_power(struct thermal_zone_device *tz, int control_temp) From patchwork Wed Dec 20 23:17:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181880 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68042dyi; Wed, 20 Dec 2023 15:18:17 -0800 (PST) X-Google-Smtp-Source: AGHT+IG5gyqckYpFakrmqd638x5UIy9HZrrN756z1VvjR2Vz2NG8cEwtljHYnW1OwSxxj3SXp5NB X-Received: by 2002:a05:620a:839b:b0:77f:643:ef82 with SMTP id pb27-20020a05620a839b00b0077f0643ef82mr17755925qkn.79.1703114297457; Wed, 20 Dec 2023 15:18:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114297; cv=none; d=google.com; s=arc-20160816; b=OyFtl4BZyOgzuXEPR8eUcVrfgwZ1fgQT8VjhC1iXVLCta7NGGDB9LGzAqLole8Hb1f eJr610AJtKfoyg6bAZpew26zl7o9spnCzVipMn/nGcpm68YZnaIh9sVnNj+qLB6ZkAOR T4S23GGoY0+v6Sai756E7hHIxdinOSgJdaVDZ0cUtad0pZetwphSsWjMJQ75mvoAEVcY v12nZ5vqZvfX4gNac3qS/YxtVHeRDCWPvlGnw/CY2/MSdftBujOjMuav00svmIwiBsvR Rtf+x+NLqolvGhQA3GmG1/a5mF8QVgJOxzntxrRbA3YJMAvNhedZcRpN8gDoH9gL6Xcg mJEA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=86n5FgKj1zGs/ZcheS+cwmh30tKgxFBebz2jWsrQJTk=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=SDhVyhuBZl66ndZtbFIlvS37N60IIz+8OfIRKZkZGat5tjGS7spSCyi6zWRdGn5I0y JdCJIZXPMLbHZOsRpz9+ZQpTq91lCJE91leMcxtTpFAbCQfRL8rL3EJ3sjVPuQZI6Dz4 Vh42oTnod27xFCw7rCoupvup67fyakmylYbvfj1iG6QwMP7NZtxjLbGFhvfC1S/B4+OH UyjCQnWH2kCwBEplOKAovN7/4RRcKF8WEmAYElsWGlQw7blzIJhajXY3hMV7WskZUGYP wjO0RodzqrnZG4e24zP6G9qYMElU0vEQzycYkBDLbi3oX9/buc6UTgbhl/ahIGZIn3z1 +t+Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7626-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id 17-20020a05620a041100b007811aaff520si780330qkp.778.2023.12.20.15.18.17 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:18:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7626-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7626-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 428861C249DA for ; Wed, 20 Dec 2023 23:18:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24B234A986; Wed, 20 Dec 2023 23:17:03 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 185834BA98; Wed, 20 Dec 2023 23:16:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 9A399152B; Wed, 20 Dec 2023 15:17:44 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 6AC803F64C; Wed, 20 Dec 2023 15:16:58 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 4/9] thermal: gov_power_allocator: Change trace functions Date: Wed, 20 Dec 2023 23:17:48 +0000 Message-Id: <20231220231753.1824364-5-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844777799416303 X-GMAIL-MSGID: 1785844777799416303 Change trace event trace_thermal_power_allocator() to not use dynamic array for requested power and granted power for all power actors. Instead, simplify the trace event and print other simple values. Add new trace event to print power actor information of requested power and granted power. That trace event would be called in a loop for each power actor. The trace data would be easier to parse comparing to the dynamic array implementation. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 5 +-- drivers/thermal/thermal_trace_ipa.h | 50 ++++++++++++++++----------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index 9e35ebd7cb03..53283fd8a944 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -469,11 +469,12 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) granted_power[i]); total_granted_power += granted_power[i]; + trace_thermal_power_actor(tz, i, req_power[i], + granted_power[i]); i++; } - trace_thermal_power_allocator(tz, req_power, total_req_power, - granted_power, total_granted_power, + trace_thermal_power_allocator(tz, total_req_power, total_granted_power, num_actors, power_range, max_allocatable_power, tz->temperature, control_temp - tz->temperature); diff --git a/drivers/thermal/thermal_trace_ipa.h b/drivers/thermal/thermal_trace_ipa.h index 84568db5421b..b16b5dd863d9 100644 --- a/drivers/thermal/thermal_trace_ipa.h +++ b/drivers/thermal/thermal_trace_ipa.h @@ -8,19 +8,14 @@ #include TRACE_EVENT(thermal_power_allocator, - TP_PROTO(struct thermal_zone_device *tz, u32 *req_power, - u32 total_req_power, u32 *granted_power, - u32 total_granted_power, size_t num_actors, - u32 power_range, u32 max_allocatable_power, - int current_temp, s32 delta_temp), - TP_ARGS(tz, req_power, total_req_power, granted_power, - total_granted_power, num_actors, power_range, - max_allocatable_power, current_temp, delta_temp), + TP_PROTO(struct thermal_zone_device *tz, u32 total_req_power, + u32 total_granted_power, int num_actors, u32 power_range, + u32 max_allocatable_power, int current_temp, s32 delta_temp), + TP_ARGS(tz, total_req_power, total_granted_power, num_actors, + power_range, max_allocatable_power, current_temp, delta_temp), TP_STRUCT__entry( __field(int, tz_id ) - __dynamic_array(u32, req_power, num_actors ) __field(u32, total_req_power ) - __dynamic_array(u32, granted_power, num_actors) __field(u32, total_granted_power ) __field(size_t, num_actors ) __field(u32, power_range ) @@ -30,11 +25,7 @@ TRACE_EVENT(thermal_power_allocator, ), TP_fast_assign( __entry->tz_id = tz->id; - memcpy(__get_dynamic_array(req_power), req_power, - num_actors * sizeof(*req_power)); __entry->total_req_power = total_req_power; - memcpy(__get_dynamic_array(granted_power), granted_power, - num_actors * sizeof(*granted_power)); __entry->total_granted_power = total_granted_power; __entry->num_actors = num_actors; __entry->power_range = power_range; @@ -43,18 +34,35 @@ TRACE_EVENT(thermal_power_allocator, __entry->delta_temp = delta_temp; ), - TP_printk("thermal_zone_id=%d req_power={%s} total_req_power=%u granted_power={%s} total_granted_power=%u power_range=%u max_allocatable_power=%u current_temperature=%d delta_temperature=%d", - __entry->tz_id, - __print_array(__get_dynamic_array(req_power), - __entry->num_actors, 4), - __entry->total_req_power, - __print_array(__get_dynamic_array(granted_power), - __entry->num_actors, 4), + TP_printk("thermal_zone_id=%d total_req_power=%u total_granted_power=%u power_range=%u max_allocatable_power=%u current_temperature=%d delta_temperature=%d", + __entry->tz_id, __entry->total_req_power, __entry->total_granted_power, __entry->power_range, __entry->max_allocatable_power, __entry->current_temp, __entry->delta_temp) ); +TRACE_EVENT(thermal_power_actor, + TP_PROTO(struct thermal_zone_device *tz, int actor_id, u32 req_power, + u32 granted_power), + TP_ARGS(tz, actor_id, req_power, granted_power), + TP_STRUCT__entry( + __field(int, tz_id) + __field(int, actor_id) + __field(u32, req_power) + __field(u32, granted_power) + ), + TP_fast_assign( + __entry->tz_id = tz->id; + __entry->actor_id = actor_id; + __entry->req_power = req_power; + __entry->granted_power = granted_power; + ), + + TP_printk("thermal_zone_id=%d actor_id=%d req_power=%u granted_power=%u", + __entry->tz_id, __entry->actor_id, __entry->req_power, + __entry->granted_power) +); + TRACE_EVENT(thermal_power_allocator_pid, TP_PROTO(struct thermal_zone_device *tz, s32 err, s32 err_integral, s64 p, s64 i, s64 d, s32 output), From patchwork Wed Dec 20 23:17: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: 181882 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68139dyi; Wed, 20 Dec 2023 15:18:31 -0800 (PST) X-Google-Smtp-Source: AGHT+IFBol1rKDdBz+uWAZrgwx/UPJ7yUJNb7sizJXLbpzkTwWpume9jIQQYFUB/dX3WFcmnb1EC X-Received: by 2002:a05:622a:1792:b0:425:4043:4199 with SMTP id s18-20020a05622a179200b0042540434199mr30929885qtk.69.1703114311825; Wed, 20 Dec 2023 15:18:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114311; cv=none; d=google.com; s=arc-20160816; b=o7SMBQhHsKMdr94Ja9dIsGmtZPhc8RytkAJH5/SmTsG5HOa9hFOfNmNkcmn4enP390 GL9r2XqycErKgg/mqq6HiXuRarUYeTl8+2F4G3CZNRW977++1TISeUlEf24rTz+X3poD rrPEXIWjJOALecowaoNMRn2R1eSI5XLtVrlMsecSK7QcnlHswn1gkFNYT7+dB73e8xx5 Y0+vUAStIa7xVam4EiZFggcbE2SgdI+Ln7xJ1Js0o9qjiR2hvIXGEmIDa5Xc/ZlwNhUZ SKLEUiXQSUpntuFJGpKC2UKX8c6bogOtyQlCmzNmWXSPLSj4hFfnpHKtph+aaoh7ZEM5 DirQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=cWZ39nRNv5MV1tiV9q65cYlo5kDX99Y6Yi2mRI8IPGY=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=jpfgelEe+Yi6e8NlxbpfWVqdxOPEronG93fa/InXAInuoeOD1OAS4R6rhpy+v8KgQA /rm8csLFoZNiebvMHDUW9zcutQvzntqRRxsvuLimAy52sVXJvM1VSTPAgYCMJluobOxr kjqmzBpVvBmQIDJvz0DTQRhUADfOqFQOZ+5bUTZ82AEj1merDBAPO1bsaRUNdFkU84Ci YnugygJe0dhA3OPoZ2hxrz8VLw8WEIzNXOM++U9i8t+TS/TdIXe14IZwct7QK5KOa5EA PCHoHYhvnSoVncJ4mk3zatwPsXyuHlAH5hJSLI6cC/vhb6YW99OGIrTCRBS3OF3X5S4g J9PQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7627-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7627-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id o18-20020a05622a009200b004276211e048si762373qtw.578.2023.12.20.15.18.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:18:31 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7627-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7627-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7627-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 8D6081C24BB8 for ; Wed, 20 Dec 2023 23:18:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 630634CB36; Wed, 20 Dec 2023 23:17:04 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3D60A4C3C4; Wed, 20 Dec 2023 23:17:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 1BEE72F4; Wed, 20 Dec 2023 15:17:46 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E180D3F64C; Wed, 20 Dec 2023 15:16:59 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 5/9] thermal: gov_power_allocator: Move memory allocation out of throttle() Date: Wed, 20 Dec 2023 23:17:49 +0000 Message-Id: <20231220231753.1824364-6-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844792601050011 X-GMAIL-MSGID: 1785844792601050011 The new thermal callback allows to react to the change of cooling instances in the thermal zone. Move the memory allocation to that new callback and save CPU cycles in the throttle() code path. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 207 +++++++++++++++++--------- 1 file changed, 136 insertions(+), 71 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index 53283fd8a944..626c635f137f 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -46,6 +46,22 @@ static inline s64 div_frac(s64 x, s64 y) return div_s64(x << FRAC_BITS, y); } +/** + * struct power_actor - internal power information for power actor + * @req_power: requested power value (not weighted) + * @max_power: max allocatable power for this actor + * @granted_power: granted power for this actor + * @extra_actor_power: extra power that this actor can receive + * @weighted_req_power: weighted requested power as input to IPA + */ +struct power_actor { + u32 req_power; + u32 max_power; + u32 granted_power; + u32 extra_actor_power; + u32 weighted_req_power; +}; + /** * struct power_allocator_params - parameters for the power allocator governor * @allocated_tzp: whether we have allocated tzp for this thermal zone and @@ -61,6 +77,9 @@ static inline s64 div_frac(s64 x, s64 y) * @trip_switch_on should be NULL. * @trip_max: last passive trip point of the thermal zone. The * temperature we are controlling for. + * @num_actors: number of cooling devices supporting IPA callbacks + * @buffer_size: internal buffer size, to avoid runtime re-calculation + * @power: buffer for all power actors internal power information */ struct power_allocator_params { bool allocated_tzp; @@ -69,6 +88,9 @@ struct power_allocator_params { u32 sustainable_power; const struct thermal_trip *trip_switch_on; const struct thermal_trip *trip_max; + unsigned int num_actors; + unsigned int buffer_size; + struct power_actor *power; }; /** @@ -303,15 +325,10 @@ power_actor_set_power(struct thermal_cooling_device *cdev, /** * divvy_up_power() - divvy the allocated power between the actors - * @req_power: each actor's requested power - * @max_power: each actor's maximum available power - * @num_actors: size of the @req_power, @max_power and @granted_power's array - * @total_req_power: sum of @req_power + * @power: buffer for all power actors internal power information + * @num_actors: number of power actors in this thermal zone + * @total_req_power: sum of all weighted requested power for all actors * @power_range: total allocated power - * @granted_power: output array: each actor's granted power - * @extra_actor_power: an appropriately sized array to be used in the - * function as temporary storage of the extra power given - * to the actors * * This function divides the total allocated power (@power_range) * fairly between the actors. It first tries to give each actor a @@ -324,13 +341,9 @@ power_actor_set_power(struct thermal_cooling_device *cdev, * If any actor received more than their maximum power, then that * surplus is re-divvied among the actors based on how far they are * from their respective maximums. - * - * Granted power for each actor is written to @granted_power, which - * should've been allocated by the calling function. */ -static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, - u32 total_req_power, u32 power_range, - u32 *granted_power, u32 *extra_actor_power) +static void divvy_up_power(struct power_actor *power, int num_actors, + u32 total_req_power, u32 power_range) { u32 capped_extra_power = 0; u32 extra_power = 0; @@ -343,18 +356,19 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, total_req_power = 1; for (i = 0; i < num_actors; i++) { - u64 req_range = (u64)req_power[i] * power_range; + struct power_actor *pa = &power[i]; + u64 req_range = (u64)pa->req_power * power_range; - granted_power[i] = DIV_ROUND_CLOSEST_ULL(req_range, - total_req_power); + pa->granted_power = DIV_ROUND_CLOSEST_ULL(req_range, + total_req_power); - if (granted_power[i] > max_power[i]) { - extra_power += granted_power[i] - max_power[i]; - granted_power[i] = max_power[i]; + if (pa->granted_power > pa->max_power) { + extra_power += pa->granted_power - pa->max_power; + pa->granted_power = pa->max_power; } - extra_actor_power[i] = max_power[i] - granted_power[i]; - capped_extra_power += extra_actor_power[i]; + pa->extra_actor_power = pa->max_power - pa->granted_power; + capped_extra_power += pa->extra_actor_power; } if (!extra_power || !capped_extra_power) @@ -367,61 +381,44 @@ static void divvy_up_power(u32 *req_power, u32 *max_power, int num_actors, extra_power = min(extra_power, capped_extra_power); for (i = 0; i < num_actors; i++) { - u64 extra_range = (u64)extra_actor_power[i] * extra_power; + struct power_actor *pa = &power[i]; + u64 extra_range = pa->extra_actor_power; - granted_power[i] += DIV_ROUND_CLOSEST_ULL(extra_range, - capped_extra_power); + extra_range *= extra_power; + pa->granted_power += DIV_ROUND_CLOSEST_ULL(extra_range, + capped_extra_power); } } static int allocate_power(struct thermal_zone_device *tz, int control_temp) { - u32 *req_power, *max_power, *granted_power, *extra_actor_power; struct power_allocator_params *params = tz->governor_data; + unsigned int num_actors = params->num_actors; + struct power_actor *power = params->power; struct thermal_cooling_device *cdev; struct thermal_instance *instance; u32 total_weighted_req_power = 0; u32 max_allocatable_power = 0; u32 total_granted_power = 0; u32 total_req_power = 0; - u32 *weighted_req_power; u32 power_range, weight; int total_weight = 0; - int num_actors = 0; - int i = 0; - - list_for_each_entry(instance, &tz->thermal_instances, tz_node) { - if ((instance->trip == params->trip_max) && - cdev_is_power_actor(instance->cdev)) { - num_actors++; - total_weight += instance->weight; - } - } + int i = 0, ret; if (!num_actors) return -ENODEV; - /* - * We need to allocate five arrays of the same size: - * req_power, max_power, granted_power, extra_actor_power and - * weighted_req_power. They are going to be needed until this - * function returns. Allocate them all in one go to simplify - * the allocation and deallocation logic. - */ - BUILD_BUG_ON(sizeof(*req_power) != sizeof(*max_power)); - BUILD_BUG_ON(sizeof(*req_power) != sizeof(*granted_power)); - BUILD_BUG_ON(sizeof(*req_power) != sizeof(*extra_actor_power)); - BUILD_BUG_ON(sizeof(*req_power) != sizeof(*weighted_req_power)); - req_power = kcalloc(num_actors * 5, sizeof(*req_power), GFP_KERNEL); - if (!req_power) - return -ENOMEM; + list_for_each_entry(instance, &tz->thermal_instances, tz_node) + if ((instance->trip == params->trip_max) && + cdev_is_power_actor(instance->cdev)) + total_weight += instance->weight; - max_power = &req_power[num_actors]; - granted_power = &req_power[2 * num_actors]; - extra_actor_power = &req_power[3 * num_actors]; - weighted_req_power = &req_power[4 * num_actors]; + /* Clean all buffers for new power estimations */ + memset(power, 0, params->buffer_size); list_for_each_entry(instance, &tz->thermal_instances, tz_node) { + struct power_actor *pa = &power[i]; + cdev = instance->cdev; if (instance->trip != params->trip_max) @@ -430,7 +427,8 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) if (!cdev_is_power_actor(cdev)) continue; - if (cdev->ops->get_requested_power(cdev, &req_power[i])) + ret = cdev->ops->get_requested_power(cdev, &pa->req_power); + if (ret) continue; if (!total_weight) @@ -438,27 +436,29 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) else weight = instance->weight; - weighted_req_power[i] = frac_to_int(weight * req_power[i]); + pa->weighted_req_power = frac_to_int(weight * pa->req_power); - if (cdev->ops->state2power(cdev, instance->lower, - &max_power[i])) + ret = cdev->ops->state2power(cdev, instance->lower, + &pa->max_power); + if (ret) continue; - total_req_power += req_power[i]; - max_allocatable_power += max_power[i]; - total_weighted_req_power += weighted_req_power[i]; + total_req_power += pa->req_power; + max_allocatable_power += pa->max_power; + total_weighted_req_power += pa->weighted_req_power; i++; } power_range = pid_controller(tz, control_temp, max_allocatable_power); - divvy_up_power(weighted_req_power, max_power, num_actors, - total_weighted_req_power, power_range, granted_power, - extra_actor_power); + divvy_up_power(power, num_actors, total_weighted_req_power, + power_range); i = 0; list_for_each_entry(instance, &tz->thermal_instances, tz_node) { + struct power_actor *pa = &power[i]; + if (instance->trip != params->trip_max) continue; @@ -466,11 +466,11 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) continue; power_actor_set_power(instance->cdev, instance, - granted_power[i]); - total_granted_power += granted_power[i]; + pa->granted_power); + total_granted_power += pa->granted_power; - trace_thermal_power_actor(tz, i, req_power[i], - granted_power[i]); + trace_thermal_power_actor(tz, i, pa->req_power, + pa->granted_power); i++; } @@ -479,8 +479,6 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) max_allocatable_power, tz->temperature, control_temp - tz->temperature); - kfree(req_power); - return 0; } @@ -607,6 +605,63 @@ static int check_power_actors(struct thermal_zone_device *tz, return ret; } +static int allocate_actors_buffer(struct power_allocator_params *params, + int num_actors) +{ + int ret; + + kfree(params->power); + + /* There might be no cooling devices yet. */ + if (!num_actors) { + ret = -EINVAL; + goto clean_state; + } + + params->power = kcalloc(num_actors, sizeof(struct power_actor), + GFP_KERNEL); + if (!params->power) { + ret = -ENOMEM; + goto clean_state; + } + + params->num_actors = num_actors; + params->buffer_size = num_actors * sizeof(struct power_actor); + + return 0; + +clean_state: + params->num_actors = 0; + params->buffer_size = 0; + params->power = NULL; + return ret; +} + +static void power_allocator_update_tz(struct thermal_zone_device *tz, + enum thermal_notify_event reason) +{ + struct power_allocator_params *params = tz->governor_data; + struct thermal_instance *instance; + int num_actors = 0; + + switch (reason) { + case THERMAL_TZ_BIND_CDEV: + case THERMAL_TZ_UNBIND_CDEV: + list_for_each_entry(instance, &tz->thermal_instances, tz_node) + if ((instance->trip == params->trip_max) && + cdev_is_power_actor(instance->cdev)) + num_actors++; + + if (num_actors == params->num_actors) + return; + + allocate_actors_buffer(params, num_actors); + break; + default: + break; + } +} + /** * power_allocator_bind() - bind the power_allocator governor to a thermal zone * @tz: thermal zone to bind it to @@ -640,6 +695,13 @@ static int power_allocator_bind(struct thermal_zone_device *tz) return ret; } + ret = allocate_actors_buffer(params, ret); + if (ret) { + dev_warn(&tz->device, "power_allocator: allocation failed\n"); + kfree(params); + return ret; + } + if (!tz->tzp) { tz->tzp = kzalloc(sizeof(*tz->tzp), GFP_KERNEL); if (!tz->tzp) { @@ -664,6 +726,7 @@ static int power_allocator_bind(struct thermal_zone_device *tz) return 0; free_params: + kfree(params->power); kfree(params); return ret; @@ -680,6 +743,7 @@ static void power_allocator_unbind(struct thermal_zone_device *tz) tz->tzp = NULL; } + kfree(params->power); kfree(tz->governor_data); tz->governor_data = NULL; } @@ -718,5 +782,6 @@ static struct thermal_governor thermal_gov_power_allocator = { .bind_to_tz = power_allocator_bind, .unbind_from_tz = power_allocator_unbind, .throttle = power_allocator_throttle, + .update_tz = power_allocator_update_tz, }; THERMAL_GOVERNOR_DECLARE(thermal_gov_power_allocator); From patchwork Wed Dec 20 23:17:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181883 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68258dyi; Wed, 20 Dec 2023 15:18:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IEjJlNFhLJseq6wPzofqB+oau0MbADUeOA8DdzzT6A/DJQvodj6AsNGN0zIWbVwLxugPAD/ X-Received: by 2002:a05:6870:d625:b0:204:f0b:3bfd with SMTP id a37-20020a056870d62500b002040f0b3bfdmr582708oaq.43.1703114329829; Wed, 20 Dec 2023 15:18:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114329; cv=none; d=google.com; s=arc-20160816; b=fuz8B7EN+49zD2X11Sc43sLQDvG0w+6gsUUrMAK/9CrAMFRT9PWs0Yt7tu7kwdKPaN +qWW30S6J1JB3f2lVoL5kLt+d/GVdTz7E3OavnWTVyZg4Nz5mbTrpHgRnu0QbXO0i9yu jQ0PGkJktFw4n6unXKyK8Rbxw5G3FIDoYM7BvchKgj8RZ2opPGnhpjM76kKsL4S5ArS4 yt9+LTwDQx3eRa4oc1lrTBRT50GdsNvBLr7xmKRyQTzphqTFEPDRYzezHDXmHJ6ttliN 5ziEpQO8K9Flq9GmtZS/A3UwVA/oPL5NTlEAmZuNsy5BEPqtSDjbfh2q0U+wYjVXRo+E qa7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=vwMaY0xi5CiWrDUJJo6REXdurmAUKUlFm+TJtK22jwk=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=XpNTK64j77S64uCZ7PTFrEGpBi7Oj9+HTcPFLgDs22pP9nQPgP+eBw1h8AZ9u83gPR ci0XPanunWJflp8qs8rA1hWrQ1t19MaOHFy9zwbFhD14dNQBWUSWyCSJTnAQ7MV9WXcc F8BKrgl77vTIA6B35cRXQONpcd+Qv4rWfdi/UoxnGecLlqcItjdi1oaFBWqVcFLrr63J +8tBFRHQ58d2gSqvLHMKoH+/WSrTieHzuaGPOOQRNWGR1vIA48btDB1VlxpLvNzNWGv7 2uzPpoDUAX77Z1JKijr2Cf48zPXFrOQQOep7fDkj/Ac9tRnUJAvrTWdjv5iVZ2rT5bdr 2r2g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7628-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7628-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id b14-20020a6567ce000000b005c21d7ee51asi496697pgs.301.2023.12.20.15.18.49 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:18:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7628-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7628-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7628-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 9536D28724A for ; Wed, 20 Dec 2023 23:18:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C02CE4CDE7; Wed, 20 Dec 2023 23:17:05 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CAC8F4C61C; Wed, 20 Dec 2023 23:17:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 91E6A152B; Wed, 20 Dec 2023 15:17:47 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 629193F64C; Wed, 20 Dec 2023 15:17:01 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 6/9] thermal: gov_power_allocator: Simplify checks for valid power actor Date: Wed, 20 Dec 2023 23:17:50 +0000 Message-Id: <20231220231753.1824364-7-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844811546285300 X-GMAIL-MSGID: 1785844811546285300 There is a need to check if the cooling device in the thermal zone supports IPA callback and is set for control trip point. Refactor the code which validates the power actor capabilities and make it more consistent in all places. No intentional functional impact. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 40 ++++++++++++--------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index 626c635f137f..b5ec60ae7efd 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -93,6 +93,13 @@ struct power_allocator_params { struct power_actor *power; }; +static bool power_actor_is_valid(struct power_allocator_params *params, + struct thermal_instance *instance) +{ + return (instance->trip == params->trip_max && + cdev_is_power_actor(instance->cdev)); +} + /** * estimate_sustainable_power() - Estimate the sustainable power of a thermal zone * @tz: thermal zone we are operating in @@ -113,14 +120,10 @@ static u32 estimate_sustainable_power(struct thermal_zone_device *tz) u32 min_power; list_for_each_entry(instance, &tz->thermal_instances, tz_node) { - cdev = instance->cdev; - - if (instance->trip != params->trip_max) - continue; - - if (!cdev_is_power_actor(cdev)) + if (!power_actor_is_valid(params, instance)) continue; + cdev = instance->cdev; if (cdev->ops->state2power(cdev, instance->upper, &min_power)) continue; @@ -409,8 +412,7 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) return -ENODEV; list_for_each_entry(instance, &tz->thermal_instances, tz_node) - if ((instance->trip == params->trip_max) && - cdev_is_power_actor(instance->cdev)) + if (power_actor_is_valid(params, instance)) total_weight += instance->weight; /* Clean all buffers for new power estimations */ @@ -419,13 +421,10 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) list_for_each_entry(instance, &tz->thermal_instances, tz_node) { struct power_actor *pa = &power[i]; - cdev = instance->cdev; - - if (instance->trip != params->trip_max) + if (!power_actor_is_valid(params, instance)) continue; - if (!cdev_is_power_actor(cdev)) - continue; + cdev = instance->cdev; ret = cdev->ops->get_requested_power(cdev, &pa->req_power); if (ret) @@ -459,10 +458,7 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) list_for_each_entry(instance, &tz->thermal_instances, tz_node) { struct power_actor *pa = &power[i]; - if (instance->trip != params->trip_max) - continue; - - if (!cdev_is_power_actor(instance->cdev)) + if (!power_actor_is_valid(params, instance)) continue; power_actor_set_power(instance->cdev, instance, @@ -548,12 +544,11 @@ static void allow_maximum_power(struct thermal_zone_device *tz, bool update) u32 req_power; list_for_each_entry(instance, &tz->thermal_instances, tz_node) { - cdev = instance->cdev; - - if (instance->trip != params->trip_max || - !cdev_is_power_actor(instance->cdev)) + if (!power_actor_is_valid(params, instance)) continue; + cdev = instance->cdev; + instance->target = 0; mutex_lock(&cdev->lock); /* @@ -648,8 +643,7 @@ static void power_allocator_update_tz(struct thermal_zone_device *tz, case THERMAL_TZ_BIND_CDEV: case THERMAL_TZ_UNBIND_CDEV: list_for_each_entry(instance, &tz->thermal_instances, tz_node) - if ((instance->trip == params->trip_max) && - cdev_is_power_actor(instance->cdev)) + if (power_actor_is_valid(params, instance)) num_actors++; if (num_actors == params->num_actors) From patchwork Wed Dec 20 23:17:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181885 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68465dyi; Wed, 20 Dec 2023 15:19:19 -0800 (PST) X-Google-Smtp-Source: AGHT+IEEOYJYz4DdDW/HcHrkoe+YkUQnUdA2FM2Gv0/rD2CLy41OCa/HCKus/YBYo36Wr3Vw5zaj X-Received: by 2002:a05:6358:281e:b0:170:17eb:378c with SMTP id k30-20020a056358281e00b0017017eb378cmr465450rwb.52.1703114359294; Wed, 20 Dec 2023 15:19:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114359; cv=none; d=google.com; s=arc-20160816; b=l5/iyojOENm2A/thhcYu/h2Ck6wWOfZv0BSNE7YfLRs8dalfZT+2k+onjjapmiDgxl MxSn7PTlViLLVdXLuck5AlLjyGz1FCa095qdMH9QCil4exVwGp9tZwMnZzXrOfb6O3sc x2yJnnHv/W5L+rCAox5gX0pvLaaWU38Ql++Vsqg2bQIbMwuI+KPpwJqa1QUnSzkt3Aro QmQXwVi+YC0ypOvCNFLlPy+QxjKkv0gFjsg0Cx8deaTMpwuWS/UR9ccsjcgVydy2aFrK LMLa5yOz8HojByX/C1cRqfmt9SHQ3g/ZTFhouGowqp6pLDVNm+iuldkzFwzivyYP1DUt rAIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=zn1sy36H8FEmmSfbilQBVnkwdcCw5fuD350ICT8tkh8=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=jrN5aJGZyclrC3Ap5pCH1t5aZwj1sFt3Joe6+9Ax19sJUWSWudpp1FclF61kYd1FDi 2nZkdVVob9MrN7twuRiHCZTA5hukoEJODnc6lR96PRvyKKU/rIEXG08MRk33oM0thgk9 yAVH3yQhDYesHq1MtHSxXIAYvz4zObMMjabSpaiEbLWHfkMVABImEyt17hC0+aqon3o/ GSHAqOLcz//PUyw+txU7zLjuFEjSTxNcArxddbW+DyWhS27YarycY+zvSFMprRFqD1nb Cdj3Usd1dZo5I1MSiOTJkMGr/SFiLjxctdylvShXkvSJzalajCHAkJkfo+qWen4Tpx2N FXJA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7629-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7629-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id r5-20020a17090aad0500b0028bbccf4e21si572534pjq.160.2023.12.20.15.19.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:19:19 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7629-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7629-ouuuleilei=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7629-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 92613280FBF for ; Wed, 20 Dec 2023 23:19:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E432F4CE14; Wed, 20 Dec 2023 23:17:06 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3ED0F4CB2C; Wed, 20 Dec 2023 23:17:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 1D1922F4; Wed, 20 Dec 2023 15:17:49 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D87BB3F64C; Wed, 20 Dec 2023 15:17:02 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 7/9] thermal/sysfs: Update instance->weight under tz lock Date: Wed, 20 Dec 2023 23:17:51 +0000 Message-Id: <20231220231753.1824364-8-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844842233482084 X-GMAIL-MSGID: 1785844842233482084 User space can change the weight of a thermal instance via sysfs while the .throttle() callback is running for a governor, because weight_store() does not use the zone lock. The IPA governor uses instance weight values for power calculations and caches the sum of them as total_weight, so it gets confused when one of them changes while its .throttle() callback is running. To prevent that from happening, use thermal zone locking in weight_store(). Signed-off-by: Lukasz Luba --- drivers/thermal/thermal_sysfs.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c index d8ff74a4338a..299c0fb16593 100644 --- a/drivers/thermal/thermal_sysfs.c +++ b/drivers/thermal/thermal_sysfs.c @@ -936,7 +936,11 @@ ssize_t weight_store(struct device *dev, struct device_attribute *attr, return ret; instance = container_of(attr, struct thermal_instance, weight_attr); + + /* Don't race with governors using the 'weight' value */ + mutex_lock(&instance->tz->lock); instance->weight = weight; + mutex_unlock(&instance->tz->lock); return count; } From patchwork Wed Dec 20 23:17:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181884 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68452dyi; Wed, 20 Dec 2023 15:19:18 -0800 (PST) X-Google-Smtp-Source: AGHT+IGMFl+H4k8IfRjT7HtjoP4gjFiKe6lQWYQVlQ/7fXna0MywE4L12PlbL6/9Ktvglsc9jVgm X-Received: by 2002:a05:622a:181:b0:425:4043:50f9 with SMTP id s1-20020a05622a018100b00425404350f9mr29041106qtw.136.1703114358612; Wed, 20 Dec 2023 15:19:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114358; cv=none; d=google.com; s=arc-20160816; b=n0ZRp94kHjA2C4c69FbDsSTmjKH0E9bHzKQ26A+BN68S3SNccGcF8OQdU+gqp6hYmU UZj30gasW270WRXNoc8yVu8Hv6LCfUi8OQQCBCf7G7MR6VDGfL7xHO77dD6haLlyCJgK 9RsjxiXR6KrAsHGYTo/dsA3MduWBrqXceDQGlWbIFrLmy0j39crikabX5xiJRjPB8clU YJ0h5F6gNnhgmunGA6fjU9C0st9jDlb+JP+5dCIuItIT69t5ia6KedfNIWyI60Mw3gCR Cz6Jw8nVhS4hJ4d7SNm1AMbLQRdw/mFFlGIm7xH7bpyPrA4xvSvo6w7Dec5TNOK/e/Hc ilTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=/GywyLc1XSl0UuZvGhqeJSh8ebS7tHPCLETTLUgM0vs=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=k6PjDro2fpc33/60QSc7VRRXvF8JYH+I/rqMRbp14n8pU7ze08Al9fGXePuYonJwfS Xjh7TT/j66hGxot+aEDau555qkak3L2ZXGaRrIcwFVGYtb1csf7eNQUKNHikT1UA9uJW LJd/aCvqo7S/nEW+asCvTrCCkXDjjyrac1nKixTV6DQk7aRz7Kx8o4T+yAHuq3hqm4vl MU9UxkmOIuhx6zCyvYuSN8+dRVe8MntPycbl2BECDGEqkAKMtXzJcMZsPGPAZf6RzRl/ 73ipL+1ria+AC9I3TQfw+0QwR/7KvE/+oBP46nU04BRKUDP0YMtlHCSChK0CcIT/e30x 9DrQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7630-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7630-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id t29-20020a05622a181d00b004237e3ffacfsi814554qtc.256.2023.12.20.15.19.18 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:19:18 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7630-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7630-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7630-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 68CD71C24F9A for ; Wed, 20 Dec 2023 23:19:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6CA64D133; Wed, 20 Dec 2023 23:17:08 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 148DE4CDF8; Wed, 20 Dec 2023 23:17:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 8FA8F2F4; Wed, 20 Dec 2023 15:17:50 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 62D2E3F64C; Wed, 20 Dec 2023 15:17:04 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 8/9] thermal/sysfs: Update governors when the 'weight' has changed Date: Wed, 20 Dec 2023 23:17:52 +0000 Message-Id: <20231220231753.1824364-9-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844841805201998 X-GMAIL-MSGID: 1785844841805201998 Support governors update when the thermal instance's weight has changed. This allows to adjust internal state for the governor. Signed-off-by: Lukasz Luba --- drivers/thermal/thermal_sysfs.c | 3 +++ include/linux/thermal.h | 1 + 2 files changed, 4 insertions(+) diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c index 299c0fb16593..5abf6d136c24 100644 --- a/drivers/thermal/thermal_sysfs.c +++ b/drivers/thermal/thermal_sysfs.c @@ -940,6 +940,9 @@ ssize_t weight_store(struct device *dev, struct device_attribute *attr, /* Don't race with governors using the 'weight' value */ mutex_lock(&instance->tz->lock); instance->weight = weight; + + thermal_governor_update_tz(instance->tz, + THERMAL_INSTANCE_WEIGHT_CHANGED); mutex_unlock(&instance->tz->lock); return count; diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 1b76878cea46..a759570de364 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h @@ -53,6 +53,7 @@ enum thermal_notify_event { THERMAL_EVENT_KEEP_ALIVE, /* Request for user space handler to respond */ THERMAL_TZ_BIND_CDEV, /* Cooling dev is bind to the thermal zone */ THERMAL_TZ_UNBIND_CDEV, /* Cooling dev is unbind from the thermal zone */ + THERMAL_INSTANCE_WEIGHT_CHANGED, /* Thermal instance weight changed */ }; /** From patchwork Wed Dec 20 23:17:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lukasz Luba X-Patchwork-Id: 181887 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:2483:b0:fb:cd0c:d3e with SMTP id q3csp68569dyi; Wed, 20 Dec 2023 15:19:34 -0800 (PST) X-Google-Smtp-Source: AGHT+IFsbR4Wvxe+D8IFp81kv/nYSRrpc6l6xE2ippjt/woJPqvNzXaEhxPCtPEwxdg7x0NJEcqR X-Received: by 2002:a05:6359:458e:b0:170:e927:f0c4 with SMTP id no14-20020a056359458e00b00170e927f0c4mr488572rwb.40.1703114373764; Wed, 20 Dec 2023 15:19:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703114373; cv=none; d=google.com; s=arc-20160816; b=S/Skibqn6+8yKM/Wv5hKZ92NlMOkD8I0x/kLtM3MpYRRoQWTKt0zwOe7ehl6d54P/T xMYEgWBrmiVA/wReg46PCZ8uOnlc3RXxFuSSVYq9MkczzBAoPfwGhlX/zx5IEb/7pV8s rb+2dePNs7FyfqxYwilHAcJngarQ4cnyhcZ4dW40FEKYJUGgfQ6cnR1/QUQXWBK7kGWa +oppN5QnE1bKe0ZhXjv5LdQqmLTmmTMbysAvOxDbfncn3ZXdJtBxtNNyU4teW5eMV0Qm sf6grf7punNeAxOXzMAhPQyi3MawXyDEsjDKIXYDMveO8t9mlrj7s530ygbQR/iUybSM RCzA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from; bh=ayV46MLdyPPdTFOCH9EhAyhS36YYlj+jH0rMkyh+vgM=; fh=BLXDRFxX5XTO46cEytehPgkEKhEpfPIIZAXbZsHkuJk=; b=zRUoAC+G+QjJyic3q+jyMc9X2/IkBwUskEicnTVudhpA0Oa8r/vN6pspGfc4qcf3wx TAYtO+rQARpHdN1Qt5u75KBc7SxKNQGG7zWJU4YZo5jwlKJCpplz9vBGXucLALReaa21 5xv0BqfB7JvPGB60wqIc8rROpezdJKoLrw4dBuhDeAevB3icI0K3o8hOBNHg3Y6bZPSf ajm3p3XbhXz+qfZYkEiQS/goysfRCK+NxKG/e0/3NA0fP4ruCb/Jeeg2oq6qD0CrJI2W Syw9+ARqnPM5C54w1V5WWvYwQgvWaVx9mWgct6gMMrvfg8LPRnv9kBVawMQMPQNQhaRG IWtQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7631-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7631-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id u12-20020a0cdd0c000000b0067efca87267si791520qvk.520.2023.12.20.15.19.33 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Dec 2023 15:19:33 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-7631-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel+bounces-7631-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-7631-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 64C8B1C24EDC for ; Wed, 20 Dec 2023 23:19:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1290B4D59C; Wed, 20 Dec 2023 23:17:10 +0000 (UTC) X-Original-To: linux-kernel@vger.kernel.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 597DB4A9BB; Wed, 20 Dec 2023 23:17:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 0F712152B; Wed, 20 Dec 2023 15:17:52 -0800 (PST) Received: from e129166.arm.com (unknown [10.57.82.217]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id D54F43F64C; Wed, 20 Dec 2023 15:17:05 -0800 (PST) From: Lukasz Luba To: linux-kernel@vger.kernel.org, rafael@kernel.org Cc: linux-pm@vger.kernel.org, daniel.lezcano@linaro.org, rui.zhang@intel.com, lukasz.luba@arm.com Subject: [PATCH v3 9/9] thermal: gov_power_allocator: Support new update callback of weights Date: Wed, 20 Dec 2023 23:17:53 +0000 Message-Id: <20231220231753.1824364-10-lukasz.luba@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20231220231753.1824364-1-lukasz.luba@arm.com> References: <20231220231753.1824364-1-lukasz.luba@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1785844857604827979 X-GMAIL-MSGID: 1785844857604827979 When the thermal instance's weight is updated from the sysfs the governor update_tz() callback is triggered. Implement proper reaction to this event in the IPA, which would save CPU cycles spent in throttle(). This will speed-up the main throttle() IPA function and clean it up a bit. Signed-off-by: Lukasz Luba --- drivers/thermal/gov_power_allocator.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/thermal/gov_power_allocator.c b/drivers/thermal/gov_power_allocator.c index b5ec60ae7efd..7b6aa265ff6a 100644 --- a/drivers/thermal/gov_power_allocator.c +++ b/drivers/thermal/gov_power_allocator.c @@ -77,6 +77,7 @@ struct power_actor { * @trip_switch_on should be NULL. * @trip_max: last passive trip point of the thermal zone. The * temperature we are controlling for. + * @total_weight: Sum of all thermal instances weights * @num_actors: number of cooling devices supporting IPA callbacks * @buffer_size: internal buffer size, to avoid runtime re-calculation * @power: buffer for all power actors internal power information @@ -88,6 +89,7 @@ struct power_allocator_params { u32 sustainable_power; const struct thermal_trip *trip_switch_on; const struct thermal_trip *trip_max; + int total_weight; unsigned int num_actors; unsigned int buffer_size; struct power_actor *power; @@ -405,16 +407,11 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) u32 total_granted_power = 0; u32 total_req_power = 0; u32 power_range, weight; - int total_weight = 0; int i = 0, ret; if (!num_actors) return -ENODEV; - list_for_each_entry(instance, &tz->thermal_instances, tz_node) - if (power_actor_is_valid(params, instance)) - total_weight += instance->weight; - /* Clean all buffers for new power estimations */ memset(power, 0, params->buffer_size); @@ -430,7 +427,7 @@ static int allocate_power(struct thermal_zone_device *tz, int control_temp) if (ret) continue; - if (!total_weight) + if (!params->total_weight) weight = 1 << FRAC_BITS; else weight = instance->weight; @@ -651,6 +648,12 @@ static void power_allocator_update_tz(struct thermal_zone_device *tz, allocate_actors_buffer(params, num_actors); break; + case THERMAL_INSTANCE_WEIGHT_CHANGED: + params->total_weight = 0; + list_for_each_entry(instance, &tz->thermal_instances, tz_node) + if (power_actor_is_valid(params, instance)) + params->total_weight += instance->weight; + break; default: break; }