mirror of
https://abf.rosa.ru/djam/kernel-5.13.git
synced 2025-02-25 16:12:50 +00:00
66 lines
1.9 KiB
Diff
66 lines
1.9 KiB
Diff
From 6cf18e6927c0b224f972e3042fb85770d63cb9f8 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Wed, 15 Feb 2017 11:11:51 +0100
|
|
Subject: goldfish: Sanitize the broken interrupt handler
|
|
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
|
|
commit 6cf18e6927c0b224f972e3042fb85770d63cb9f8 upstream.
|
|
|
|
This interrupt handler is broken in several ways:
|
|
|
|
- It loops forever when the op code is not decodeable
|
|
|
|
- It never returns IRQ_HANDLED because the only way to exit the loop
|
|
returns IRQ_NONE unconditionally.
|
|
|
|
The whole concept of this is broken. Creating devices in an interrupt
|
|
handler is beyond any point of sanity.
|
|
|
|
Make it at least behave halfways sane so accidental users do not have to
|
|
deal with a hard to debug lockup.
|
|
|
|
Fixes: e809c22b8fb028 ("goldfish: add the goldfish virtual bus")
|
|
Reported-by: Gabriel C <nix.or.die@gmail.com>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
|
|
---
|
|
drivers/platform/goldfish/pdev_bus.c | 13 ++++++++-----
|
|
1 file changed, 8 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/platform/goldfish/pdev_bus.c
|
|
+++ b/drivers/platform/goldfish/pdev_bus.c
|
|
@@ -157,23 +157,26 @@ static int goldfish_new_pdev(void)
|
|
static irqreturn_t goldfish_pdev_bus_interrupt(int irq, void *dev_id)
|
|
{
|
|
irqreturn_t ret = IRQ_NONE;
|
|
+
|
|
while (1) {
|
|
u32 op = readl(pdev_bus_base + PDEV_BUS_OP);
|
|
- switch (op) {
|
|
- case PDEV_BUS_OP_DONE:
|
|
- return IRQ_NONE;
|
|
|
|
+ switch (op) {
|
|
case PDEV_BUS_OP_REMOVE_DEV:
|
|
goldfish_pdev_remove();
|
|
+ ret = IRQ_HANDLED;
|
|
break;
|
|
|
|
case PDEV_BUS_OP_ADD_DEV:
|
|
goldfish_new_pdev();
|
|
+ ret = IRQ_HANDLED;
|
|
break;
|
|
+
|
|
+ case PDEV_BUS_OP_DONE:
|
|
+ default:
|
|
+ return ret;
|
|
}
|
|
- ret = IRQ_HANDLED;
|
|
}
|
|
- return ret;
|
|
}
|
|
|
|
static int goldfish_pdev_bus_probe(struct platform_device *pdev)
|