]> www.infradead.org Git - users/willy/xarray.git/commitdiff
MIPS: cevt-r4k: Don't call get_c0_compare_int if timer irq is installed
authorJiaxun Yang <jiaxun.yang@flygoat.com>
Tue, 13 Aug 2024 09:59:08 +0000 (10:59 +0100)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Tue, 20 Aug 2024 08:36:52 +0000 (10:36 +0200)
This avoids warning:

[    0.118053] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:283

Caused by get_c0_compare_int on secondary CPU.

We also skipped saving IRQ number to struct clock_event_device *cd as
it's never used by clockevent core, as per comments it's only meant
for "non CPU local devices".

Reported-by: Serge Semin <fancer.lancer@gmail.com>
Closes: https://lore.kernel.org/linux-mips/6szkkqxpsw26zajwysdrwplpjvhl5abpnmxgu2xuj3dkzjnvsf@4daqrz4mf44k/
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
Tested-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/kernel/cevt-r4k.c

index 368e8475870f0810be1a707266c357c06b51ffd1..5f6e9e2ebbdbb805b37a2f7deef744e7bc3bb123 100644 (file)
@@ -303,13 +303,6 @@ int r4k_clockevent_init(void)
        if (!c0_compare_int_usable())
                return -ENXIO;
 
-       /*
-        * With vectored interrupts things are getting platform specific.
-        * get_c0_compare_int is a hook to allow a platform to return the
-        * interrupt number of its liking.
-        */
-       irq = get_c0_compare_int();
-
        cd = &per_cpu(mips_clockevent_device, cpu);
 
        cd->name                = "MIPS";
@@ -320,7 +313,6 @@ int r4k_clockevent_init(void)
        min_delta               = calculate_min_delta();
 
        cd->rating              = 300;
-       cd->irq                 = irq;
        cd->cpumask             = cpumask_of(cpu);
        cd->set_next_event      = mips_next_event;
        cd->event_handler       = mips_event_handler;
@@ -332,6 +324,13 @@ int r4k_clockevent_init(void)
 
        cp0_timer_irq_installed = 1;
 
+       /*
+        * With vectored interrupts things are getting platform specific.
+        * get_c0_compare_int is a hook to allow a platform to return the
+        * interrupt number of its liking.
+        */
+       irq = get_c0_compare_int();
+
        if (request_irq(irq, c0_compare_interrupt, flags, "timer",
                        c0_compare_interrupt))
                pr_err("Failed to request irq %d (timer)\n", irq);