diff mbox series

PM / devfreq: passive: Update frequency when start governor

Message ID 20201103070646.18687-1-cw00.choi@samsung.com (mailing list archive)
State Superseded
Delegated to: Chanwoo Choi
Headers show
Series PM / devfreq: passive: Update frequency when start governor | expand

Commit Message

Chanwoo Choi Nov. 3, 2020, 7:06 a.m. UTC
If the parent device changes the their frequency before registering
the passive device, the passive device cannot receive the notification
from parent device and then the passive device cannot be able to
set the proper frequency according to the frequency of parent device.

So, when start the passive governor, update the frequency
according to the frequency of parent device.

Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
 drivers/devfreq/governor_passive.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

Comments

Marek Szyprowski Nov. 9, 2020, 9:22 a.m. UTC | #1
Hi Chanwoo,

On 03.11.2020 08:06, Chanwoo Choi wrote:
> If the parent device changes the their frequency before registering
> the passive device, the passive device cannot receive the notification
> from parent device and then the passive device cannot be able to
> set the proper frequency according to the frequency of parent device.
>
> So, when start the passive governor, update the frequency
> according to the frequency of parent device.
>
> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>

This patch landed in linux next-20201109 as commit 9b38a4f6b664 ("PM / 
devfreq: passive: Update frequency when start governor"). Sadly it 
causes the following warning on various Exynos boards with default 
exynos_defconfig build:

exynos-bus: new bus device registered: soc:bus_dmc ( 50000 KHz ~ 400000 KHz)
exynos-bus: new bus device registered: soc:bus_leftbus ( 50000 KHz ~ 
200000 KHz)
------------[ cut here ]------------
WARNING: CPU: 1 PID: 22 at drivers/devfreq/devfreq.c:411 
devfreq_update_target+0xdc/0xec
Modules linked in:
CPU: 1 PID: 22 Comm: kworker/1:1 Not tainted 5.10.0-rc2-next-20201109 #1898
Hardware name: Samsung Exynos (Flattened Device Tree)
Workqueue: events deferred_probe_work_func
[<c0111648>] (unwind_backtrace) from [<c010d000>] (show_stack+0x10/0x14)
[<c010d000>] (show_stack) from [<c0b224a0>] (dump_stack+0xb4/0xd4)
[<c0b224a0>] (dump_stack) from [<c0126844>] (__warn+0xd8/0x11c)
[<c0126844>] (__warn) from [<c0126938>] (warn_slowpath_fmt+0xb0/0xb8)
[<c0126938>] (warn_slowpath_fmt) from [<c08ae39c>] 
(devfreq_update_target+0xdc/0xec)
[<c08ae39c>] (devfreq_update_target) from [<c08afa0c>] 
(devfreq_passive_event_handler+0x80/0xc4)
[<c08afa0c>] (devfreq_passive_event_handler) from [<c08ade70>] 
(devfreq_add_device+0x4f8/0x5a0)
[<c08ade70>] (devfreq_add_device) from [<c08adf60>] 
(devm_devfreq_add_device+0x48/0x84)
[<c08adf60>] (devm_devfreq_add_device) from [<c08b01c8>] 
(exynos_bus_probe+0x2ac/0x5c8)
[<c08b01c8>] (exynos_bus_probe) from [<c0692a70>] 
(platform_drv_probe+0x6c/0xa4)
[<c0692a70>] (platform_drv_probe) from [<c0690020>] 
(really_probe+0x200/0x4fc)
[<c0690020>] (really_probe) from [<c06904e4>] 
(driver_probe_device+0x78/0x1fc)
[<c06904e4>] (driver_probe_device) from [<c068de7c>] 
(bus_for_each_drv+0x74/0xb8)
[<c068de7c>] (bus_for_each_drv) from [<c068fd80>] 
(__device_attach+0xe4/0x17c)
[<c068fd80>] (__device_attach) from [<c068ee40>] 
(bus_probe_device+0x88/0x90)
[<c068ee40>] (bus_probe_device) from [<c068f358>] 
(deferred_probe_work_func+0x3c/0xd0)
[<c068f358>] (deferred_probe_work_func) from [<c0148a70>] 
(process_one_work+0x234/0x7e4)
[<c0148a70>] (process_one_work) from [<c0149064>] (worker_thread+0x44/0x51c)
[<c0149064>] (worker_thread) from [<c014fdc8>] (kthread+0x158/0x1a0)
[<c014fdc8>] (kthread) from [<c010011c>] (ret_from_fork+0x14/0x38)
Exception stack(0xc1e27fb0 to 0xc1e27ff8)
7fa0:                                     00000000 00000000 00000000 
00000000
7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
00000000
7fe0: 00000000 00000000 00000000 00000000 00000013 00000000
irq event stamp: 12147
hardirqs last  enabled at (12171): [<c01a0358>] console_unlock+0x430/0x6b0
dwc2 12480000.hsotg: new device is high-speed
hardirqs last disabled at (12176): [<c01a0350>] console_unlock+0x428/0x6b0
softirqs last  enabled at (12168): [<c01017a8>] __do_softirq+0x528/0x674
softirqs last disabled at (12155): [<c012fdb0>] irq_exit+0x1dc/0x1e8
---[ end trace 89c1007ec29b9250 ]---

Reverting it on top of the linux-next fixes the warning, but I assume 
that the proper fix would require locking changes during the devfreq 
registration.

> ---
>   drivers/devfreq/governor_passive.c | 15 +++++++++++++++
>   1 file changed, 15 insertions(+)
>
> diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c
> index 63332e4a65ae..375aa636027c 100644
> --- a/drivers/devfreq/governor_passive.c
> +++ b/drivers/devfreq/governor_passive.c
> @@ -141,6 +141,21 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq,
>   		if (!p_data->this)
>   			p_data->this = devfreq;
>   
> +		/*
> +		 * If the parent device changes the their frequency before
> +		 * registering the passive device, the passive device cannot
> +		 * receive the notification from parent device and then the
> +		 * passive device cannot be able to set the proper frequency
> +		 * according to the frequency of parent device.
> +		 *
> +		 * When start the passive governor, update the frequency
> +		 * according to the frequency of parent device.
> +		 */
> +		ret = devfreq_update_target(devfreq, parent->previous_freq);
> +		if (ret < 0)
> +			dev_warn(&devfreq->dev,
> +			"failed to update devfreq using passive governor\n");
> +
>   		nb->notifier_call = devfreq_passive_notifier_call;
>   		ret = devfreq_register_notifier(parent, nb,
>   					DEVFREQ_TRANSITION_NOTIFIER);

Best regards
Chanwoo Choi Nov. 9, 2020, 9:37 a.m. UTC | #2
Hi Marek,

Thanks for bug reporting. I'll check and fix it. 

Best Regards,
Chanwoo Choi

On 11/9/20 6:22 PM, Marek Szyprowski wrote:
> Hi Chanwoo,
> 
> On 03.11.2020 08:06, Chanwoo Choi wrote:
>> If the parent device changes the their frequency before registering
>> the passive device, the passive device cannot receive the notification
>> from parent device and then the passive device cannot be able to
>> set the proper frequency according to the frequency of parent device.
>>
>> So, when start the passive governor, update the frequency
>> according to the frequency of parent device.
>>
>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
> 
> This patch landed in linux next-20201109 as commit 9b38a4f6b664 ("PM / 
> devfreq: passive: Update frequency when start governor"). Sadly it 
> causes the following warning on various Exynos boards with default 
> exynos_defconfig build:
> 
> exynos-bus: new bus device registered: soc:bus_dmc ( 50000 KHz ~ 400000 KHz)
> exynos-bus: new bus device registered: soc:bus_leftbus ( 50000 KHz ~ 
> 200000 KHz)
> ------------[ cut here ]------------
> WARNING: CPU: 1 PID: 22 at drivers/devfreq/devfreq.c:411 
> devfreq_update_target+0xdc/0xec
> Modules linked in:
> CPU: 1 PID: 22 Comm: kworker/1:1 Not tainted 5.10.0-rc2-next-20201109 #1898
> Hardware name: Samsung Exynos (Flattened Device Tree)
> Workqueue: events deferred_probe_work_func
> [<c0111648>] (unwind_backtrace) from [<c010d000>] (show_stack+0x10/0x14)
> [<c010d000>] (show_stack) from [<c0b224a0>] (dump_stack+0xb4/0xd4)
> [<c0b224a0>] (dump_stack) from [<c0126844>] (__warn+0xd8/0x11c)
> [<c0126844>] (__warn) from [<c0126938>] (warn_slowpath_fmt+0xb0/0xb8)
> [<c0126938>] (warn_slowpath_fmt) from [<c08ae39c>] 
> (devfreq_update_target+0xdc/0xec)
> [<c08ae39c>] (devfreq_update_target) from [<c08afa0c>] 
> (devfreq_passive_event_handler+0x80/0xc4)
> [<c08afa0c>] (devfreq_passive_event_handler) from [<c08ade70>] 
> (devfreq_add_device+0x4f8/0x5a0)
> [<c08ade70>] (devfreq_add_device) from [<c08adf60>] 
> (devm_devfreq_add_device+0x48/0x84)
> [<c08adf60>] (devm_devfreq_add_device) from [<c08b01c8>] 
> (exynos_bus_probe+0x2ac/0x5c8)
> [<c08b01c8>] (exynos_bus_probe) from [<c0692a70>] 
> (platform_drv_probe+0x6c/0xa4)
> [<c0692a70>] (platform_drv_probe) from [<c0690020>] 
> (really_probe+0x200/0x4fc)
> [<c0690020>] (really_probe) from [<c06904e4>] 
> (driver_probe_device+0x78/0x1fc)
> [<c06904e4>] (driver_probe_device) from [<c068de7c>] 
> (bus_for_each_drv+0x74/0xb8)
> [<c068de7c>] (bus_for_each_drv) from [<c068fd80>] 
> (__device_attach+0xe4/0x17c)
> [<c068fd80>] (__device_attach) from [<c068ee40>] 
> (bus_probe_device+0x88/0x90)
> [<c068ee40>] (bus_probe_device) from [<c068f358>] 
> (deferred_probe_work_func+0x3c/0xd0)
> [<c068f358>] (deferred_probe_work_func) from [<c0148a70>] 
> (process_one_work+0x234/0x7e4)
> [<c0148a70>] (process_one_work) from [<c0149064>] (worker_thread+0x44/0x51c)
> [<c0149064>] (worker_thread) from [<c014fdc8>] (kthread+0x158/0x1a0)
> [<c014fdc8>] (kthread) from [<c010011c>] (ret_from_fork+0x14/0x38)
> Exception stack(0xc1e27fb0 to 0xc1e27ff8)
> 7fa0:                                     00000000 00000000 00000000 
> 00000000
> 7fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
> 00000000
> 7fe0: 00000000 00000000 00000000 00000000 00000013 00000000
> irq event stamp: 12147
> hardirqs last  enabled at (12171): [<c01a0358>] console_unlock+0x430/0x6b0
> dwc2 12480000.hsotg: new device is high-speed
> hardirqs last disabled at (12176): [<c01a0350>] console_unlock+0x428/0x6b0
> softirqs last  enabled at (12168): [<c01017a8>] __do_softirq+0x528/0x674
> softirqs last disabled at (12155): [<c012fdb0>] irq_exit+0x1dc/0x1e8
> ---[ end trace 89c1007ec29b9250 ]---
> 
> Reverting it on top of the linux-next fixes the warning, but I assume 
> that the proper fix would require locking changes during the devfreq 
> registration.
> 
>> ---
>>   drivers/devfreq/governor_passive.c | 15 +++++++++++++++
>>   1 file changed, 15 insertions(+)
>>
>> diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c
>> index 63332e4a65ae..375aa636027c 100644
>> --- a/drivers/devfreq/governor_passive.c
>> +++ b/drivers/devfreq/governor_passive.c
>> @@ -141,6 +141,21 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq,
>>   		if (!p_data->this)
>>   			p_data->this = devfreq;
>>   
>> +		/*
>> +		 * If the parent device changes the their frequency before
>> +		 * registering the passive device, the passive device cannot
>> +		 * receive the notification from parent device and then the
>> +		 * passive device cannot be able to set the proper frequency
>> +		 * according to the frequency of parent device.
>> +		 *
>> +		 * When start the passive governor, update the frequency
>> +		 * according to the frequency of parent device.
>> +		 */
>> +		ret = devfreq_update_target(devfreq, parent->previous_freq);
>> +		if (ret < 0)
>> +			dev_warn(&devfreq->dev,
>> +			"failed to update devfreq using passive governor\n");
>> +
>>   		nb->notifier_call = devfreq_passive_notifier_call;
>>   		ret = devfreq_register_notifier(parent, nb,
>>   					DEVFREQ_TRANSITION_NOTIFIER);
> 
> Best regards
>
diff mbox series

Patch

diff --git a/drivers/devfreq/governor_passive.c b/drivers/devfreq/governor_passive.c
index 63332e4a65ae..375aa636027c 100644
--- a/drivers/devfreq/governor_passive.c
+++ b/drivers/devfreq/governor_passive.c
@@ -141,6 +141,21 @@  static int devfreq_passive_event_handler(struct devfreq *devfreq,
 		if (!p_data->this)
 			p_data->this = devfreq;
 
+		/*
+		 * If the parent device changes the their frequency before
+		 * registering the passive device, the passive device cannot
+		 * receive the notification from parent device and then the
+		 * passive device cannot be able to set the proper frequency
+		 * according to the frequency of parent device.
+		 *
+		 * When start the passive governor, update the frequency
+		 * according to the frequency of parent device.
+		 */
+		ret = devfreq_update_target(devfreq, parent->previous_freq);
+		if (ret < 0)
+			dev_warn(&devfreq->dev,
+			"failed to update devfreq using passive governor\n");
+
 		nb->notifier_call = devfreq_passive_notifier_call;
 		ret = devfreq_register_notifier(parent, nb,
 					DEVFREQ_TRANSITION_NOTIFIER);