The via-macii ADB driver calls request_irq() after disabling hard
interrupts. But disabling interrupts isn't necessary here because the
VIA shift register interrupt was masked during VIA1 initialization.
Cc: Joshua Thompson <[email protected]>
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Finn Thain <[email protected]>
---
This old bug was found while testing Geert's CONFIG_PREEMPT=y patch.
BUG: sleeping function called from invalid context at include/linux/sched/mm.h:306
in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper
preempt_count: 0, expected: 0
RCU nest depth: 0, expected: 0
CPU: 0 PID: 1 Comm: swapper Not tainted 6.8.0-rc7-mac-00232-g88f8d9d514ed #5
Stack from 0084be34:
0084be34 0054af2c 0054af2c 00000001 00000dc0 0084be54 004980b6 0054af2c
0084be68 0003f920 00000000 008012d0 00598ff0 0084be7c 0003f95e 00543a0d
00000132 00000000 0084beb0 000f44ee 00543a0d 00000132 00000000 0000000a
002ef380 002ef380 00038166 004897c0 005a95a0 00598ff0 00000000 0084bee0
000567d8 008012d0 00000dc0 00000034 00002000 00000000 0063d1e8 00002092
005a95a0 004c9706 00649b30 0084bf08 002ef962 0000000a 002ef380 00000000
Call Trace: [<004980b6>] dump_stack+0x10/0x16
[<0003f920>] __might_resched+0x138/0x150
[<0003f95e>] __might_sleep+0x26/0x72
[<000f44ee>] kmalloc_trace+0x94/0x1ea
[<002ef380>] macii_interrupt+0x0/0x576
[<002ef380>] macii_interrupt+0x0/0x576
[<00038166>] parse_args+0x0/0x3a6
[<004897c0>] strcpy+0x0/0x1e
[<000567d8>] request_threaded_irq+0xa4/0x19e
[<00002000>] _start+0x0/0x8
[<00002092>] do_one_initcall+0x0/0x22a
[<002ef962>] macii_init+0x5a/0x94
[<002ef380>] macii_interrupt+0x0/0x576
[<002ef380>] macii_interrupt+0x0/0x576
[<00635bee>] adb_init+0x52/0x114
[<00635b9c>] adb_init+0x0/0x114
[<000020c6>] do_one_initcall+0x34/0x22a
[<00002092>] do_one_initcall+0x0/0x22a
[<00038166>] parse_args+0x0/0x3a6
[<004897c0>] strcpy+0x0/0x1e
[<00060006>] rcu_exp_wait_wake+0x618/0x92e
[<00621ace>] kernel_init_freeable+0x156/0x1ae
[<00621ade>] kernel_init_freeable+0x166/0x1ae
[<00635b9c>] adb_init+0x0/0x114
[<00498e4a>] kernel_init+0x0/0xfa
[<00498e62>] kernel_init+0x18/0xfa
[<00498e4a>] kernel_init+0x0/0xfa
[<00002700>] ret_from_kernel_thread+0xc/0x14
---
drivers/macintosh/via-macii.c | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/drivers/macintosh/via-macii.c b/drivers/macintosh/via-macii.c
index db9270da5b8e..b6ddf1d47cb4 100644
--- a/drivers/macintosh/via-macii.c
+++ b/drivers/macintosh/via-macii.c
@@ -140,24 +140,19 @@ static int macii_probe(void)
/* Initialize the driver */
static int macii_init(void)
{
- unsigned long flags;
int err;
- local_irq_save(flags);
-
err = macii_init_via();
if (err)
- goto out;
+ return err;
err = request_irq(IRQ_MAC_ADB, macii_interrupt, 0, "ADB",
macii_interrupt);
if (err)
- goto out;
+ return err;
macii_state = idle;
-out:
- local_irq_restore(flags);
- return err;
+ return 0;
}
/* initialize the hardware */
--
2.39.3
On Wed, Mar 13, 2024 at 3:55 AM Finn Thain <[email protected]> wrote:
> The via-macii ADB driver calls request_irq() after disabling hard
> interrupts. But disabling interrupts isn't necessary here because the
> VIA shift register interrupt was masked during VIA1 initialization.
>
> Cc: Joshua Thompson <[email protected]>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Finn Thain <[email protected]>
Reviewed-by: Geert Uytterhoeven <[email protected]>
i.e. will queue in the m68k tree for v6.10.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68korg
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds