Received: by 2002:a05:7412:419a:b0:f3:1519:9f41 with SMTP id i26csp4722261rdh; Wed, 29 Nov 2023 08:54:18 -0800 (PST) X-Google-Smtp-Source: AGHT+IHliGGBydzx6zNO+HvlKeaeFXV3PhwMN8GoAFJ0xRCh70D2sjKc8KeUPGXfwVTwUiaN7sN4 X-Received: by 2002:a17:90a:1a5d:b0:285:6412:ffe7 with SMTP id 29-20020a17090a1a5d00b002856412ffe7mr18556512pjl.27.1701276857673; Wed, 29 Nov 2023 08:54:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701276857; cv=none; d=google.com; s=arc-20160816; b=f/tTDRx+JKIkWEKv+tJTm60imiu4XyqfJyjsVhrwMdlhsRMfBKppIgQ3GdI+OAef8O sIJiR6Sj/By5dqac+MZwc/xSVn8IbRjY4GXgBynLTB/Ow0+cX4r7fVEJB/BfneseRxsk v9TSDtrsHDUzIDB7fCmr/oHyNngAD+mQI0r8o1pvHxNol5zNk9L7EUfXur3yKWhj91MP h1GQu4QP0uyZX37J3Nzlx5Rf24YoDvncv0vOzY4HZ1byjiLCPEm/bJO/X3ZUusw3BJzA bovsYbmkfjTZDXIzF2VMSRFJNotxGmCNm5Ffun1V7GwNwPtpoa0E8Tw8kegoxXuM27s/ Af0g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=KzCsfdBE7WkJbZOrYaWER7MpwPAWaQ/409ygwrMaF7U=; fh=lwSoWzxFgElz870zfiYjK9IUzI6DgmKcUjvGVkpbGwE=; b=IbA38NA4o2moq3bPyrQeDf+b+cih0016ySJokKU43pgkg6+/fX4M1McoywcAfUxSKh A1NNUZWG0nlXSItMSa20t/7CcifGqXkzE/Yom9qWJ8GlDtxKYGpL76I3F0SH0AbRT3X2 6dUnHDGn39h6446RVB1Bhoh7blI6fCIfsdQkDuyMIlwYM/0wdXNj0yMd790vsmZFJm4c UboK4siJXMHBr2ZyFMeUFGUMtPXcGWtmeJ1hltHp9DPi9bwbwBcdnSQz66KglqhIPGw0 56kV+pn9jLeSqibuOF+JdLCuvvPYnpQQ7NO8ndXvPT4Xw1LAqPLGeVnqiC11XOnAuN/j r2uw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jfG8X4mf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id f20-20020a17090ac29400b00262ca5c4c12si1562485pjt.178.2023.11.29.08.54.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Nov 2023 08:54:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=jfG8X4mf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 396F0804C1BC; Wed, 29 Nov 2023 08:54:14 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229799AbjK2Qxx (ORCPT + 99 others); Wed, 29 Nov 2023 11:53:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59874 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229498AbjK2Qxv (ORCPT ); Wed, 29 Nov 2023 11:53:51 -0500 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 07276B6 for ; Wed, 29 Nov 2023 08:53:57 -0800 (PST) Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-332c0c32d19so4499f8f.3 for ; Wed, 29 Nov 2023 08:53:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1701276835; x=1701881635; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=KzCsfdBE7WkJbZOrYaWER7MpwPAWaQ/409ygwrMaF7U=; b=jfG8X4mfovjdLYdd1+OXNyAjqIo5Zcxf1Fi6hkebiR955zw5vDDv+W41rktDnlLU11 AMOsg+h9yUxZQaMMz00ALtoWKnOt5CR0Uf6kW6VaRIGHIeEr1NzUWLqnIpgkr0yXVpn8 9P1QczoBC9u8/aUdOoXMM0BnDRVyrNw3KB78HrxAiUjjUb3Abmvmydd9S05O+JNNPOhF FyyNtvTLWTXbf24z4Gs4ZFcMRF4Rj8f6ABwpuna04KLr4vi62cYbM9scgRr7hUffanMc 5ffnHgMDh9qhioxMgfNPk6DoN/dh+NUVO63t6bebjMnoHedkT9Cd2akBVU1Wu0kI3ghX wdQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701276835; x=1701881635; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=KzCsfdBE7WkJbZOrYaWER7MpwPAWaQ/409ygwrMaF7U=; b=ZX+uikziWaO09u7GOIm118EVn+En/+a6gYzgfMVwNI+Ud5edyqUGQbN7NqjmrOMU/m hOXQ1MCdtya/a4j2jylM9E6w51/GlYTWtMcIrNGQQCghiMe9mauNaKnK+0J0eHpoV9KT 5COiiTFfPrS2axFYy0Sl90UC005LBvT7vL8gry0yWszpUDPrKjyzqgki3XVxmGdNa1o4 cIB3JdiQ2D0ts+gLEaEK1DQsKPwy06aLW7d7d5AqyQ3ov04v2uBgokE3J2G4M3Q3wJsi vqI+fh7yraVQYbETwf2jwvP1tyIFun7ZxVkVVVFnB5i0nXDiYPuWHpZc4qwoJD+nefMq 1GPw== X-Gm-Message-State: AOJu0YwRSuNjoJLymgaBvOeAxO6dCUWE0YD6WdBDaIFVlCpVmyn9/1h1 Jr2Hs6tH4XVJLLYlUcLHO6e3pA== X-Received: by 2002:a05:6000:c12:b0:332:ffcc:861b with SMTP id dn18-20020a0560000c1200b00332ffcc861bmr8104628wrb.1.1701276835407; Wed, 29 Nov 2023 08:53:55 -0800 (PST) Received: from ?IPV6:2a05:6e02:1041:c10:38f1:13b7:9b7a:2d6b? ([2a05:6e02:1041:c10:38f1:13b7:9b7a:2d6b]) by smtp.googlemail.com with ESMTPSA id x1-20020adfec01000000b003313e4dddecsm18374499wrn.108.2023.11.29.08.53.54 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 29 Nov 2023 08:53:55 -0800 (PST) Message-ID: Date: Wed, 29 Nov 2023 17:53:54 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3 2/2] thermal: trip: Rework thermal_zone_set_trip() and its callers Content-Language: en-US To: "Rafael J. Wysocki" , Linux PM Cc: LKML , Srinivas Pandruvada , Zhang Rui , Lukasz Luba References: <12350772.O9o76ZdvQC@kreacher> <4869676.GXAFRqVoOG@kreacher> From: Daniel Lezcano In-Reply-To: <4869676.GXAFRqVoOG@kreacher> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.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 (howler.vger.email [0.0.0.0]); Wed, 29 Nov 2023 08:54:14 -0800 (PST) Hi Rafael, On 29/11/2023 14:38, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki > > Both trip_point_temp_store() and trip_point_hyst_store() use > thermal_zone_set_trip() to update a given trip point, but none of them > actually needs to change more than one field in struct thermal_trip > representing it. However, each of them effectively calls > __thermal_zone_get_trip() twice in a row for the same trip index value, > once directly and once via thermal_zone_set_trip(), which is not > particularly efficient, and the way in which thermal_zone_set_trip() > carries out the update is not particularly straightforward. > > Moreover, some checks done by them both need not go under the thermal > zone lock and code duplication between them can be reduced quite a bit > by moving the majority of logic into thermal_zone_set_trip(). > > Rework all of the above functions to address the above. Please hold on before merging this change. I've some comment about it but I have to double check a couple of things before > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki > --- > > v2 -> v3: Fix missing return statement in thermal_zone_set_trip() (Lukasz). > > v1 -> v2: > * Fix 2 typos in the changelog (Lukasz). > * Split one change into the [1/2]. > > --- > drivers/thermal/thermal_core.h | 9 ++++++ > drivers/thermal/thermal_sysfs.c | 52 ++++++++-------------------------- > drivers/thermal/thermal_trip.c | 60 +++++++++++++++++++++++++++------------- > include/linux/thermal.h | 3 -- > 4 files changed, 62 insertions(+), 62 deletions(-) > > Index: linux-pm/drivers/thermal/thermal_core.h > =================================================================== > --- linux-pm.orig/drivers/thermal/thermal_core.h > +++ linux-pm/drivers/thermal/thermal_core.h > @@ -122,6 +122,15 @@ void __thermal_zone_device_update(struct > void __thermal_zone_set_trips(struct thermal_zone_device *tz); > int __thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, > struct thermal_trip *trip); > + > +enum thermal_set_trip_target { > + THERMAL_TRIP_SET_TEMP, > + THERMAL_TRIP_SET_HYST, > +}; > + > +int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id, > + enum thermal_set_trip_target what, const char *buf); > + > int thermal_zone_trip_id(struct thermal_zone_device *tz, > const struct thermal_trip *trip); > int __thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp); > Index: linux-pm/drivers/thermal/thermal_sysfs.c > =================================================================== > --- linux-pm.orig/drivers/thermal/thermal_sysfs.c > +++ linux-pm/drivers/thermal/thermal_sysfs.c > @@ -120,31 +120,17 @@ trip_point_temp_store(struct device *dev > const char *buf, size_t count) > { > struct thermal_zone_device *tz = to_thermal_zone(dev); > - struct thermal_trip trip; > - int trip_id, ret; > + int trip_id; > + int ret; > + > + if (!device_is_registered(dev)) > + return -ENODEV; > > if (sscanf(attr->attr.name, "trip_point_%d_temp", &trip_id) != 1) > return -EINVAL; > > - mutex_lock(&tz->lock); > - > - if (!device_is_registered(dev)) { > - ret = -ENODEV; > - goto unlock; > - } > - > - ret = __thermal_zone_get_trip(tz, trip_id, &trip); > - if (ret) > - goto unlock; > - > - ret = kstrtoint(buf, 10, &trip.temperature); > - if (ret) > - goto unlock; > + ret = thermal_zone_set_trip(tz, trip_id, THERMAL_TRIP_SET_TEMP, buf); > > - ret = thermal_zone_set_trip(tz, trip_id, &trip); > -unlock: > - mutex_unlock(&tz->lock); > - > return ret ? ret : count; > } > > @@ -179,30 +165,16 @@ trip_point_hyst_store(struct device *dev > const char *buf, size_t count) > { > struct thermal_zone_device *tz = to_thermal_zone(dev); > - struct thermal_trip trip; > - int trip_id, ret; > + int trip_id; > + int ret; > + > + if (!device_is_registered(dev)) > + return -ENODEV; > > if (sscanf(attr->attr.name, "trip_point_%d_hyst", &trip_id) != 1) > return -EINVAL; > > - mutex_lock(&tz->lock); > - > - if (!device_is_registered(dev)) { > - ret = -ENODEV; > - goto unlock; > - } > - > - ret = __thermal_zone_get_trip(tz, trip_id, &trip); > - if (ret) > - goto unlock; > - > - ret = kstrtoint(buf, 10, &trip.hysteresis); > - if (ret) > - goto unlock; > - > - ret = thermal_zone_set_trip(tz, trip_id, &trip); > -unlock: > - mutex_unlock(&tz->lock); > + ret = thermal_zone_set_trip(tz, trip_id, THERMAL_TRIP_SET_HYST, buf); > > return ret ? ret : count; > } > Index: linux-pm/drivers/thermal/thermal_trip.c > =================================================================== > --- linux-pm.orig/drivers/thermal/thermal_trip.c > +++ linux-pm/drivers/thermal/thermal_trip.c > @@ -148,39 +148,61 @@ int thermal_zone_get_trip(struct thermal > EXPORT_SYMBOL_GPL(thermal_zone_get_trip); > > int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id, > - const struct thermal_trip *trip) > + enum thermal_set_trip_target what, const char *buf) > { > - struct thermal_trip t; > - int ret; > + struct thermal_trip *trip; > + int val, ret = 0; > > - ret = __thermal_zone_get_trip(tz, trip_id, &t); > + if (trip_id < 0 || trip_id >= tz->num_trips) > + return -EINVAL; > + > + ret = kstrtoint(buf, 10, &val); > if (ret) > return ret; > > - if (t.type != trip->type) > - return -EINVAL; > + mutex_lock(&tz->lock); > > - if (t.temperature != trip->temperature && tz->ops->set_trip_temp) { > - ret = tz->ops->set_trip_temp(tz, trip_id, trip->temperature); > - if (ret) > - return ret; > - } > + trip = &tz->trips[trip_id]; > > - if (t.hysteresis != trip->hysteresis && tz->ops->set_trip_hyst) { > - ret = tz->ops->set_trip_hyst(tz, trip_id, trip->hysteresis); > - if (ret) > - return ret; > + switch (what) { > + case THERMAL_TRIP_SET_TEMP: > + if (val == trip->temperature) > + goto unlock; > + > + if (tz->ops->set_trip_temp) { > + ret = tz->ops->set_trip_temp(tz, trip_id, val); > + if (ret) > + goto unlock; > + } > + trip->temperature = val; > + break; > + > + case THERMAL_TRIP_SET_HYST: > + if (val == trip->hysteresis) > + goto unlock; > + > + if (tz->ops->set_trip_hyst) { > + ret = tz->ops->set_trip_hyst(tz, trip_id, val); > + if (ret) > + goto unlock; > + } > + trip->hysteresis = val; > + break; > + > + default: > + ret = -EINVAL; > + goto unlock; > } > > - if (tz->trips && (t.temperature != trip->temperature || t.hysteresis != trip->hysteresis)) > - tz->trips[trip_id] = *trip; > - > thermal_notify_tz_trip_change(tz->id, trip_id, trip->type, > trip->temperature, trip->hysteresis); > > __thermal_zone_device_update(tz, THERMAL_TRIP_CHANGED); > > - return 0; > +unlock: > + mutex_unlock(&tz->lock); > + > + return ret; > } > > int thermal_zone_trip_id(struct thermal_zone_device *tz, > Index: linux-pm/include/linux/thermal.h > =================================================================== > --- linux-pm.orig/include/linux/thermal.h > +++ linux-pm/include/linux/thermal.h > @@ -283,9 +283,6 @@ int __thermal_zone_get_trip(struct therm > int thermal_zone_get_trip(struct thermal_zone_device *tz, int trip_id, > struct thermal_trip *trip); > > -int thermal_zone_set_trip(struct thermal_zone_device *tz, int trip_id, > - const struct thermal_trip *trip); > - > int for_each_thermal_trip(struct thermal_zone_device *tz, > int (*cb)(struct thermal_trip *, void *), > void *data); > > > -- Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog