Merge branch 'acpi-driver' into linux-next * acpi-driver: ACPI: platform_profile: Separate handler locking from sysfs lifetime platform/x86: ideapad-laptop: Evaluate ACPI methods exclusively thermal: intel: int340x: Evaluate _TMP exclusively ACPI: battery: Evaluate battery methods exclusively ACPI: utils: Add exclusive AML evaluation helpers
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c index b653418..fcd9494 100644 --- a/drivers/acpi/acpica/nsxfname.c +++ b/drivers/acpi/acpica/nsxfname.c
@@ -503,6 +503,7 @@ acpi_status acpi_install_method(u8 *buffer) /* First AML opcode in the table must be a control method */ parser_state.aml = buffer + sizeof(struct acpi_table_header); + parser_state.aml_end = buffer + table->length; opcode = acpi_ps_peek_opcode(&parser_state); if (opcode != AML_METHOD_OP) { return (AE_BAD_PARAMETER);
diff --git a/drivers/acpi/sysfs.c b/drivers/acpi/sysfs.c index a993735..a4534b3 100644 --- a/drivers/acpi/sysfs.c +++ b/drivers/acpi/sysfs.c
@@ -420,6 +420,7 @@ static ssize_t acpi_data_show(struct file *filp, struct kobject *kobj, struct acpi_data_attr *data_attr; void __iomem *base; ssize_t size; + u64 end; data_attr = container_of(bin_attr, struct acpi_data_attr, attr); size = data_attr->attr.size; @@ -433,13 +434,17 @@ static ssize_t acpi_data_show(struct file *filp, struct kobject *kobj, if (count > size - offset) count = size - offset; - base = acpi_os_map_iomem(data_attr->addr, size); + /* acpi_os_map_iomem() can't handle a range that wraps around */ + if (check_add_overflow(data_attr->addr, size, &end)) + return -EINVAL; + + base = acpi_os_map_iomem(data_attr->addr + offset, count); if (!base) return -ENOMEM; - memcpy_fromio(buf, base + offset, count); + memcpy_fromio(buf, base, count); - acpi_os_unmap_iomem(base, size); + acpi_os_unmap_iomem(base, count); return count; } @@ -511,7 +516,6 @@ static int acpi_tables_sysfs_init(void) struct acpi_table_header *table_header = NULL; int table_index; acpi_status status; - int ret; tables_kobj = kobject_create_and_add("tables", acpi_kobj); if (!tables_kobj) @@ -536,13 +540,11 @@ static int acpi_tables_sysfs_init(void) table_attr = kzalloc_obj(*table_attr); if (!table_attr) - return -ENOMEM; + break; - ret = acpi_table_attr_init(tables_kobj, - table_attr, table_header); - if (ret) { + if (acpi_table_attr_init(tables_kobj, table_attr, table_header)) { kfree(table_attr); - return ret; + break; } list_add_tail(&table_attr->node, &acpi_table_attr_list); acpi_table_data_init(table_header, table_attr);
diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c index 17158cb..0e6ae4c 100644 --- a/drivers/cpufreq/intel_pstate.c +++ b/drivers/cpufreq/intel_pstate.c
@@ -3436,6 +3436,8 @@ static void intel_pstate_driver_cleanup(void) if (intel_pstate_driver == &intel_pstate) intel_pstate_clear_update_util_hook(cpu); + intel_pstate_disable_hwp_interrupt(all_cpu_data[cpu]); + kfree(all_cpu_data[cpu]); WRITE_ONCE(all_cpu_data[cpu], NULL); }
diff --git a/kernel/power/energy_model.c b/kernel/power/energy_model.c index a76089e..d19a654 100644 --- a/kernel/power/energy_model.c +++ b/kernel/power/energy_model.c
@@ -439,7 +439,9 @@ static int em_create_pd(struct device *dev, int nr_states, cpumask_copy(em_span_cpus(pd), cpus); } else { - pd = kzalloc_obj(*pd); + /* Readers expect pd->cpus to exist and remain empty. */ + pd = kzalloc_flex(*pd, cpus, + BITS_TO_LONGS(large_cpumask_bits)); if (!pd) return -ENOMEM; }