KVM: Support dirty ring in conjunction with bitmap
authorGavin Shan <gshan@redhat.com>
Thu, 10 Nov 2022 10:49:10 +0000 (18:49 +0800)
committerMarc Zyngier <maz@kernel.org>
Thu, 10 Nov 2022 13:11:58 +0000 (13:11 +0000)
commit86bdf3ebcfe1ded055282536fecce13001874740
treea5d026afbabe42b47025a8f9fdcec9e652898d47
parente8a18565e59303ac12c626a161d72bd890bd2062
KVM: Support dirty ring in conjunction with bitmap

ARM64 needs to dirty memory outside of a VCPU context when VGIC/ITS is
enabled. It's conflicting with that ring-based dirty page tracking always
requires a running VCPU context.

Introduce a new flavor of dirty ring that requires the use of both VCPU
dirty rings and a dirty bitmap. The expectation is that for non-VCPU
sources of dirty memory (such as the VGIC/ITS on arm64), KVM writes to
the dirty bitmap. Userspace should scan the dirty bitmap before migrating
the VM to the target.

Use an additional capability to advertise this behavior. The newly added
capability (KVM_CAP_DIRTY_LOG_RING_WITH_BITMAP) can't be enabled before
KVM_CAP_DIRTY_LOG_RING_ACQ_REL on ARM64. In this way, the newly added
capability is treated as an extension of KVM_CAP_DIRTY_LOG_RING_ACQ_REL.

Suggested-by: Marc Zyngier <maz@kernel.org>
Suggested-by: Peter Xu <peterx@redhat.com>
Co-developed-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Gavin Shan <gshan@redhat.com>
Acked-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221110104914.31280-4-gshan@redhat.com
Documentation/virt/kvm/api.rst
Documentation/virt/kvm/devices/arm-vgic-its.rst
include/linux/kvm_dirty_ring.h
include/linux/kvm_host.h
include/uapi/linux/kvm.h
virt/kvm/Kconfig
virt/kvm/dirty_ring.c
virt/kvm/kvm_main.c