Patch "ACPI / osi: Fix an issue that acpi_osi=!* cannot disable ACPICA internal strings" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ACPI / osi: Fix an issue that acpi_osi=!* cannot disable ACPICA internal strings
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
acpi-osi-fix-an-issue-that-acpi_osi-cannot-disable-acpica-internal-strings.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
30c9bb0d7603e7b3f4d6a0ea231e1cddae020c32Mon Sep 17 00:00:00 2001
From: Lv Zheng <[email protected]>
Date: Tue, 3 May 2016 16:48:20 +0800
Subject: ACPI / osi: Fix an issue that acpi_osi=!* cannot disable ACPICA internal strings
From: Lv Zheng <[email protected]>
commit 30c9bb0d7603e7b3f4d6a0ea231e1cddae020c32 upstream.
The order of the _OSI related functionalities is as follows:
acpi_blacklisted()
acpi_dmi_osi_linux()
acpi_osi_setup()
acpi_osi_setup()
acpi_update_interfaces() if "!*"
<<<<<<<<<<<<<<<<<<<<<<<<
parse_args()
__setup("acpi_osi=")
acpi_osi_setup_linux()
acpi_update_interfaces() if "!*"
<<<<<<<<<<<<<<<<<<<<<<<<
acpi_early_init()
acpi_initialize_subsystem()
acpi_ut_initialize_interfaces()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ acpi_bus_init()
acpi_os_initialize1()
acpi_install_interface_handler(acpi_osi_handler) acpi_osi_setup_late()
acpi_update_interfaces() for "!" >>>>>>>>>>>>>>>>>>>>>>>>
acpi_osi_handler()
Since acpi_osi_setup_linux() can override acpi_dmi_osi_linux(), the command line setting can override the DMI detection. That's why acpi_blacklisted() is put before __setup("acpi_osi=").
Then we can notice the following wrong invocation order. There are acpi_update_interfaces() (marked by <<<<) calls invoked before acpi_ut_initialize_interfaces() (marked by ^^^^). This makes it impossible to use acpi_osi=!* correctly from OSI DMI table or from the command line. The use of acpi_osi=!* is meant to disable both ACPICA (acpi_gbl_supported_interfaces) and Linux specific strings (osi_setup_entries) while the ACPICA part should have stopped working because of the order issue.
This patch fixes this issue by moving acpi_update_interfaces() to where it is invoked for acpi_osi=! (marked by >>>>) as this is ensured to be invoked after acpi_ut_initialize_interfaces() (marked by ^^^^). Linux specific strings are still handled in the original place in order to make the following command line working: acpi_osi=!* acpi_osi="Module Device".
Note that since acpi_osi=!* is meant to further disable linux specific string comparing to the acpi_osi=!, there is no such use case in our bug fixing work and hence there is no one using acpi_osi=!* either from the command line or from the DMI quirks, this issue is just a theoretical issue.
--- drivers/acpi/osl.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
drivers/acpi/osl.c +11 -5
@@ -135,7 +135,7 @@ static struct osi_linux { unsigned int enable:1; unsigned int dmi:1; unsigned int cmdline:1; - unsigned int default_disabling:1; +u8 default_disabling; } osi_linux = {0, 0, 0, 0};static u32 acpi_osi_handler (acpi_string interface,u32 supported)
@@ -1444,10 +1444,13 @@ void __init acpi_osi_setup(char *str)if (*str =='!' ) { str++;if (*str =='\0' ) { - osi_linux.default_disabling =1 ; +/* Do not override acpi_osi=!* */ +if (!osi_linux.default_disabling) + osi_linux.default_disabling = +ACPI_DISABLE_ALL_VENDOR_STRINGS ;return ; }else if (*str =='*' ) { -acpi_update_interfaces (ACPI_DISABLE_ALL_STRINGS ); + osi_linux.default_disabling =ACPI_DISABLE_ALL_STRINGS ;for (i =0 ; i <OSI_STRING_ENTRIES_MAX ; i++) { osi = &osi_setup_entries[i]; osi->enable = false;
@@ -1520,10 +1523,13 @@ static void __init acpi_osi_setup_late(vacpi_status status;if (osi_linux.default_disabling) { - status =acpi_update_interfaces (ACPI_DISABLE_ALL_VENDOR_STRINGS ); + status =acpi_update_interfaces (osi_linux.default_disabling);if (ACPI_SUCCESS (status)) - printk(KERN_INFO PREFIX "Disabled all _OSI OS vendors\n"); + printk(KERN_INFO PREFIX "Disabled all _OSI OS vendors%s\n", + osi_linux.default_disabling == +ACPI_DISABLE_ALL_STRINGS ? +" and feature groups" :"" ); }for (i =0 ; i <OSI_STRING_ENTRIES_MAX ; i++) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/acpi-osi-fix-an-issue-that-acpi_osi-cannot-disable-acpica-internal-strings.patch