qemu/include/hw/ppc
Alexey Kardashevskiy 5f36666722 spapr_iommu: Do not replay mappings from just created DMA window
On sPAPR vfio_listener_region_add() is called in 2 situations:
1. a new listener is registered from vfio_connect_container();
2. a new IOMMU Memory Region is added from rtas_ibm_create_pe_dma_window().

In both cases vfio_listener_region_add() calls
memory_region_iommu_replay() to notify newly registered IOMMU notifiers
about existing mappings which is totally desirable for case 1.

However for case 2 it is nothing but noop as the window has just been
created and has no valid mappings so replaying those does not do anything.
It is barely noticeable with usual guests but if the window happens to be
really big, such no-op replay might take minutes and trigger RCU stall
warnings in the guest.

For example, a upcoming GPU RAM memory region mapped at 64TiB (right
after SPAPR_PCI_LIMIT) causes a 64bit DMA window to be at least 128TiB
which is (128<<40)/0x10000=2.147.483.648 TCEs to replay.

This mitigates the problem by adding an "skipping_replay" flag to
sPAPRTCETable and defining sPAPR own IOMMU MR replay() hook which does
exactly the same thing as the generic one except it returns early if
@skipping_replay==true.

Another way of fixing this would be delaying replay till the very first
H_PUT_TCE but this does not work if in-kernel H_PUT_TCE handler is
enabled (a likely case).

When "ibm,create-pe-dma-window" is complete, the guest will map only
required regions of the huge DMA window.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Message-Id: <20190307050518.64968-2-aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2019-03-12 14:33:04 +11:00
..
fdt.h target/ppc: Pass cpu instead of env to ppc_create_page_sizes_prop() 2018-04-27 18:05:22 +10:00
mac_dbdma.h mac_dbdma: remove DBDMA_init() function 2017-09-27 13:05:41 +10:00
openpic.h mac_newworld: simplify IRQ wiring 2018-12-21 09:24:23 +11:00
openpic_kvm.h openpic: move KVM-specific declarations into separate openpic_kvm.h file 2018-03-06 13:16:29 +11:00
pnv.h ppc/pnv: introduce a new pic_print_info() operation to the chip model 2019-03-12 14:33:04 +11:00
pnv_core.h ppc/pnv: change the CPU machine_data presenter type to Object * 2019-03-12 14:33:04 +11:00
pnv_lpc.h ppc/pnv: introduce a new isa_create() operation to the chip model 2018-06-21 21:22:53 +10:00
pnv_occ.h pnv: Fix build failures on some host platforms 2017-05-11 09:45:15 +10:00
pnv_psi.h pnv/psi: move the ICSState qemu_irq array under the PSI device model 2019-01-09 09:28:14 +11:00
pnv_xive.h ppc/pnv: add a XIVE interrupt controller model for POWER9 2019-03-12 14:33:04 +11:00
pnv_xscom.h ppc/pnv: add a XIVE interrupt controller model for POWER9 2019-03-12 14:33:04 +11:00
ppc.h ppc: externalize ppc_get_vcpu_by_pir() 2019-03-12 14:33:04 +11:00
ppc4xx.h ppc4xx: Use ram_addr_t in ppc4xx_sdram_adjust() 2019-02-04 18:44:17 +11:00
ppc_e500.h intc/openpic: Build openpic only once 2013-07-09 21:33:02 +02:00
spapr.h spapr_iommu: Do not replay mappings from just created DMA window 2019-03-12 14:33:04 +11:00
spapr_cpu_core.h spapr: move the interrupt presenters under machine_data 2019-02-04 18:44:18 +11:00
spapr_drc.h spapr: create DR connectors for PHBs 2019-02-26 09:21:25 +11:00
spapr_irq.h spapr_irq: Expose the phandle of the interrupt controller 2019-02-26 09:21:25 +11:00
spapr_ovec.h spapr: Support ibm,dynamic-memory-v2 property 2018-04-27 18:05:23 +10:00
spapr_rtas.h tests: add RTAS command in the protocol 2016-09-23 10:29:40 +10:00
spapr_vio.h spapr: introduce a spapr_qirq() helper 2017-12-15 09:49:24 +11:00
spapr_xive.h spapr: Expose the name of the interrupt controller node 2019-02-26 09:21:25 +11:00
xics.h xics: Write source state to KVM at claim time 2019-02-26 09:21:25 +11:00
xics_spapr.h spapr: Expose the name of the interrupt controller node 2019-02-26 09:21:25 +11:00
xive.h ppc/pnv: export the xive_router_notify() routine 2019-03-12 14:33:04 +11:00
xive_regs.h ppc/xive: introduce a simplified XIVE presenter 2018-12-21 09:37:04 +11:00