Skip to contentSkip to conversation

ACPI: cpuidle: port idle timer suspend/resume workaround to cpuidle

PATCH In review Len Brown 2 participants 2 messages Oct 4, 2007 – Oct 8, 2007 ACPI

lore
Share & tools
lore

Len Brown

author reviewer
#0 lore raw

PATCH 1/1 ACPI: cpuidle: port idle timer suspend/resume workaround to cpuidle

From: Len Brown <[email protected]>

Some timers stop during C2 and C3, and so there are various generations of timer broadcast workarounds to deal with that. But that (already complex) code gets confused during suspend.

As it is unlikely that deep C-states would save much power during the actual suspend/resume process anyway, deep C-states were disabled via the addition of .suspend/.resume hooks in to the ACPI processor driver.

Here that workaround is ported to the cpuidle version of the ACPI idle loop. Technically, ACPI could un-register itself from cpuidle on .suspend, but that code path is currently quite cumbersome. So instead,
we simply invoke C1 from the C2 and C3 handlers for the duration of .suspend/.resume.

---
 processor_idle.c |    7 +++++++
 1 file changed, 7 insertions(+)
drivers/acpi/processor_idle.c +7 -0
index d924aa3..3b62632 100644
@@ -1373,6 +1373,10 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
 	if (unlikely(!pr))
 		return 0;
 
+ 	if (acpi_idle_suspend)
+ 		return(acpi_idle_enter_c1(dev, state));
+ 
+
 	local_irq_disable();
 	current_thread_info()->status &= ~TS_POLLING;
 	/*
@@ -1431,6 +1435,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
 	if (unlikely(!pr))
 		return 0;
 
+	if (acpi_idle_suspend)
+		return(acpi_idle_enter_c1(dev, state));
+
 	local_irq_disable();
 	current_thread_info()->status &= ~TS_POLLING;
 	/*
Reviewed-by on v1 1/1
#1 lore raw

Len,

sorry for answering late. Your mail got into the wrong folder after I had to restructure my procmail crap due to a dead server disk. :(

Quoted 11 lines · Len Brown

From: Len Brown <[email protected]>

Some timers stop during C2 and C3, and so there are various generations of timer broadcast workarounds to deal with that. But that (already complex) code gets confused during suspend.

As it is unlikely that deep C-states would save much power during the actual suspend/resume process anyway, deep C-states were disabled via the addition of .suspend/.resume hooks in to the ACPI processor driver.

Quoted 6 lines

Here that workaround is ported to the cpuidle version of the ACPI idle loop. Technically, ACPI could un-register itself from cpuidle on .suspend, but that code path is currently quite cumbersome. So instead,
we simply invoke C1 from the C2 and C3 handlers for the duration of .suspend/.resume.

That's basically what I did in my -hrt patch set. I just wonder whether this decision should be moved into the cpuidle code.

Quoted 1 line
Quoted 30 lines
---
 processor_idle.c |    7 +++++++
 1 file changed, 7 insertions(+)
drivers/acpi/processor_idle.c +7 -0
index d924aa3..3b62632 100644
@@ -1373,6 +1373,10 @@ static int acpi_idle_enter_simple(struct cpuidle_device *dev,
 	if (unlikely(!pr))
 		return 0;
 
+ 	if (acpi_idle_suspend)
+ 		return(acpi_idle_enter_c1(dev, state));
+ 
+
 	local_irq_disable();
 	current_thread_info()->status &= ~TS_POLLING;
 	/*
@@ -1431,6 +1435,9 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
 	if (unlikely(!pr))
 		return 0;
 
+	if (acpi_idle_suspend)
+		return(acpi_idle_enter_c1(dev, state));
+
 	local_irq_disable();
 	current_thread_info()->status &= ~TS_POLLING;
 	/*