* [PATCH v2] thermal: sysfs: Return ENODATA instead of EAGAIN for reads
@ 2025-05-12 5:52 Hsin-Te Yuan
2025-05-20 18:28 ` Rafael J. Wysocki
0 siblings, 1 reply; 2+ messages in thread
From: Hsin-Te Yuan @ 2025-05-12 5:52 UTC (permalink / raw)
To: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba
Cc: linux-pm, linux-kernel, Hsin-Te Yuan
According to POSIX spec, EAGAIN returned by read with O_NONBLOCK set
means the read would block. Hence, the common implementation in
nonblocking model will poll the file when the nonblocking read returns
EAGAIN. However, when the target file is thermal zone, this mechanism
will totally malfunction because thermal zone doesn't implement sysfs
notification and thus the poll will never return.
For example, the read in Golang implemnts such method and sometimes
hangs at reading some thermal zones via sysfs.
Change to throw ENODATA instead of EAGAIN to userspace.
Signed-off-by: Hsin-Te Yuan <yuanhsinte@chromium.org>
---
Changes in v2:
- Modify commit message to make it clear
- Link to v1: https://lore.kernel.org/r/20250409-temp-v1-1-9a391d8c60fd@chromium.org
---
drivers/thermal/thermal_sysfs.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
index 24b9055a0b6c515b865e0d7e2db1d0de176ff767..3d1713e053dfb867933d95131f1f2491d2ecd07e 100644
--- a/drivers/thermal/thermal_sysfs.c
+++ b/drivers/thermal/thermal_sysfs.c
@@ -40,8 +40,11 @@ temp_show(struct device *dev, struct device_attribute *attr, char *buf)
ret = thermal_zone_get_temp(tz, &temperature);
- if (ret)
+ if (ret) {
+ if (ret == -EAGAIN)
+ return -ENODATA;
return ret;
+ }
return sprintf(buf, "%d\n", temperature);
}
---
base-commit: 82f2b0b97b36ee3fcddf0f0780a9a0825d52fec3
change-id: 20250409-temp-6ebd13ad0dbd
Best regards,
--
Hsin-Te Yuan <yuanhsinte@chromium.org>
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] thermal: sysfs: Return ENODATA instead of EAGAIN for reads
2025-05-12 5:52 [PATCH v2] thermal: sysfs: Return ENODATA instead of EAGAIN for reads Hsin-Te Yuan
@ 2025-05-20 18:28 ` Rafael J. Wysocki
0 siblings, 0 replies; 2+ messages in thread
From: Rafael J. Wysocki @ 2025-05-20 18:28 UTC (permalink / raw)
To: Hsin-Te Yuan
Cc: Rafael J. Wysocki, Daniel Lezcano, Zhang Rui, Lukasz Luba,
linux-pm, linux-kernel
On Mon, May 12, 2025 at 7:53 AM Hsin-Te Yuan <yuanhsinte@chromium.org> wrote:
>
> According to POSIX spec, EAGAIN returned by read with O_NONBLOCK set
> means the read would block. Hence, the common implementation in
> nonblocking model will poll the file when the nonblocking read returns
> EAGAIN. However, when the target file is thermal zone, this mechanism
> will totally malfunction because thermal zone doesn't implement sysfs
> notification and thus the poll will never return.
>
> For example, the read in Golang implemnts such method and sometimes
> hangs at reading some thermal zones via sysfs.
>
> Change to throw ENODATA instead of EAGAIN to userspace.
>
> Signed-off-by: Hsin-Te Yuan <yuanhsinte@chromium.org>
> ---
> Changes in v2:
> - Modify commit message to make it clear
> - Link to v1: https://lore.kernel.org/r/20250409-temp-v1-1-9a391d8c60fd@chromium.org
> ---
> drivers/thermal/thermal_sysfs.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c
> index 24b9055a0b6c515b865e0d7e2db1d0de176ff767..3d1713e053dfb867933d95131f1f2491d2ecd07e 100644
> --- a/drivers/thermal/thermal_sysfs.c
> +++ b/drivers/thermal/thermal_sysfs.c
> @@ -40,8 +40,11 @@ temp_show(struct device *dev, struct device_attribute *attr, char *buf)
>
> ret = thermal_zone_get_temp(tz, &temperature);
>
> - if (ret)
> + if (ret) {
> + if (ret == -EAGAIN)
> + return -ENODATA;
> return ret;
> + }
I would prefer to do
if (ret == -EAGAIN)
return -ENODATA;
if (ret)
return ret;
here or even
if (!ret)
return sprintf(buf, "%d\n", temperature);
if (ret == -EAGAIN)
return -ENODATA;
return ret;
if you want to optimize for the success case.
>
> return sprintf(buf, "%d\n", temperature);
> }
>
> ---
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2025-05-20 18:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-12 5:52 [PATCH v2] thermal: sysfs: Return ENODATA instead of EAGAIN for reads Hsin-Te Yuan
2025-05-20 18:28 ` Rafael J. Wysocki
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox