The callback of CPU_STARTING event can't sleep and so acpi_cpu_soft_notify()
return directly when CPU_STARTING event is triggered. But cpu hotplug also
happens during S2RAM. The action will become CPU_STARTING_FROZEN. This
patch is to fix missing check the frozen event.
Signed-off-by: Lan Tianyu <[email protected]>
---
drivers/acpi/processor_driver.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
index 4fcbd67..66e2249 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -125,7 +125,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,
* CPU_STARTING and CPU_DYING must not sleep. Return here since
* acpi_bus_get_device() may sleep.
*/
- if (action == CPU_STARTING || action == CPU_DYING)
+ if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING || action == CPU_DYING)
return NOTIFY_DONE;
if (!pr || acpi_bus_get_device(pr->handle, &device))
--
1.8.4.rc0.1.g8f6a3e5.dirty
On Thursday, July 31, 2014 05:20:26 PM Lan Tianyu wrote:
> The callback of CPU_STARTING event can't sleep and so acpi_cpu_soft_notify()
> return directly when CPU_STARTING event is triggered. But cpu hotplug also
> happens during S2RAM. The action will become CPU_STARTING_FROZEN. This
> patch is to fix missing check the frozen event.
>
> Signed-off-by: Lan Tianyu <[email protected]>
There is work to restructure the handling of CPU_TASKS_FROZEN under way
and Chen Gong is driving it. That's likely to conflict with the last
two patches from you. Can you pleaes coordinate with Gong?
Rafael
> ---
> drivers/acpi/processor_driver.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
> index 4fcbd67..66e2249 100644
> --- a/drivers/acpi/processor_driver.c
> +++ b/drivers/acpi/processor_driver.c
> @@ -125,7 +125,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,
> * CPU_STARTING and CPU_DYING must not sleep. Return here since
> * acpi_bus_get_device() may sleep.
> */
> - if (action == CPU_STARTING || action == CPU_DYING)
> + if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING || action == CPU_DYING)
> return NOTIFY_DONE;
>
> if (!pr || acpi_bus_get_device(pr->handle, &device))
>
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
On 2014年08月01日 05:20, Rafael J. Wysocki wrote:
> On Thursday, July 31, 2014 05:20:26 PM Lan Tianyu wrote:
>> The callback of CPU_STARTING event can't sleep and so acpi_cpu_soft_notify()
>> return directly when CPU_STARTING event is triggered. But cpu hotplug also
>> happens during S2RAM. The action will become CPU_STARTING_FROZEN. This
>> patch is to fix missing check the frozen event.
>>
>> Signed-off-by: Lan Tianyu <[email protected]>
>
> There is work to restructure the handling of CPU_TASKS_FROZEN under way
> and Chen Gong is driving it. That's likely to conflict with the last
> two patches from you. Can you please coordinate with Gong?
Hi Rafael:
Thanks for reminder. I just checked Chen Gong's patchset "Gloabl CPU
Hot-plug flag _FROZEN Clean up". There is no conflict between our
patches. Gong's patch is to remove the following macro.
CPU_ONLINE_FROZEN
CPU_UP_PREPARE_FROZEN
CPU_UP_CANCELED_FROZEN
CPU_DOWN_PREPARE_FROZEN
CPU_DOWN_FAILED_FROZEN
CPU_DEAD_FROZEN
CPU_DYING_FROZEN
CPU_STARTING_FROZEN
CPU_TASKS_FROZEN is still available and the CPU events during S2RAM
are still (CPU_xxx | CPU_TASKS_FROZEN).
BTW, this is a bug fix from my opinion and it should be backported to
stable tree.
>
> Rafael
>
>
>> ---
>> drivers/acpi/processor_driver.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
>> index 4fcbd67..66e2249 100644
>> --- a/drivers/acpi/processor_driver.c
>> +++ b/drivers/acpi/processor_driver.c
>> @@ -125,7 +125,7 @@ static int acpi_cpu_soft_notify(struct notifier_block *nfb,
>> * CPU_STARTING and CPU_DYING must not sleep. Return here since
>> * acpi_bus_get_device() may sleep.
>> */
>> - if (action == CPU_STARTING || action == CPU_DYING)
>> + if ((action & ~CPU_TASKS_FROZEN) == CPU_STARTING || action == CPU_DYING)
>> return NOTIFY_DONE;
>>
>> if (!pr || acpi_bus_get_device(pr->handle, &device))
>>
>
--
Best regards
Tianyu Lan