mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
hwmon: (raspberrypi) Fix delayed-work teardown race
The delayed polling work rearms itself from the work function, so use explicit delayed-work setup and cleanup instead of devm_delayed_work_autocancel(). Initialize the delayed work with INIT_DELAYED_WORK() and register a devres cleanup action that calls disable_delayed_work_sync() during teardown. This addresses the concern raised during review about the polling work being able to requeue itself while the driver is being removed. Signed-off-by: Shubham Chakraborty <chakrabortyshubham66@gmail.com> Link: https://lore.kernel.org/r/20260517080445.103962-4-chakrabortyshubham66@gmail.com Signed-off-by: Guenter Roeck <linux@roeck-us.net>
This commit is contained in:
committed by
Guenter Roeck
parent
78a3e36eec
commit
eb0d491e27
@@ -8,7 +8,6 @@
|
||||
* Copyright (C) 2026 Shubham Chakraborty <chakrabortyshubham66@gmail.com>
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
#include <linux/devm-helpers.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/hwmon.h>
|
||||
#include <linux/module.h>
|
||||
@@ -97,6 +96,13 @@ static void get_values_poll(struct work_struct *work)
|
||||
schedule_delayed_work(&data->get_values_poll_work, 2 * HZ);
|
||||
}
|
||||
|
||||
static void rpi_hwmon_cancel_poll_work(void *res)
|
||||
{
|
||||
struct rpi_hwmon_data *data = res;
|
||||
|
||||
disable_delayed_work_sync(&data->get_values_poll_work);
|
||||
}
|
||||
|
||||
static int rpi_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
u32 attr, int channel, long *val)
|
||||
{
|
||||
@@ -238,8 +244,8 @@ static int rpi_hwmon_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(data->hwmon_dev))
|
||||
return PTR_ERR(data->hwmon_dev);
|
||||
|
||||
ret = devm_delayed_work_autocancel(dev, &data->get_values_poll_work,
|
||||
get_values_poll);
|
||||
INIT_DELAYED_WORK(&data->get_values_poll_work, get_values_poll);
|
||||
ret = devm_add_action_or_reset(dev, rpi_hwmon_cancel_poll_work, data);
|
||||
if (ret)
|
||||
return ret;
|
||||
platform_set_drvdata(pdev, data);
|
||||
|
||||
Reference in New Issue
Block a user