Merge tag 'x86-apic-2023-04-24' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-block.git] / arch / x86 / kernel / apic / io_apic.c
index 146671de9ddc418e7e3888801f2fb288a243543c..4241dc243aa88d019b28cb3cd114a24e3c93679e 100644 (file)
@@ -2478,17 +2478,21 @@ static int io_apic_get_redir_entries(int ioapic)
 
 unsigned int arch_dynirq_lower_bound(unsigned int from)
 {
+       unsigned int ret;
+
        /*
         * dmar_alloc_hwirq() may be called before setup_IO_APIC(), so use
         * gsi_top if ioapic_dynirq_base hasn't been initialized yet.
         */
-       if (!ioapic_initialized)
-               return gsi_top;
+       ret = ioapic_dynirq_base ? : gsi_top;
+
        /*
-        * For DT enabled machines ioapic_dynirq_base is irrelevant and not
-        * updated. So simply return @from if ioapic_dynirq_base == 0.
+        * For DT enabled machines ioapic_dynirq_base is irrelevant and
+        * always 0. gsi_top can be 0 if there is no IO/APIC registered.
+        * 0 is an invalid interrupt number for dynamic allocations. Return
+        * @from instead.
         */
-       return ioapic_dynirq_base ? : from;
+       return ret ? : from;
 }
 
 #ifdef CONFIG_X86_32