qemu/include/sysemu
Joao Martins 5b1e96e654 vfio/iommufd: Introduce auto domain creation
There's generally two modes of operation for IOMMUFD:

1) The simple user API which intends to perform relatively simple things
with IOMMUs e.g. DPDK. The process generally creates an IOAS and attaches
to VFIO and mainly performs IOAS_MAP and UNMAP.

2) The native IOMMUFD API where you have fine grained control of the
IOMMU domain and model it accordingly. This is where most new feature
are being steered to.

For dirty tracking 2) is required, as it needs to ensure that
the stage-2/parent IOMMU domain will only attach devices
that support dirty tracking (so far it is all homogeneous in x86, likely
not the case for smmuv3). Such invariant on dirty tracking provides a
useful guarantee to VMMs that will refuse incompatible device
attachments for IOMMU domains.

Dirty tracking insurance is enforced via HWPT_ALLOC, which is
responsible for creating an IOMMU domain. This is contrast to the
'simple API' where the IOMMU domain is created by IOMMUFD automatically
when it attaches to VFIO (usually referred as autodomains) but it has
the needed handling for mdevs.

To support dirty tracking with the advanced IOMMUFD API, it needs
similar logic, where IOMMU domains are created and devices attached to
compatible domains. Essentially mimicking kernel
iommufd_device_auto_get_domain(). With mdevs given there's no IOMMU domain
it falls back to IOAS attach.

