From nobody Sun Feb 8 16:31:05 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D4F5C2BD5A7 for ; Fri, 23 Jan 2026 18:22:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769192546; cv=none; b=WRdjgGSQ0wxWSoXNedokrea+4/na9IUdvwJ/zFabujjNts4I5UGowc+0L/kNjgYOSx3laqPAUWXe13ppEdEIJWdufj8Wj/KmJ/tvVxkLX5GZlelmSZgbbZ6CKMSdnhVsEoc61Z0fxBdxXxZUCihVstM5mO9WaXOw4gVyqTmxwJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769192546; c=relaxed/simple; bh=SPXPIbBetVfrtSr87AGPJKY7Q8T4ACNl5x7JB3uNAOU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VI9yumzAvGc/7vDPBW6p5G73PB3Pq0NGHTuUc69D0ZAp4RipJic+1tpHwl5g/NFszCkz3L/7fAhMgCtu5enU5vIIhf0isSvLGbBXzoSc6cZH7BGk9N3sAwoK0DOF/aOfcB3i3nD5UBw//hWzj/tF5fx5n8UeUSCo1LXD6zTmfZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=AozLaqGX; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AozLaqGX" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2a0ac29fca1so18748395ad.2 for ; Fri, 23 Jan 2026 10:22:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769192544; x=1769797344; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=7zXV0Ml05DG2GM6i3iG21b9r1Ulg08rCjKLZ42eCdfw=; b=AozLaqGXFgUIo93vSYugJPxx2oCm/pnMkWWKOm+msOqL55Qfwc50yiON7ZDf8hhOBL b/NMMCN2l4aBVfq0GiCYN2W8xS47MKRhfcPYtaklDYj0/3s7tPcax/neS/RoOvks6vzi Zz//JmqINkhgRlY3kbsuLbMocH5FJJNkuWQtuT5P0hsA8byeU+97SS5kbc0p0jHAzmbZ Ry4YEIAUuntxwN7c67UgKfePQK1ZqqNxSiyVT2TRySxOJcjAOqz8MjYmb78c2rQSNAm5 OUjQhS2vwd3jZZ1GPzDOgWQkrgPNkrdwizsWUDi/0qKCwVi/ia/grUS4eMtqPatsC6W4 bkZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769192544; x=1769797344; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7zXV0Ml05DG2GM6i3iG21b9r1Ulg08rCjKLZ42eCdfw=; b=TCwYUi1XUi0hTThssyQxZqmz68qXazxW4E1DF+hFiNwAuSmjAYBhdim9Je5StegpXW SeTrdeuDytuHNTcMdkRfNEikMjG5v2yGv62YxuICCE61sC6E90GhyOMHqJgX3I6nxwWM yJom96zxA3TNsN1v//7xGAPLvN3w/Lmwq5TZsWE/h9RbmedNaprHv7xINFBkPjCTWEP0 Nh0fx0KRv867MaC/62Pnvnn/ibb05u82hkOnwkTABhuQ7N/dOalnpIgtSw2mmUXBSPdG I9nEzp6kgBaITB6R4GfaU7IGGoCovvSyGUdSWb8Q/8p8ylX48XRRgdvsZ4YAA0M0EgFB AcLQ== X-Forwarded-Encrypted: i=1; AJvYcCWWYxJ87Rh/Sp0PtJJqKTPgkmtvyD4tFviEuR2v68V2ISHJjlPMOsWt4F1GepuO5Jr3HGoNDQU1zgNMyB4=@vger.kernel.org X-Gm-Message-State: AOJu0YwuW4KqJXF+Q28tbEerY5/fLSTV4ISseTFXt2GaiOB7tTjHMIL3 ddO8KFX8b79IZg2wL4NJdwmqR5HGsfHCPJORDYpkl9j3cRzrE9S0Y2mD X-Gm-Gg: AZuq6aIPbrEEUI2zM4r58Pe3+DjnsxjhnCHYTikzz1UyRYfGosLKhbHIknwd6opJFxG TzKUy91ByD5IJRHyvCO1Ec1oiomB2y626Vu6WZXu/pZosv1EeCjxHYTqpIbMssarmVaSLtJtcYP MThJgUBvar2N9rje6+85y9hFnyw7U527E7CR6XGp9hqsS4IlpPIzvYGScG1ILgGDOn4hmve4HZb ZnKoHF8x1pNqjSLFbZ80MePr/klo0Ug+oQXmEGN1KQxmXxqOUUlg8qOL9OQmHTie9kR4OuJqe0o +dW8sX1cZC3S1z+g9O2Mhxc/01bD2T2quledNa29nOV8QwRkZ03KP3vx5dOiBunu52tAY9RzQe/ hf9a/Up6g66JR5Xy0yK02UrDTYNpsvrSS10Co3sWFX7B1ddD5YrOn4NUXhZE/v7Nh2pbC2nUqbb 4+gvvucFBx0aCvKNflVPuapXZJ X-Received: by 2002:a17:903:189:b0:2a5:8d30:58f7 with SMTP id d9443c01a7336-2a7fe56f709mr42504345ad.17.1769192543622; Fri, 23 Jan 2026 10:22:23 -0800 (PST) Received: from server.roeck-us.net ([2600:1700:e321:62f0:da43:aeff:fecc:bfd5]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2a802daa85esm25452095ad.1.2026.01.23.10.22.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 Jan 2026 10:22:22 -0800 (PST) Sender: Guenter Roeck From: Guenter Roeck To: linux-hwmon@vger.kernel.org Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Jaroslav Pulchart , "Rafael J . Wysocki" , lihuisong , Guenter Roeck Subject: [PATCH RFT 5/5] hwmon: (acpi_power_meter) Use hwmon_update_groups() to update sensor visibility Date: Fri, 23 Jan 2026 10:22:08 -0800 Message-ID: <20260123182208.2229670-6-linux@roeck-us.net> X-Mailer: git-send-email 2.45.2 In-Reply-To: <20260123182208.2229670-1-linux@roeck-us.net> References: <20260123182208.2229670-1-linux@roeck-us.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If the driver is notified about hardware a configuration change, the driver unregisters the hardware monitoring device and registers it again. This is conceptually wrong and can have unintended side effects, especially if a userspace application is in the process of reading attributes during that time. If the hardware configuration changed, call hwmon_update_groups() instead to update attribute visibility. Update driver locking to use the hardware monitoring lock for all locking operations and drop the driver internal lock. Signed-off-by: Guenter Roeck --- drivers/hwmon/acpi_power_meter.c | 37 +++++++++++--------------------- 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/drivers/hwmon/acpi_power_meter.c b/drivers/hwmon/acpi_power_me= ter.c index 29ccdc2fb7ff..59b56217e856 100644 --- a/drivers/hwmon/acpi_power_meter.c +++ b/drivers/hwmon/acpi_power_meter.c @@ -75,7 +75,6 @@ struct acpi_power_meter_capabilities { struct acpi_power_meter_resource { struct acpi_device *acpi_dev; acpi_bus_id name; - struct mutex lock; struct device *hwmon_dev; struct acpi_power_meter_capabilities caps; acpi_string model_number; @@ -445,8 +444,6 @@ static int power_meter_read(struct device *dev, enum hw= mon_sensor_types type, if (type !=3D hwmon_power) return -EINVAL; =20 - guard(mutex)(&res->lock); - switch (attr) { case hwmon_power_average: ret =3D update_meter(res); @@ -501,7 +498,6 @@ static int power_meter_write(struct device *dev, enum h= wmon_sensor_types type, if (type !=3D hwmon_power) return -EINVAL; =20 - guard(mutex)(&res->lock); switch (attr) { case hwmon_power_cap: ret =3D set_cap(res, val); @@ -547,9 +543,9 @@ static ssize_t power1_average_max_store(struct device *= dev, if (ret) return ret; =20 - mutex_lock(&res->lock); + hwmon_lock(res->hwmon_dev); ret =3D set_trip(res, POWER_METER_TRIP_AVERAGE_MAX_IDX, trip); - mutex_unlock(&res->lock); + hwmon_unlock(res->hwmon_dev); =20 return ret =3D=3D 0 ? count : ret; } @@ -566,9 +562,9 @@ static ssize_t power1_average_min_store(struct device *= dev, if (ret) return ret; =20 - mutex_lock(&res->lock); + hwmon_lock(res->hwmon_dev); ret =3D set_trip(res, POWER_METER_TRIP_AVERAGE_MIN_IDX, trip); - mutex_unlock(&res->lock); + hwmon_unlock(res->hwmon_dev); =20 return ret =3D=3D 0 ? count : ret; } @@ -825,44 +821,38 @@ static void acpi_power_meter_notify(struct acpi_devic= e *device, u32 event) =20 switch (event) { case METER_NOTIFY_CONFIG: - mutex_lock(&resource->lock); + hwmon_lock(resource->hwmon_dev); free_capabilities(resource); remove_domain_devices(resource); - hwmon_device_unregister(resource->hwmon_dev); res =3D read_capabilities(resource); if (res) dev_err_once(&device->dev, "read capabilities failed.\n"); res =3D read_domain_devices(resource); if (res && res !=3D -ENODEV) dev_err_once(&device->dev, "read domain devices failed.\n"); - resource->hwmon_dev =3D - hwmon_device_register_with_info(&device->dev, - ACPI_POWER_METER_NAME, - resource, - &power_meter_chip_info, - power_extra_groups); - if (IS_ERR(resource->hwmon_dev)) - dev_err_once(&device->dev, "register hwmon device failed.\n"); - mutex_unlock(&resource->lock); + res =3D hwmon_update_groups(resource->hwmon_dev); + if (res) + dev_err_once(&device->dev, "Failed to update hardware monitoring data\n= "); + hwmon_unlock(resource->hwmon_dev); break; case METER_NOTIFY_TRIP: sysfs_notify(&device->dev.kobj, NULL, POWER_AVERAGE_NAME); break; case METER_NOTIFY_CAP: - mutex_lock(&resource->lock); + hwmon_lock(resource->hwmon_dev); res =3D update_cap(resource); if (res) dev_err_once(&device->dev, "update cap failed when capping value is cha= nged.\n"); - mutex_unlock(&resource->lock); + hwmon_unlock(resource->hwmon_dev); sysfs_notify(&device->dev.kobj, NULL, POWER_CAP_NAME); break; case METER_NOTIFY_INTERVAL: sysfs_notify(&device->dev.kobj, NULL, POWER_AVG_INTERVAL_NAME); break; case METER_NOTIFY_CAPPING: - mutex_lock(&resource->lock); + hwmon_lock(resource->hwmon_dev); resource->power_alarm =3D true; - mutex_unlock(&resource->lock); + hwmon_unlock(resource->hwmon_dev); sysfs_notify(&device->dev.kobj, NULL, POWER_ALARM_NAME); dev_info(&device->dev, "Capping in progress.\n"); break; @@ -889,7 +879,6 @@ static int acpi_power_meter_add(struct acpi_device *dev= ice) =20 resource->sensors_valid =3D 0; resource->acpi_dev =3D device; - mutex_init(&resource->lock); strcpy(acpi_device_name(device), ACPI_POWER_METER_DEVICE_NAME); strcpy(acpi_device_class(device), ACPI_POWER_METER_CLASS); device->driver_data =3D resource; --=20 2.45.2