s390/ap: swap IRQ and bus/device registration
authorHolger Dengler <dengler@linux.ibm.com>
Fri, 8 Mar 2024 16:23:25 +0000 (17:23 +0100)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Tue, 9 Apr 2024 15:29:55 +0000 (17:29 +0200)
The IRQ handler may rely on the bus or the root device. Register the
adapter IRQ after setting up the bus and the root device to avoid any
race conditions.

Signed-off-by: Holger Dengler <dengler@linux.ibm.com>
Reviewed-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
drivers/s390/crypto/ap_bus.c

index aabaf93004bc1bf1af51e22d39310d454ccba0eb..cdfaa321b44e4daa32fcaf794b78026d70cfb2ae 100644 (file)
@@ -2400,15 +2400,10 @@ static int __init ap_module_init(void)
                ap_domain_index = -1;
        }
 
-       /* enable interrupts if available */
-       rc = ap_irq_init();
-       if (rc)
-               goto out;
-
        /* Create /sys/bus/ap. */
        rc = bus_register(&ap_bus_type);
        if (rc)
-               goto out_irq;
+               goto out;
 
        /* Create /sys/devices/ap. */
        ap_root_device = root_device_register("ap");
@@ -2417,19 +2412,24 @@ static int __init ap_module_init(void)
                goto out_bus;
        ap_root_device->bus = &ap_bus_type;
 
+       /* enable interrupts if available */
+       rc = ap_irq_init();
+       if (rc)
+               goto out_device;
+
        /* Setup asynchronous work (timers, workqueue, etc). */
        rc = ap_async_init();
        if (rc)
-               goto out_device;
+               goto out_irq;
 
        return 0;
 
+out_irq:
+       ap_irq_exit();
 out_device:
        root_device_unregister(ap_root_device);
 out_bus:
        bus_unregister(&ap_bus_type);
-out_irq:
-       ap_irq_exit();
 out:
        ap_debug_exit();
        return rc;