* [PATCH] ACPI: Don't let acpi_pad needlessly mark LAPIC unstable
@ 2010-05-30 3:37 Chen Gong
2010-06-02 6:30 ` chen gong
0 siblings, 1 reply; 2+ messages in thread
From: Chen Gong @ 2010-05-30 3:37 UTC (permalink / raw)
To: venki, shaohua.li; +Cc: len.brown, linux-acpi, Chen Gong
according to Venki's suggestion in the commit 0dc698b,
adding LAPIC unstable detection in the acpi_pad drvier too.
Signed-off-by: Chen Gong <gong.chen@linux.intel.com>
---
drivers/acpi/acpi_pad.c | 36 ++++++++++++++++++++++++------------
1 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c
index d269a8f..446aced 100644
--- a/drivers/acpi/acpi_pad.c
+++ b/drivers/acpi/acpi_pad.c
@@ -46,6 +46,8 @@ static unsigned long power_saving_mwait_eax;
static unsigned char tsc_detected_unstable;
static unsigned char tsc_marked_unstable;
+static unsigned char lapic_detected_unstable;
+static unsigned char lapic_marked_unstable;
static void power_saving_mwait_init(void)
{
@@ -75,9 +77,6 @@ static void power_saving_mwait_init(void)
power_saving_mwait_eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) |
(highest_subcstate - 1);
- for_each_online_cpu(i)
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &i);
-
#if defined(CONFIG_GENERIC_TIME) && defined(CONFIG_X86)
switch (boot_cpu_data.x86_vendor) {
case X86_VENDOR_AMD:
@@ -86,13 +85,15 @@ static void power_saving_mwait_init(void)
* AMD Fam10h TSC will tick in all
* C/P/S0/S1 states when this bit is set.
*/
- if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
- return;
-
- /*FALL THROUGH*/
+ if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
+ tsc_detected_unstable = 1;
+ if (!boot_cpu_has(X86_FEATURE_ARAT))
+ lapic_detected_unstable = 1;
+ break;
default:
- /* TSC could halt in idle */
+ /* TSC & LAPIC could halt in idle */
tsc_detected_unstable = 1;
+ lapic_detected_unstable = 1;
}
#endif
}
@@ -180,10 +181,20 @@ static int power_saving_thread(void *data)
mark_tsc_unstable("TSC halts in idle");
tsc_marked_unstable = 1;
}
+ if (lapic_detected_unstable && !lapic_marked_unstable) {
+ int i;
+ /* LAPIC could halt in idle, so notify users */
+ for_each_online_cpu(i)
+ clockevents_notify(
+ CLOCK_EVT_NOTIFY_BROADCAST_ON,
+ &i);
+ lapic_marked_unstable = 1;
+ }
local_irq_disable();
cpu = smp_processor_id();
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
- &cpu);
+ if (lapic_marked_unstable)
+ clockevents_notify(
+ CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
stop_critical_timings();
__monitor((void *)¤t_thread_info()->flags, 0, 0);
@@ -192,8 +203,9 @@ static int power_saving_thread(void *data)
__mwait(power_saving_mwait_eax, 1);
start_critical_timings();
- clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
- &cpu);
+ if (lapic_marked_unstable)
+ clockevents_notify(
+ CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
local_irq_enable();
if (jiffies > expire_time) {
--
1.7.0.2.279.gf1ba1c
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] ACPI: Don't let acpi_pad needlessly mark LAPIC unstable
2010-05-30 3:37 [PATCH] ACPI: Don't let acpi_pad needlessly mark LAPIC unstable Chen Gong
@ 2010-06-02 6:30 ` chen gong
0 siblings, 0 replies; 2+ messages in thread
From: chen gong @ 2010-06-02 6:30 UTC (permalink / raw)
To: Chen Gong; +Cc: venki, shaohua.li, len.brown, linux-acpi
On 2010-5-30 11:37, Chen Gong wrote:
> according to Venki's suggestion in the commit 0dc698b,
> adding LAPIC unstable detection in the acpi_pad drvier too.
>
> Signed-off-by: Chen Gong <gong.chen@linux.intel.com>
> ---
> drivers/acpi/acpi_pad.c | 36 ++++++++++++++++++++++++------------
> 1 files changed, 24 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c
> index d269a8f..446aced 100644
> --- a/drivers/acpi/acpi_pad.c
> +++ b/drivers/acpi/acpi_pad.c
> @@ -46,6 +46,8 @@ static unsigned long power_saving_mwait_eax;
>
> static unsigned char tsc_detected_unstable;
> static unsigned char tsc_marked_unstable;
> +static unsigned char lapic_detected_unstable;
> +static unsigned char lapic_marked_unstable;
>
> static void power_saving_mwait_init(void)
> {
> @@ -75,9 +77,6 @@ static void power_saving_mwait_init(void)
> power_saving_mwait_eax = (highest_cstate << MWAIT_SUBSTATE_SIZE) |
> (highest_subcstate - 1);
>
> - for_each_online_cpu(i)
> - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &i);
> -
> #if defined(CONFIG_GENERIC_TIME) && defined(CONFIG_X86)
> switch (boot_cpu_data.x86_vendor) {
> case X86_VENDOR_AMD:
> @@ -86,13 +85,15 @@ static void power_saving_mwait_init(void)
> * AMD Fam10h TSC will tick in all
> * C/P/S0/S1 states when this bit is set.
> */
> - if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
> - return;
> -
> - /*FALL THROUGH*/
> + if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
> + tsc_detected_unstable = 1;
> + if (!boot_cpu_has(X86_FEATURE_ARAT))
> + lapic_detected_unstable = 1;
> + break;
> default:
> - /* TSC could halt in idle */
> + /* TSC & LAPIC could halt in idle */
> tsc_detected_unstable = 1;
> + lapic_detected_unstable = 1;
> }
> #endif
> }
> @@ -180,10 +181,20 @@ static int power_saving_thread(void *data)
> mark_tsc_unstable("TSC halts in idle");
> tsc_marked_unstable = 1;
> }
> + if (lapic_detected_unstable && !lapic_marked_unstable) {
> + int i;
> + /* LAPIC could halt in idle, so notify users */
> + for_each_online_cpu(i)
> + clockevents_notify(
> + CLOCK_EVT_NOTIFY_BROADCAST_ON,
> + &i);
> + lapic_marked_unstable = 1;
> + }
> local_irq_disable();
> cpu = smp_processor_id();
> - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER,
> - &cpu);
> + if (lapic_marked_unstable)
> + clockevents_notify(
> + CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
> stop_critical_timings();
>
> __monitor((void *)¤t_thread_info()->flags, 0, 0);
> @@ -192,8 +203,9 @@ static int power_saving_thread(void *data)
> __mwait(power_saving_mwait_eax, 1);
>
> start_critical_timings();
> - clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT,
> - &cpu);
> + if (lapic_marked_unstable)
> + clockevents_notify(
> + CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu);
> local_irq_enable();
>
> if (jiffies > expire_time) {
Ping again.
Is it reasonable ?
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2010-06-02 6:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-30 3:37 [PATCH] ACPI: Don't let acpi_pad needlessly mark LAPIC unstable Chen Gong
2010-06-02 6:30 ` chen gong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).