Re: [PATCH] thermal: imx: Fix race condition in imx_thermal_probe()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Rui,

Any comments, please?

On Wed, Feb 14, 2018 at 1:23 AM, Fabio Estevam <festevam@xxxxxxxxx> wrote:
> Hi Eduardo and Rui,
>
> On Fri, Feb 2, 2018 at 4:17 PM, Fabio Estevam <festevam@xxxxxxxxx> wrote:
>> From: Mikhail Lappo <mikhail.lappo@xxxxxxxxxxx>
>>
>> When device boots with T > T_trip_1 and requests interrupt,
>> the race condition takes place. The interrupt comes before
>> THERMAL_DEVICE_ENABLED is set. This leads to an attempt to
>> reading sensor value from irq and disabling the sensor, based on
>> the data->mode field, which expected to be THERMAL_DEVICE_ENABLED,
>> but still stays as THERMAL_DEVICE_DISABLED. Afher this issue
>> sensor is never re-enabled, as the driver state is wrong.
>>
>> Fix this problem by setting the 'data' members prior to
>> requesting the interrupts.
>>
>> Fixes: 37713a1e8e4c ("thermal: imx: implement thermal alarm interrupt handling")
>> Cc: <stable@xxxxxxxxxxxxxxx>
>> Signed-off-by: Mikhail Lappo <mikhail.lappo@xxxxxxxxxxx>
>> Signed-off-by: Fabio Estevam <fabio.estevam@xxxxxxx>
>
> A gentle ping on this patch.
>
>> ---
>>  drivers/thermal/imx_thermal.c | 6 +++---
>>  1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
>> index a67781b..ee3a215 100644
>> --- a/drivers/thermal/imx_thermal.c
>> +++ b/drivers/thermal/imx_thermal.c
>> @@ -637,6 +637,9 @@ static int imx_thermal_probe(struct platform_device *pdev)
>>         regmap_write(map, TEMPSENSE0 + REG_CLR, TEMPSENSE0_POWER_DOWN);
>>         regmap_write(map, TEMPSENSE0 + REG_SET, TEMPSENSE0_MEASURE_TEMP);
>>
>> +       data->irq_enabled = true;
>> +       data->mode = THERMAL_DEVICE_ENABLED;
>> +
>>         ret = devm_request_threaded_irq(&pdev->dev, data->irq,
>>                         imx_thermal_alarm_irq, imx_thermal_alarm_irq_thread,
>>                         0, "imx_thermal", data);
>> @@ -649,9 +652,6 @@ static int imx_thermal_probe(struct platform_device *pdev)
>>                 return ret;
>>         }
>>
>> -       data->irq_enabled = true;
>> -       data->mode = THERMAL_DEVICE_ENABLED;
>> -
>>         return 0;
>>  }
>>
>> --
>> 2.7.4
>>



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]