Patchwork [1/1] ACPICA: Fix regression in FADT revision checks

login
register
mail settings
Submitter Colin King
Date April 2, 2012, 7:47 a.m.
Message ID <1333352865-9760-2-git-send-email-colin.king@canonical.com>
Download mbox | patch
Permalink /patch/150086/
State New
Headers show

Comments

Colin King - April 2, 2012, 7:47 a.m.
From: Julian Anastasov <ja@ssi.bg>

BugLink: https://bugs.launchpad.net/bugs/883441

	commit 64b3db22c04586997ab4be46dd5a5b99f8a2d390 (2.6.39),
"Remove use of unreliable FADT revision field" causes regression
for old P4 systems because now cst_control and other fields are
not reset to 0.

	The effect is that acpi_processor_power_init will notice
cst_control != 0 and a write to CST_CNT register is performed
that should not happen. As result, the system oopses after the
"No _CST, giving up" message, sometimes in acpi_ns_internalize_name,
sometimes in acpi_ns_get_type, usually at random places. May be
during migration to CPU 1 in acpi_processor_get_throttling.

	Every one of these settings help to avoid this problem:
 - acpi=off
 - processor.nocst=1
 - maxcpus=1

	The fix is to update acpi_gbl_FADT.header.length after
the original value is used to check for old revisions.

https://bugzilla.kernel.org/show_bug.cgi?id=42700
https://bugzilla.redhat.com/show_bug.cgi?id=727865

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Acked-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
(upstream commit 3e80acd1af40fcd91a200b0416a7616b20c5d647)
Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 drivers/acpi/acpica/tbfadt.c |    8 ++++----
 1 files changed, 4 insertions(+), 4 deletions(-)
Tim Gardner - April 2, 2012, 12:47 p.m.
Applied to Precise
Seth Forshee - April 2, 2012, 1:49 p.m.
On Mon, Apr 02, 2012 at 08:47:45AM +0100, Colin King wrote:
> From: Julian Anastasov <ja@ssi.bg>
> 
> BugLink: https://bugs.launchpad.net/bugs/883441
> 
> 	commit 64b3db22c04586997ab4be46dd5a5b99f8a2d390 (2.6.39),
> "Remove use of unreliable FADT revision field" causes regression
> for old P4 systems because now cst_control and other fields are
> not reset to 0.
> 
> 	The effect is that acpi_processor_power_init will notice
> cst_control != 0 and a write to CST_CNT register is performed
> that should not happen. As result, the system oopses after the
> "No _CST, giving up" message, sometimes in acpi_ns_internalize_name,
> sometimes in acpi_ns_get_type, usually at random places. May be
> during migration to CPU 1 in acpi_processor_get_throttling.
> 
> 	Every one of these settings help to avoid this problem:
>  - acpi=off
>  - processor.nocst=1
>  - maxcpus=1
> 
> 	The fix is to update acpi_gbl_FADT.header.length after
> the original value is used to check for old revisions.
> 
> https://bugzilla.kernel.org/show_bug.cgi?id=42700
> https://bugzilla.redhat.com/show_bug.cgi?id=727865
> 
> Signed-off-by: Julian Anastasov <ja@ssi.bg>
> Acked-by: Bob Moore <robert.moore@intel.com>
> Signed-off-by: Len Brown <len.brown@intel.com>
> (upstream commit 3e80acd1af40fcd91a200b0416a7616b20c5d647)
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>  drivers/acpi/acpica/tbfadt.c |    8 ++++----
>  1 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
> index c5d8704..4c9c760 100644
> --- a/drivers/acpi/acpica/tbfadt.c
> +++ b/drivers/acpi/acpica/tbfadt.c
> @@ -363,10 +363,6 @@ static void acpi_tb_convert_fadt(void)
>  	u32 address32;
>  	u32 i;
>  
> -	/* Update the local FADT table header length */
> -
> -	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
> -
>  	/*
>  	 * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.
>  	 * Later code will always use the X 64-bit field. Also, check for an
> @@ -408,6 +404,10 @@ static void acpi_tb_convert_fadt(void)
>  		acpi_gbl_FADT.boot_flags = 0;
>  	}
>  
> +	/* Update the local FADT table header length */
> +
> +	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
> +
>  	/*
>  	 * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
>  	 * generic address structures as necessary. Later code will always use
> -- 
> 1.7.9.1
> 
> 
> -- 
> kernel-team mailing list
> kernel-team@lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team
Tim Gardner - April 2, 2012, 2 p.m.
Applied to Oneiric

Patch

diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
index c5d8704..4c9c760 100644
--- a/drivers/acpi/acpica/tbfadt.c
+++ b/drivers/acpi/acpica/tbfadt.c
@@ -363,10 +363,6 @@  static void acpi_tb_convert_fadt(void)
 	u32 address32;
 	u32 i;
 
-	/* Update the local FADT table header length */
-
-	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
-
 	/*
 	 * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.
 	 * Later code will always use the X 64-bit field. Also, check for an
@@ -408,6 +404,10 @@  static void acpi_tb_convert_fadt(void)
 		acpi_gbl_FADT.boot_flags = 0;
 	}
 
+	/* Update the local FADT table header length */
+
+	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
+
 	/*
 	 * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
 	 * generic address structures as necessary. Later code will always use