Messages in this thread Patch in this message | | | From | Pingfan Liu <> | Subject | [PATCH 6/9] pm/irq: make for_each_irq_desc() safe of irq_desc release | Date | Wed, 20 Apr 2022 22:05:18 +0800 |
| |
The invloved context is no a RCU read section. Furthermore there may be more than one task at this point. Hence it demands a measure to prevent irq_desc from freeing. Use irq_lock_sparse to serve the protection purpose.
Signed-off-by: Pingfan Liu <kernelfans@gmail.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "Rafael J. Wysocki" <rafael@kernel.org> To: linux-kernel@vger.kernel.org --- kernel/irq/pm.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c index ca71123a6130..4b67a4c7de3c 100644 --- a/kernel/irq/pm.c +++ b/kernel/irq/pm.c @@ -133,6 +133,7 @@ void suspend_device_irqs(void) struct irq_desc *desc; int irq; + irq_lock_sparse(); for_each_irq_desc(irq, desc) { unsigned long flags; bool sync; @@ -146,6 +147,7 @@ void suspend_device_irqs(void) if (sync) synchronize_irq(irq); } + irq_unlock_sparse(); } EXPORT_SYMBOL_GPL(suspend_device_irqs); @@ -186,6 +188,7 @@ static void resume_irqs(bool want_early) struct irq_desc *desc; int irq; + /* The early resume stage is free of irq_desc release */ for_each_irq_desc(irq, desc) { unsigned long flags; bool is_early = desc->action && -- 2.31.1
| |