The auto domain logic allows different IOMMU domains to be created when
DMA dirty tracking is not desired (and VF can provide it), and others where
it is. Here it is not used in this way given how VFIODevice migration
state is initialized after the device attachment. But such mixed mode of
IOMMU dirty tracking + device dirty tracking is an improvement that can
be added on. Keep the 'all of nothing' of type1 approach that we have
been using so far between container vs device dirty tracking.

Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
[ clg: Added ERRP_GUARD() in iommufd_cdev_autodomains_get() ]
Signed-off-by: Cédric Le Goater <clg@redhat.com>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
2024-07-23 17:14:52 +02:00
..
accel-blocker.h bulk: Do not declare function prototypes using 'extern' keyword 2023-08-31 19:47:43 +02:00
accel-ops.h sysemu: add set_virtual_time to accel ops 2024-06-24 10:14:34 +01:00
arch_init.h target/nios2: Remove the deprecated Nios II target 2024-04-24 16:03:38 +02:00
balloon.h qapi: Restrict balloon-related commands to machine code 2020-09-29 15:41:35 +02:00
block-backend-common.h block: drain from main loop thread in bdrv_co_yield_to_drain() 2023-05-30 17:32:02 +02:00
block-backend-global-state.h block: Mark bdrv_first_blk() and bdrv_is_root_node() GRAPH_RDLOCK 2023-10-12 16:31:33 +02:00
block-backend-io.h util/defer-call: move defer_call() to util/ 2023-10-31 15:41:42 +01:00
block-backend.h include/sysemu/block-backend: split header into I/O and global state (GS) API 2022-03-04 18:18:25 +01:00
block-ram-registrar.h block: add BlockRAMRegistrar 2022-10-26 14:56:42 -04:00
blockdev.h include/sysemu/blockdev.h: global state API 2022-03-04 18:18:25 +01:00
cpu-throttle.h cpu-throttle: new module, extracted from cpus.c 2020-07-10 18:04:49 -04:00
cpu-timers-internal.h system: Rename softmmu/ directory as system/ 2023-10-08 21:08:08 +02:00
cpu-timers.h sysemu: add set_virtual_time to accel ops 2024-06-24 10:14:34 +01:00
cpus.h cpus: Remove unused smp_cores/smp_threads declarations 2023-10-12 00:37:39 +03:00
cryptodev-vhost-user.h cryptodev: Fix Lesser GPL version number 2020-10-27 16:48:49 +01:00
cryptodev-vhost.h include/: spelling fixes 2023-09-08 13:08:52 +03:00
cryptodev.h include/: spelling fixes 2023-09-08 13:08:52 +03:00
device_tree.h kconfig: allow compiling out QEMU device tree code per target 2024-05-10 15:45:15 +02:00
dirtylimit.h migration: Extend query-migrate to provide dirty page limit info 2023-07-26 10:55:56 +02:00
dirtyrate.h include: Include headers where needed 2023-01-08 01:54:22 -05:00
dma.h hw/dma: Let dma_buf_read() / dma_buf_write() propagate MemTxResult 2022-01-18 12:56:29 +01:00
dump-arch.h dump: Add arch cleanup function 2023-11-14 10:42:32 +01:00
dump.h dump: Allow directly outputting raw kdump format 2023-11-02 18:05:02 +04:00
event-loop-base.h Don't include headers already included by qemu/osdep.h 2023-02-08 07:28:05 +01:00
host_iommu_device.h HostIOMMUDevice: Introduce get_page_size_mask() callback 2024-07-09 11:50:37 +02:00
hostmem.h backends/hostmem: Report error when memory size is unaligned 2024-06-08 10:33:38 +02:00
hvf_int.h hvf: Makes assert_hvf_ok report failed expression 2024-06-08 10:33:38 +02:00
hvf.h exec: Rename NEED_CPU_H -> COMPILING_PER_TARGET 2024-04-26 09:49:51 +02:00
hw_accel.h accel: Remove HAX accelerator 2023-08-31 19:46:43 +02:00
iommufd.h vfio/iommufd: Introduce auto domain creation 2024-07-23 17:14:52 +02:00
iothread.h include/: spelling fixes 2023-09-08 13:08:52 +03:00
kvm_int.h kvm: Enable KVM_SET_USER_MEMORY_REGION2 for memslot 2024-04-23 17:35:25 +02:00
kvm_xen.h hw/xen: select kernel mode for per-vCPU event channel upcall vector 2023-11-06 10:03:45 +00:00
kvm.h kvm: move target-dependent interrupt routing out of kvm-all.c 2024-05-03 15:47:48 +02:00
memory_mapping.h memory: follow Error API guidelines 2023-10-19 23:13:27 +02:00
numa.h numa: remove types from typedefs.h 2024-05-03 15:47:48 +02:00
nvmm.h exec: Rename NEED_CPU_H -> COMPILING_PER_TARGET 2024-04-26 09:49:51 +02:00
os-posix.h qemu_init: increase NOFILE soft limit on POSIX 2024-02-09 12:47:58 +00:00
os-win32.h qemu_init: increase NOFILE soft limit on POSIX 2024-02-09 12:47:58 +00:00
qtest.h qtest: move qtest_{get, set}_virtual_clock to accel/qtest/qtest.c 2024-06-24 10:14:56 +01:00
replay.h system/replay: Restrict icount to system emulation 2024-01-19 12:28:59 +01:00
reset.h hw/core/reset: Implement qemu_register_reset via qemu_register_resettable 2024-02-27 13:01:42 +00:00
rng-random.h Use OBJECT_DECLARE_SIMPLE_TYPE when possible 2020-09-18 14:12:32 -04:00
rng.h qom: Remove module_obj_name parameter from OBJECT_DECLARE* macros 2020-09-18 14:12:32 -04:00
rtc.h rtc: Use time_t for passing and returning time offsets 2023-08-31 09:45:18 +01:00
runstate-action.h system: Rename softmmu/ directory as system/ 2023-10-08 21:08:08 +02:00
runstate.h hw/misc/pvpanic: add support for normal shutdowns 2024-07-01 17:16:04 -04:00
seccomp.h
stats.h include/: spelling fixes 2023-09-08 13:08:52 +03:00
sysemu.h stubs: remove obsolete stubs 2024-04-18 11:17:27 +02:00
tcg.h accel: Document generic accelerator headers 2023-06-28 13:55:35 +02:00
tpm_backend.h include/: spelling fixes 2023-09-08 13:08:52 +03:00
tpm_util.h tpm: Fix Lesser GPL version number 2020-11-15 16:44:18 +01:00
tpm.h sysemu/tpm: Clean up global variable shadowing 2023-10-06 13:27:48 +02:00
vhost-user-backend.h qom: Remove module_obj_name parameter from OBJECT_DECLARE* macros 2020-09-18 14:12:32 -04:00
watchdog.h watchdog: remove -watchdog option 2022-09-29 11:40:28 +02:00
whpx.h exec: Rename NEED_CPU_H -> COMPILING_PER_TARGET 2024-04-26 09:49:51 +02:00
xen-mapcache.h xen: mapcache: Pass the ram_addr offset to xen_map_cache() 2024-06-09 20:16:14 +02:00
xen.h xen: mapcache: Add support for grant mappings 2024-06-09 20:16:14 +02:00