From 9bf0dd1319d8f349413aaad3789dcd7329e942d4 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sat, 2 Nov 2024 07:11:42 -0400 Subject: [PATCH] Fixes for 5.15 Signed-off-by: Sasha Levin --- ...i-cppc-make-rmw_lock-a-raw_spin_lock.patch | 128 ++++++++++++++++++ ...i-fix-the-input-parameter-of-cpuhp_r.patch | 38 ++++++ queue-5.15/series | 2 + 3 files changed, 168 insertions(+) create mode 100644 queue-5.15/acpi-cppc-make-rmw_lock-a-raw_spin_lock.patch create mode 100644 queue-5.15/firmware-arm_sdei-fix-the-input-parameter-of-cpuhp_r.patch diff --git a/queue-5.15/acpi-cppc-make-rmw_lock-a-raw_spin_lock.patch b/queue-5.15/acpi-cppc-make-rmw_lock-a-raw_spin_lock.patch new file mode 100644 index 00000000000..e7dc2433de6 --- /dev/null +++ b/queue-5.15/acpi-cppc-make-rmw_lock-a-raw_spin_lock.patch @@ -0,0 +1,128 @@ +From 2eb08ff8771115962592a1d83300c2314d5090b9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Oct 2024 13:56:56 +0100 +Subject: ACPI: CPPC: Make rmw_lock a raw_spin_lock + +From: Pierre Gondois + +[ Upstream commit 1c10941e34c5fdc0357e46a25bd130d9cf40b925 ] + +The following BUG was triggered: + +============================= +[ BUG: Invalid wait context ] +6.12.0-rc2-XXX #406 Not tainted +----------------------------- +kworker/1:1/62 is trying to lock: +ffffff8801593030 (&cpc_ptr->rmw_lock){+.+.}-{3:3}, at: cpc_write+0xcc/0x370 +other info that might help us debug this: +context-{5:5} +2 locks held by kworker/1:1/62: + #0: ffffff897ef5ec98 (&rq->__lock){-.-.}-{2:2}, at: raw_spin_rq_lock_nested+0x2c/0x50 + #1: ffffff880154e238 (&sg_policy->update_lock){....}-{2:2}, at: sugov_update_shared+0x3c/0x280 +stack backtrace: +CPU: 1 UID: 0 PID: 62 Comm: kworker/1:1 Not tainted 6.12.0-rc2-g9654bd3e8806 #406 +Workqueue: 0x0 (events) +Call trace: + dump_backtrace+0xa4/0x130 + show_stack+0x20/0x38 + dump_stack_lvl+0x90/0xd0 + dump_stack+0x18/0x28 + __lock_acquire+0x480/0x1ad8 + lock_acquire+0x114/0x310 + _raw_spin_lock+0x50/0x70 + cpc_write+0xcc/0x370 + cppc_set_perf+0xa0/0x3a8 + cppc_cpufreq_fast_switch+0x40/0xc0 + cpufreq_driver_fast_switch+0x4c/0x218 + sugov_update_shared+0x234/0x280 + update_load_avg+0x6ec/0x7b8 + dequeue_entities+0x108/0x830 + dequeue_task_fair+0x58/0x408 + __schedule+0x4f0/0x1070 + schedule+0x54/0x130 + worker_thread+0xc0/0x2e8 + kthread+0x130/0x148 + ret_from_fork+0x10/0x20 + +sugov_update_shared() locks a raw_spinlock while cpc_write() locks a +spinlock. + +To have a correct wait-type order, update rmw_lock to a raw spinlock and +ensure that interrupts will be disabled on the CPU holding it. + +Fixes: 60949b7b8054 ("ACPI: CPPC: Fix MASK_VAL() usage") +Signed-off-by: Pierre Gondois +Link: https://patch.msgid.link/20241028125657.1271512-1-pierre.gondois@arm.com +[ rjw: Changelog edits ] +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + drivers/acpi/cppc_acpi.c | 9 +++++---- + include/acpi/cppc_acpi.h | 2 +- + 2 files changed, 6 insertions(+), 5 deletions(-) + +diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c +index 8d14e6c705357..0e9ccedb08dab 100644 +--- a/drivers/acpi/cppc_acpi.c ++++ b/drivers/acpi/cppc_acpi.c +@@ -813,7 +813,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) + + /* Store CPU Logical ID */ + cpc_ptr->cpu_id = pr->id; +- spin_lock_init(&cpc_ptr->rmw_lock); ++ raw_spin_lock_init(&cpc_ptr->rmw_lock); + + /* Parse PSD data for this CPU */ + ret = acpi_get_psd(cpc_ptr, handle); +@@ -1020,6 +1020,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val) + int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu); + struct cpc_reg *reg = ®_res->cpc_entry.reg; + struct cpc_desc *cpc_desc; ++ unsigned long flags; + + size = GET_BIT_WIDTH(reg); + +@@ -1047,7 +1048,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val) + return -ENODEV; + } + +- spin_lock(&cpc_desc->rmw_lock); ++ raw_spin_lock_irqsave(&cpc_desc->rmw_lock, flags); + switch (size) { + case 8: + prev_val = readb_relaxed(vaddr); +@@ -1062,7 +1063,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val) + prev_val = readq_relaxed(vaddr); + break; + default: +- spin_unlock(&cpc_desc->rmw_lock); ++ raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags); + return -EFAULT; + } + val = MASK_VAL_WRITE(reg, prev_val, val); +@@ -1095,7 +1096,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val) + } + + if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) +- spin_unlock(&cpc_desc->rmw_lock); ++ raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags); + + return ret_val; + } +diff --git a/include/acpi/cppc_acpi.h b/include/acpi/cppc_acpi.h +index 0fed87e2a8959..28179bb794b2f 100644 +--- a/include/acpi/cppc_acpi.h ++++ b/include/acpi/cppc_acpi.h +@@ -65,7 +65,7 @@ struct cpc_desc { + int write_cmd_status; + int write_cmd_id; + /* Lock used for RMW operations in cpc_write() */ +- spinlock_t rmw_lock; ++ raw_spinlock_t rmw_lock; + struct cpc_register_resource cpc_regs[MAX_CPC_REG_ENT]; + struct acpi_psd_package domain_info; + struct kobject kobj; +-- +2.43.0 + diff --git a/queue-5.15/firmware-arm_sdei-fix-the-input-parameter-of-cpuhp_r.patch b/queue-5.15/firmware-arm_sdei-fix-the-input-parameter-of-cpuhp_r.patch new file mode 100644 index 00000000000..fb2537177f6 --- /dev/null +++ b/queue-5.15/firmware-arm_sdei-fix-the-input-parameter-of-cpuhp_r.patch @@ -0,0 +1,38 @@ +From 964e3827cb62255dc2c0dc02e72b51c73d32ab88 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 16 Oct 2024 16:47:40 +0800 +Subject: firmware: arm_sdei: Fix the input parameter of cpuhp_remove_state() + +From: Xiongfeng Wang + +[ Upstream commit c83212d79be2c9886d3e6039759ecd388fd5fed1 ] + +In sdei_device_freeze(), the input parameter of cpuhp_remove_state() is +passed as 'sdei_entry_point' by mistake. Change it to 'sdei_hp_state'. + +Fixes: d2c48b2387eb ("firmware: arm_sdei: Fix sleep from invalid context BUG") +Signed-off-by: Xiongfeng Wang +Reviewed-by: James Morse +Link: https://lore.kernel.org/r/20241016084740.183353-1-wangxiongfeng2@huawei.com +Signed-off-by: Will Deacon +Signed-off-by: Sasha Levin +--- + drivers/firmware/arm_sdei.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c +index 285fe7ad490d1..3e8051fe82965 100644 +--- a/drivers/firmware/arm_sdei.c ++++ b/drivers/firmware/arm_sdei.c +@@ -763,7 +763,7 @@ static int sdei_device_freeze(struct device *dev) + int err; + + /* unregister private events */ +- cpuhp_remove_state(sdei_entry_point); ++ cpuhp_remove_state(sdei_hp_state); + + err = sdei_unregister_shared(); + if (err) +-- +2.43.0 + diff --git a/queue-5.15/series b/queue-5.15/series index d415e1b7351..81297305a0b 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -29,3 +29,5 @@ net-hns3-fix-missing-features-due-to-dev-features-co.patch net-hns3-resolved-the-issue-that-the-debugfs-query-r.patch net-hns3-initialize-reset_timer-before-hclgevf_misc_.patch net-hns3-fix-kernel-crash-when-1588-is-sent-on-hip08.patch +firmware-arm_sdei-fix-the-input-parameter-of-cpuhp_r.patch +acpi-cppc-make-rmw_lock-a-raw_spin_lock.patch -- 2.47.3