Using WARN_ON(.) I have determined that during initialization - ioapic entries are read from [] __ioapic_read_entry+0x88/0xa0 [] ioapic_read_entry+0x32/0x60 [] enable_IO_APIC+0x63/0x10b [] apic_bsp_setup+0x89/0xae [] native_smp_prepare_cpus+0x2cf/0x30d [] kernel_init_freeable+0xa5/0x1ef kernel_init_freeable() init/main.c:995 {inlined} do_pre_smp_initcalls() init/main.c:888 do_one_initcall(*fn); - mp_irqdomain_activate() is called for apic=0, pin=0 (timer irq) from [] mp_irqdomain_activate+0x9c/0xb0 [] irq_domain_activate_irq+0x41/0x50 [] setup_IO_APIC+0x687/0x830 [] ? clear_IO_APIC+0x4d/0x70 [] apic_bsp_setup+0xa2/0xae [] native_smp_prepare_cpus+0x2cf/0x30d [] kernel_init_freeable+0xa5/0x1ef kernel_init_freeable() init/main.c:995 {inlined} do_pre_smp_initcalls() init/main.c:888 do_one_initcall(*fn); - ioapic_set_affinity() is called from [] ioapic_set_affinity+0xdc/0xf0 [] setup_ioapic_dest+0xd8/0xf6 [] native_smp_cpus_done+0x10a/0x117 [] smp_init+0x69/0x88 [] kernel_init_freeable+0xdb/0x1ef kernel_init_freeable() init/main.c:999 sched_init_smp(); - the next mp_irqdomain_activate() is for apic=0, pin=21 and called from [] mp_irqdomain_activate+0x9c/0xb0 [] irq_domain_activate_irq+0x41/0x50 [] irq_startup+0x2c/0x80 [] __setup_irq+0x511/0x5a0 [] ? kmem_cache_alloc_trace+0x1e2/0x220 [] ? request_threaded_irq+0xad/0x1b0 [] ? acpi_osi_handler+0xa9/0xa9 [] ? acpi_osi_handler+0xa9/0xa9 [] request_threaded_irq+0xf7/0x1b0 [] ? acpi_ev_sci_dispatch+0x65/0x65 [] ? acpi_sleep_proc_init+0x2a/0x2a [] acpi_os_install_interrupt_handler+0x92/0xc6 [] acpi_ev_install_sci_handler+0x23/0x25 [] acpi_ev_install_xrupt_handlers+0x1c/0x6e [] acpi_enable_subsystem+0x8b/0x90 [] acpi_init+0x75/0x267 [] ? acpi_sleep_proc_init+0x2a/0x2a [] do_one_initcall+0xd4/0x210 [] ? parse_args+0x190/0x480 [] ? __wake_up+0x48/0x60 [] kernel_init_freeable+0x162/0x1ef kernel_init_freeable() init/main.c:1001 {inlined} do_basic_setup() init/main.c:880 {inlined} do_initcalls() init/main.c:861 {inlined} do_initcall_level(.) init/main.c:853 do_one_initcall(*fn); The timer irq (pin=0) seems to be special (legacy irq?) and its mp_irqdomain_activate() is called early through setup_IO_APIC() and check_timer(). However, the rest of the mp_irqdomain_activate() calls come later through acpi_init(). What does stand out is that ioapic_set_affinity() for all other irqs is called before acpi_init() and therefore it's likely that something is not yet initialized, so actually activating these irqs at that point is premature. And the combination of commits 0be275e3a5607b23f5132121bca22a10ee23aa99 4857c91f0d195f05908fff296ba1ec5fca87066c actually causes activation of those irqs through __ioapic_write_entry() with eu.entry.mask=0 as already shown by my previous logs. What I still do not understand is why do those "cached" entries have mask=0. The commit message commit 0be275e3a5607b23f5132121bca22a10ee23aa99 Author: Jiang Liu