acpi: Fix ACPI GPE mask kernel parameter
Subsystems (2)
PATCH 1/1 acpi: Fix ACPI GPE mask kernel parameter
The acpi_mask_gpe= kernel parameter documentation states that the range of mask is 128 GPEs (0x00 to 0x7F). The acpi_masked_gpes mask is a u64 so only 64 GPEs (0x00 to 0x3F) can really be masked.
Use a bitmap of size 0xFF instead of a u64 for the GPE mask so 256 GPEs can be masked.
Fixes 9c4aa1eecb48 ("ACPI / sysfs: Provide quirk mechanism to prevent GPE flooding")
Signed-off-by Prarit Bharava <[email protected]>
Cc Lv Zheng <[email protected]>
Cc Jonathan Corbet <[email protected]>
Cc "Rafael J. Wysocki" <[email protected]>
--- Documentation/admin-guide/kernel-parameters.txt | 1 - drivers/acpi/sysfs.c | 26 ++++++++----------------- 2 files changed, 8 insertions(+), 19 deletions(-)
Documentation/admin-guide/kernel-parameters.txt +0 -1
@@ -114,7 +114,6 @@ This facility can be used to prevent such uncontrolled GPE floodings. Format: <int> - Support masking of GPEs numbered from 0x00 to 0x7f. acpi_no_auto_serialize [HW,ACPI] Disable auto-serialization of AML methods
drivers/acpi/sysfs.c +8 -18
@@ -816,14 +816,8 @@ static ssize_t counter_set(struct kobject *kobj,* interface: * echo unmask > /sys/firmware/acpi/interrupts/gpe00 */ - -/* -* Currently, the GPE flooding prevention only supports to mask the GPEs -* numbered from 00 to 7f. -*/ -#define ACPI_MASKABLE_GPE_MAX 0x80 - -static u64 __initdata acpi_masked_gpes; +#define ACPI_MASKABLE_GPE_MAX 0xFF +static DECLARE_BITMAP(acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) __initdata;static int __init acpi_gpe_set_masked_gpes (char *val) {
@@ -831,7 +825,7 @@ static int __init acpi_gpe_set_masked_gpes(char *val)if (kstrtou8 (val,0 , &gpe) || gpe >ACPI_MASKABLE_GPE_MAX )return -EINVAL ; - acpi_masked_gpes |= ((u64 )1 <<gpe); +set_bit (gpe, acpi_masked_gpes_map);return 1 ; }
@@ -843,15 +837,11 @@ void __init acpi_gpe_apply_masked_gpes(void)acpi_status status;u8 gpe; -for (gpe =0 ; - gpe <min_t (u8,ACPI_MASKABLE_GPE_MAX , acpi_current_gpe_count); - gpe++) { -if (acpi_masked_gpes & ((u64 )1 <<gpe)) { - status =acpi_get_gpe_device (gpe, &handle); -if (ACPI_SUCCESS (status)) { -pr_info ("Masking GPE 0x%x.\n" , gpe); - (void )acpi_mask_gpe (handle, gpe, TRUE); - } +for_each_set_bit (gpe, acpi_masked_gpes_map,ACPI_MASKABLE_GPE_MAX ) { + status =acpi_get_gpe_device (gpe, &handle); +if (ACPI_SUCCESS (status)) { +pr_info ("Masking GPE 0x%x.\n" , gpe); + (void )acpi_mask_gpe (handle, gpe, TRUE); } } }
Signature · 1 line
2.15.0.rc0.39.g2f0e14e64
Rafael J. Wysocki
AppliedQuoted 72 lines · CET Prarit Bhargava
The acpi_mask_gpe= kernel parameter documentation states that the range of mask is 128 GPEs (
0x00to0x7F). Theacpi_masked_gpesmask is a u64 so only 64 GPEs (0x00to0x3F) can really be masked.Use a bitmap of size
0xFFinstead of a u64 for the GPE mask so 256 GPEs can be masked.Fixes 9c4aa1eecb48 ("ACPI / sysfs: Provide quirk mechanism to prevent GPE flooding")Signed-off-by Prarit Bharava <[email protected]>Cc Lv Zheng <[email protected]>Cc Jonathan Corbet <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>--- Documentation/admin-guide/kernel-parameters.txt | 1 - drivers/acpi/sysfs.c | 26 ++++++++----------------- 2 files changed, 8 insertions(+), 19 deletions(-)Documentation/admin-guide/kernel-parameters.txt +0
-1@@ -114,7 +114,6 @@ This facility can be used to prevent such uncontrolled GPE floodings. Format: <int> - Support masking of GPEs numbered from 0x00 to 0x7f. acpi_no_auto_serialize [HW,ACPI] Disable auto-serialization of AML methodsdrivers/acpi/sysfs.c +3
-16@@ -816,14 +816,8 @@ static ssize_t counter_set(struct kobject *kobj,* interface: * echo unmask > /sys/firmware/acpi/interrupts/gpe00 */ - -/* -* Currently, the GPE flooding prevention only supports to mask the GPEs -* numbered from 00 to 7f. -*/ -#define ACPI_MASKABLE_GPE_MAX 0x80 - -static u64 __initdata acpi_masked_gpes; +#define ACPI_MASKABLE_GPE_MAX 0xFF +static DECLARE_BITMAP(acpi_masked_gpes_map, ACPI_MASKABLE_GPE_MAX) __initdata;static int __init acpi_gpe_set_masked_gpes (char *val) {@@ -831,7 +825,7 @@ static int __init acpi_gpe_set_masked_gpes(char *val)if (kstrtou8 (val,0 , &gpe) || gpe >ACPI_MASKABLE_GPE_MAX )return -EINVAL ; - acpi_masked_gpes |= ((u64 )1 <<gpe); +set_bit (gpe, acpi_masked_gpes_map);return 1 ; }@@ -843,15 +837,11 @@ void __init acpi_gpe_apply_masked_gpes(void)acpi_status status;u8 gpe; -for (gpe =0 ; - gpe <min_t (u8,ACPI_MASKABLE_GPE_MAX , acpi_current_gpe_count); - gpe++) { -if (acpi_masked_gpes & ((u64 )1 <<gpe)) { - status =acpi_get_gpe_device (gpe, &handle); -if (ACPI_SUCCESS (status)) { -pr_info ("Masking GPE 0x%x.\n" , gpe);
drivers/acpi/sysfs.c void __init acpi_gpe_apply_masked_gpes(void) · line 847
Quoted 10 lines
drivers/acpi/sysfs.c +5
-2- (void )acpi_mask_gpe (handle, gpe, TRUE); - } +for_each_set_bit (gpe, acpi_masked_gpes_map,ACPI_MASKABLE_GPE_MAX ) { + status =acpi_get_gpe_device (gpe, &handle); +if (ACPI_SUCCESS (status)) { +pr_info ("Masking GPE 0x%x.\n" , gpe); + (void )acpi_mask_gpe (handle, gpe, TRUE); } } }
Applied, thanks!