linux/drivers/irqchip
Marc Zyngier 8525160ea2 irqchip/gic-v3: Force propagation of the active state with a read-back
commit 464cb98f1c upstream.

Christoffer reports that on some implementations, writing to
GICR_ISACTIVER0 (and similar GICD registers) can race badly with a guest
issuing a deactivation of that interrupt via the system register interface.

There are multiple reasons to this:

 - this uses an early write-acknoledgement memory type (nGnRE), meaning
   that the write may only have made it as far as some interconnect
   by the time the store is considered "done"

 - the GIC itself is allowed to buffer the write until it decides to
   take it into account (as long as it is in finite time)

The effects are that the activation may not have taken effect by the time
the kernel enters the guest, forcing an immediate exit, or that a guest
deactivation occurs before the interrupt is active, doing nothing.

In order to guarantee that the write to the ISACTIVER register has taken
effect, read back from it, forcing the interconnect to propagate the write,
and the GIC to process the write before returning the read.

Reported-by: Christoffer Dall <christoffer.dall@arm.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Christoffer Dall <christoffer.dall@arm.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20241106084418.3794612-1-maz@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2024-11-14 13:15:19 +01:00
..
alphascale_asm9260-icoll.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152 2019-05-30 11:26:32 -07:00
exynos-combiner.c Merge branch irq/generic_handle_domain_irq-core into irq/irqchip-next 2021-06-11 14:32:12 +01:00
irq-al-fic.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-alpine-msi.c irqchip/alpine-msi: Fix off-by-one in allocation error path 2024-06-12 11:03:10 +02:00
irq-apple-aic.c irqchip/apple-aic: Make symbol 'use_fast_ipi' static 2022-07-01 14:26:13 +01:00
irq-armada-370-xp.c irqchip/armada-370-xp: Do not allow mapping IRQ 0 and 1 2024-09-12 11:10:19 +02:00
irq-aspeed-i2c-ic.c irqchip/aspeed-i2c-ic: Fix irq_of_parse_and_map() return value 2022-05-04 16:37:48 +01:00
irq-aspeed-scu-ic.c irqchip/aspeed-scu-ic: Fix irq_of_parse_and_map() return value 2022-05-04 16:37:48 +01:00
irq-aspeed-vic.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-ath79-cpu.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
irq-ath79-misc.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-atmel-aic-common.c irqchip/atmel-aic: Remove root argument from ->fixup() prototype 2017-07-04 11:10:37 +01:00
irq-atmel-aic-common.h irqchip/atmel-aic: Remove root argument from ->fixup() prototype 2017-07-04 11:10:37 +01:00
irq-atmel-aic.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-atmel-aic5.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-bcm2835.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-bcm2836.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-bcm6345-l1.c irq-bcm6345-l1: Do not assume a fixed block to cpu mapping 2023-08-03 10:24:14 +02:00
irq-bcm7038-l1.c irqchip/irq-bcm7038-l1: Switch to IRQCHIP_PLATFORM_DRIVER 2021-10-20 20:06:33 +01:00
irq-bcm7120-l2.c irqchip/irq-bcm7120-l2: Set IRQ_LEVEL for level triggered interrupts 2023-03-10 09:33:07 +01:00
irq-brcmstb-l2.c irqchip/irq-brcmstb-l2: Add write memory barrier before exit 2024-02-23 09:12:44 +01:00
irq-clps711x.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-crossbar.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
irq-csky-apb-intc.c irqchip/csky: Return true/false (not 1/0) from bool functions 2022-05-04 16:49:47 +01:00
irq-csky-mpintc.c irqchip/csky-mpintc: Fixup mask/unmask implementation 2021-11-12 16:09:50 +00:00
irq-davinci-aintc.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-davinci-cp-intc.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-digicolor.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-dw-apb-ictl.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-ftintc010.c irqchip/versatile-fpga: Switch to dynamic chip name output 2022-02-15 11:25:46 +00:00
irq-gic-common.c irqchip/gic: Correctly validate OF quirk descriptors 2023-06-21 16:00:54 +02:00
irq-gic-common.h irqchip/gic-v3: Disable pseudo NMIs on Mediatek devices w/ firmware issues 2023-06-21 16:00:52 +02:00
irq-gic-pm.c irqchip: gic-pm: Use pm_runtime_resume_and_get() in gic_probe() 2022-12-31 13:31:57 +01:00
irq-gic-realview.c irqchip/gic/realview: Fix refcount leak in realview_gic_of_init 2022-06-09 17:36:57 +01:00
irq-gic-v2m.c irqchip/gic-v2m: Fix refcount leak in gicv2m_of_init() 2024-09-12 11:10:17 +02:00
irq-gic-v3-its-fsl-mc-msi.c bus: fsl-mc: Add ACPI support for fsl-mc 2020-07-28 15:51:32 +01:00
irq-gic-v3-its-pci-msi.c PCI/MSI: Make pci_msi_domain_write_msg() static 2021-12-09 11:52:20 +01:00
irq-gic-v3-its-platform-msi.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 234 2019-06-19 17:09:07 +02:00
irq-gic-v3-its.c irqchip/gic-v4: Don't allow a VMOVP on a dying VPE 2024-10-22 15:56:51 +02:00
irq-gic-v3-mbi.c iommu/dma: Move public interfaces to linux/iommu.h 2022-09-07 14:47:00 +02:00
irq-gic-v3.c irqchip/gic-v3: Force propagation of the active state with a read-back 2024-11-14 13:15:19 +01:00
irq-gic-v4.c arm64/sysreg: Add _EL1 into ID_AA64PFR0_EL1 definition names 2022-09-09 10:59:02 +01:00
irq-gic.c APCI: irq: Add support for multiple GSI domains 2022-07-20 12:05:17 +01:00
irq-goldfish-pic.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-hip04.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-i8259.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-idt3243x.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-imgpdc.c Merge branch irq/generic_handle_domain_irq-core into irq/irqchip-next 2021-06-11 14:32:12 +01:00
irq-imx-gpcv2.c irqchip/imx-gpcv2: Mark imx_gpcv2_instance with __ro_after_init 2021-12-16 15:19:43 +00:00
irq-imx-intmux.c irqchip/imx-intmux: Move PM device over to irq domain 2022-02-09 13:36:53 +00:00
irq-imx-irqsteer.c irqchip/imx-irqsteer: Handle runtime power management correctly 2024-08-03 08:49:40 +02:00
irq-imx-mu-msi.c irqchip/imx-mu-msi: Fix wrong register offset for 8ulp 2022-10-04 23:35:36 +01:00
irq-ingenic-tcu.c irqchip/ingenic-tcu: Use correctly sized arguments for bit field 2021-12-16 15:19:52 +00:00
irq-ingenic.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-ixp4xx.c irq/gpio: ixp4xx: Drop boardfile probe path 2022-04-25 20:53:18 +02:00
irq-jcore-aic.c irqchip/jcore-aic: Fix missing allocation of IRQ descriptors 2023-07-19 16:20:58 +02:00
irq-keystone.c treewide: Replace GPLv2 boilerplate/reference with SPDX - gpl-2.0_30.RULE (part 2) 2022-06-10 14:51:35 +02:00
irq-loongarch-cpu.c irqchip/loongarch-cpu: Fix return value of lpic_gsi_to_irq() 2024-08-14 13:52:50 +02:00
irq-loongson-eiointc.c irqchip/loongson-eiointc: Use correct struct type in eiointc_domain_alloc() 2024-02-23 09:12:35 +01:00
irq-loongson-htpic.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-loongson-htvec.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-loongson-liointc.c irqchip/loongson-liointc: Set different ISRs for different cores 2024-07-05 09:31:57 +02:00
irq-loongson-pch-lpc.c irqchip: Add Loongson PCH LPC controller support 2022-07-20 12:09:20 +01:00
irq-loongson-pch-msi.c irqchip/loongson-pch-msi: Fix off-by-one on allocation error path 2024-06-12 11:03:10 +02:00
irq-loongson-pch-pic.c irqchip/loongson-pch-pic: Fix initialization of HT vector register 2023-07-19 16:22:09 +02:00
irq-lpc32xx.c irqchip/lpc32xx: Switch to dynamic chip name output 2022-02-15 11:25:46 +00:00
irq-ls-extirq.c irqchip/ls-extirq: Fix endianness detection 2022-12-21 17:48:04 +01:00
irq-ls-scfg-msi.c iommu/dma: Move public interfaces to linux/iommu.h 2022-09-07 14:47:00 +02:00
irq-ls1x.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-madera.c irqchip/madera: Drop GPIO includes 2019-01-17 17:04:24 +00:00
irq-mbigen.c irqchip/mbigen: Fix mbigen node address layout 2024-08-14 13:52:42 +02:00
irq-mchp-eic.c irqchip/mchp-eic: Fix return value check in mchp_eic_init() 2021-10-25 09:02:18 +01:00
irq-meson-gpio.c irqchip/meson-gpio: Convert meson_gpio_irq_controller::lock to 'raw_spinlock_t' 2024-08-14 13:52:50 +02:00
irq-mips-cpu.c irqchip/mips: Fix RCU violation when using irqdomain lookup on interrupt entry 2021-07-09 10:18:58 +01:00
irq-mips-gic.c irqchip/mips-gic: Use raw spinlock for gic_lock 2023-05-30 14:03:20 +01:00
irq-mmp.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-mscc-ocelot.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-mst-intc.c irqchip/irq-mst: Support polarity configuration 2021-04-07 13:26:00 +01:00
irq-mtk-cirq.c irq: Fix typos in comments 2021-03-22 04:23:14 +01:00
irq-mtk-sysirq.c irqchip/mtk-sysirq: Skip setting irq-wake 2021-08-12 08:15:15 +01:00
irq-mvebu-gicp.c irqchip/irq-mvebu-gicp: Fix refcount leak in mvebu_gicp_probe 2023-03-10 09:33:00 +01:00
irq-mvebu-icu.c platform-msi: Rename functions and clarify comments 2021-12-16 22:16:39 +01:00
irq-mvebu-odmi.c irqchip/mvebu-odmi: Switch to bitmap_zalloc() 2021-07-26 18:04:11 +01:00
irq-mvebu-pic.c irqchip/mvebu-pic: Switch to dynamic chip name output 2022-02-15 11:25:46 +00:00
irq-mvebu-sei.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-mxs.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-nvic.c ARM development updates for 5.18: 2022-03-23 17:35:57 -07:00
irq-omap-intc.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-ompic.c irqchip/ompic: fix return value check in ompic_of_init() 2018-01-04 11:13:22 +00:00
irq-or1k-pic.c irqchip: or1k-pic: Undefine mask_ack for level triggered hardware 2022-06-28 17:31:15 +09:00
irq-orion.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-owl-sirq.c irqchip: Add Actions Semi Owl SIRQ controller 2020-09-25 16:57:33 +01:00
irq-partition-percpu.c irqchip/partitions: Switch to bitmap_zalloc() 2021-07-26 18:01:27 +01:00
irq-pic32-evic.c irqchip/mips: Fix RCU violation when using irqdomain lookup on interrupt entry 2021-07-09 10:18:58 +01:00
irq-pruss-intc.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-qcom-mpm.c irqchip/irq-qcom-mpm: fix return value check in qcom_mpm_init() 2022-04-05 16:33:13 +01:00
irq-rda-intc.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-realtek-rtl.c irqchip/realtek-rtl: use parent interrupts 2022-09-28 14:17:10 +01:00
irq-renesas-intc-irqpin.c irqchip/renesas-intc-irqpin: Move PM device over to irq domain 2022-02-09 13:36:44 +00:00
irq-renesas-irqc.c irqchip/renesas-irqc: Move PM device over to irq domain 2022-02-09 13:36:53 +00:00
irq-renesas-rza1.c irqchip/renesas-rza1: Use semicolons instead of commas 2021-09-22 14:37:59 +01:00
irq-renesas-rzg2l.c irqchip/renesas-rzg2l: Fix missing put_device 2024-11-01 01:56:00 +01:00
irq-riscv-intc.c irqchip/riscv-intc: Mark all INTC nodes as initialized 2023-11-08 14:10:57 +01:00
irq-sa11x0.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-sifive-plic.c irqchip/sifive-plic: Unmask interrupt in plic_irq_enable() 2024-10-22 15:56:51 +02:00
irq-sl28cpld.c irqchip/irq-sl28cpld: Convert comma to semicolon 2020-12-18 17:43:47 +00:00
irq-sni-exiu.c irqchip/exiu: Fix acknowledgment of edge triggered interrupts 2022-05-04 16:33:17 +01:00
irq-sp7021-intc.c irqchip: Add Sunplus SP7021 interrupt controller driver 2022-07-08 14:23:57 +02:00
irq-st.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
irq-stm32-exti.c irqchip/stm32-exti: add missing DT IRQ flag translation 2023-11-08 14:10:57 +01:00
irq-sun4i.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-sun6i-r.c irqchip/sun6i-r: Use NULL for chip_data 2022-05-04 16:36:59 +01:00
irq-sunxi-nmi.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-tb10x.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
irq-tegra.c irqchip/tegra: Fix overflow implicit truncation warnings 2022-06-15 17:41:11 +02:00
irq-ti-sci-inta.c soc: ti: ti_sci_inta_msi: Use msi_desc::msi_index 2021-12-16 22:16:40 +01:00
irq-ti-sci-intr.c irqchip/ti-sci: Fix refcount leak in ti_sci_intr_irq_domain_probe 2023-03-10 09:33:00 +01:00
irq-ts4800.c irqchip/ts4800: Switch to dynamic chip name output 2022-02-15 11:25:46 +00:00
irq-uniphier-aidet.c irqchip/uniphier-aidet: Add compatible string for NX1 SoC 2022-06-09 17:41:57 +01:00
irq-versatile-fpga.c irqchip/versatile-fpga: Switch to dynamic chip name output 2022-02-15 11:25:46 +00:00
irq-vf610-mscm-ir.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 500 2019-06-19 17:09:55 +02:00
irq-vic.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-vt8500.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irq-wpcm450-aic.c irqchip/wpcm450: Fix memory leak in wpcm450_aic_of_init() 2022-12-31 13:31:57 +01:00
irq-xilinx-intc.c irqchip/xilinx: Fix shift out of bounds 2024-08-14 13:52:58 +02:00
irq-xtensa-mx.c irqchip/xtensa-mx: Fix initial IRQ affinity in non-SMP setup 2022-05-04 16:35:38 +01:00
irq-xtensa-pic.c drivers/irqchip: xtensa: add warning to irq_retrigger 2019-01-26 02:02:14 -08:00
irq-zevio.c irq: remove handle_domain_{irq,nmi}() 2021-10-26 10:13:31 +01:00
irqchip.c irqchip: Fix refcount leak in platform_irqchip_probe 2023-03-10 09:32:59 +01:00
Kconfig irqchip/gicv3: Workaround for NVIDIA erratum T241-FABRIC-4 2023-05-24 17:32:36 +01:00
Makefile irqchip: Add IMX MU MSI controller driver 2022-09-29 17:11:37 +01:00
qcom-irq-combiner.c irqchip: Bulk conversion to generic_handle_domain_irq() 2021-06-10 13:09:19 +01:00
qcom-pdc.c irqchip/qcom-pdc: Drop open coded version of __assign_bit() 2022-03-01 10:06:25 +00:00
spear-shirq.c irqchip/spear-shirq: Add support for IRQ 0..6 2021-12-16 13:29:44 +00:00