public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH] ACPI: CPPC: Make rmw_lock a raw_spin_lock
@ 2024-10-28 10:51 Pierre Gondois
  2024-10-28 12:37 ` Rafael J. Wysocki
  2024-10-29  0:32 ` Greg Kroah-Hartman
  0 siblings, 2 replies; 3+ messages in thread
From: Pierre Gondois @ 2024-10-28 10:51 UTC (permalink / raw)
  To: linux-kernel
  Cc: Dietmar Eggemann, Pierre Gondois, Catalin Marinas, Will Deacon,
	Paul Walmsley, Palmer Dabbelt, Albert Ou, Rafael J. Wysocki,
	Len Brown, Sudeep Holla, Greg Kroah-Hartman,
	Sebastian Andrzej Siewior, Clark Williams, Steven Rostedt,
	Jeremy Linton, Yunhui Cui, Conor Dooley, Steffen Persvold,
	Andrew Morton, Mathieu Desnoyers, Borislav Petkov (AMD),
	Reinette Chatre, Tony Luck, Yury Norov, Clément Léger,
	linux-arm-kernel, linux-riscv, linux-acpi, linux-rt-devel

The following BUG was triggered. 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.

Also save irq state.

=============================
[ 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

Fixes: 60949b7b8054 ("ACPI: CPPC: Fix MASK_VAL() usage")
Signed-off-by: Pierre Gondois <pierre.gondois@arm.com>
---
 drivers/acpi/cppc_acpi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 1a40f0514eaa..e7e4bf932e28 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -1127,7 +1127,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
 			return -ENODEV;
 		}
 
-		raw_spin_lock_irqsave(&cpc_desc->rmw_lock, flags);
+		raw_spin_lock(&cpc_desc->rmw_lock);
 		switch (size) {
 		case 8:
 			prev_val = readb_relaxed(vaddr);
@@ -1142,7 +1142,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
 			prev_val = readq_relaxed(vaddr);
 			break;
 		default:
-			raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags);
+			raw_spin_unlock(&cpc_desc->rmw_lock);
 			return -EFAULT;
 		}
 		val = MASK_VAL_WRITE(reg, prev_val, val);
@@ -1175,7 +1175,7 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
 	}
 
 	if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
-		raw_spin_unlock_irqrestore(&cpc_desc->rmw_lock, flags);
+		raw_spin_unlock(&cpc_desc->rmw_lock);
 
 	return ret_val;
 }
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-10-29  0:35 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-28 10:51 [PATCH] ACPI: CPPC: Make rmw_lock a raw_spin_lock Pierre Gondois
2024-10-28 12:37 ` Rafael J. Wysocki
2024-10-29  0:32 ` Greg Kroah-Hartman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox