mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 08:14:15 +08:00
5a475554db
In confidential computing usages, whether a page is private or shared is necessary information for KVM to perform operations like page fault handling, page zapping etc. There are other potential use cases for per-page memory attributes, e.g. to make memory read-only (or no-exec, or exec-only, etc.) without having to modify memslots. Introduce the KVM_SET_MEMORY_ATTRIBUTES ioctl, advertised by KVM_CAP_MEMORY_ATTRIBUTES, to allow userspace to set the per-page memory attributes to a guest memory range. Use an xarray to store the per-page attributes internally, with a naive, not fully optimized implementation, i.e. prioritize correctness over performance for the initial implementation. Use bit 3 for the PRIVATE attribute so that KVM can use bits 0-2 for RWX attributes/protections in the future, e.g. to give userspace fine-grained control over read, write, and execute protections for guest memory. Provide arch hooks for handling attribute changes before and after common code sets the new attributes, e.g. x86 will use the "pre" hook to zap all relevant mappings, and the "post" hook to track whether or not hugepages can be used to map the range. To simplify the implementation wrap the entire sequence with kvm_mmu_invalidate_{begin,end}() even though the operation isn't strictly guaranteed to be an invalidation. For the initial use case, x86 *will* always invalidate memory, and preventing arch code from creating new mappings while the attributes are in flux makes it much easier to reason about the correctness of consuming attributes. It's possible that future usages may not require an invalidation, e.g. if KVM ends up supporting RWX protections and userspace grants _more_ protections, but again opt for simplicity and punt optimizations to if/when they are needed. Suggested-by: Sean Christopherson <seanjc@google.com> Link: https://lore.kernel.org/all/Y2WB48kD0J4VGynX@google.com Cc: Fuad Tabba <tabba@google.com> Cc: Xu Yilun <yilun.xu@intel.com> Cc: Mickaël Salaün <mic@digikod.net> Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com> Co-developed-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20231027182217.3615211-14-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
103 lines
1.9 KiB
Plaintext
103 lines
1.9 KiB
Plaintext
# SPDX-License-Identifier: GPL-2.0
|
|
# KVM common configuration items and defaults
|
|
|
|
config HAVE_KVM
|
|
bool
|
|
|
|
config HAVE_KVM_PFNCACHE
|
|
bool
|
|
|
|
config HAVE_KVM_IRQCHIP
|
|
bool
|
|
|
|
config HAVE_KVM_IRQFD
|
|
bool
|
|
|
|
config HAVE_KVM_IRQ_ROUTING
|
|
bool
|
|
|
|
config HAVE_KVM_DIRTY_RING
|
|
bool
|
|
|
|
# Only strongly ordered architectures can select this, as it doesn't
|
|
# put any explicit constraint on userspace ordering. They can also
|
|
# select the _ACQ_REL version.
|
|
config HAVE_KVM_DIRTY_RING_TSO
|
|
bool
|
|
select HAVE_KVM_DIRTY_RING
|
|
depends on X86
|
|
|
|
# Weakly ordered architectures can only select this, advertising
|
|
# to userspace the additional ordering requirements.
|
|
config HAVE_KVM_DIRTY_RING_ACQ_REL
|
|
bool
|
|
select HAVE_KVM_DIRTY_RING
|
|
|
|
# Allow enabling both the dirty bitmap and dirty ring. Only architectures
|
|
# that need to dirty memory outside of a vCPU context should select this.
|
|
config NEED_KVM_DIRTY_RING_WITH_BITMAP
|
|
bool
|
|
depends on HAVE_KVM_DIRTY_RING
|
|
|
|
config HAVE_KVM_EVENTFD
|
|
bool
|
|
select EVENTFD
|
|
|
|
config KVM_MMIO
|
|
bool
|
|
|
|
config KVM_ASYNC_PF
|
|
bool
|
|
|
|
# Toggle to switch between direct notification and batch job
|
|
config KVM_ASYNC_PF_SYNC
|
|
bool
|
|
|
|
config HAVE_KVM_MSI
|
|
bool
|
|
|
|
config HAVE_KVM_CPU_RELAX_INTERCEPT
|
|
bool
|
|
|
|
config KVM_VFIO
|
|
bool
|
|
|
|
config HAVE_KVM_INVALID_WAKEUPS
|
|
bool
|
|
|
|
config KVM_GENERIC_DIRTYLOG_READ_PROTECT
|
|
bool
|
|
|
|
config KVM_COMPAT
|
|
def_bool y
|
|
depends on KVM && COMPAT && !(S390 || ARM64 || RISCV)
|
|
|
|
config HAVE_KVM_IRQ_BYPASS
|
|
bool
|
|
|
|
config HAVE_KVM_VCPU_ASYNC_IOCTL
|
|
bool
|
|
|
|
config HAVE_KVM_VCPU_RUN_PID_CHANGE
|
|
bool
|
|
|
|
config HAVE_KVM_NO_POLL
|
|
bool
|
|
|
|
config KVM_XFER_TO_GUEST_WORK
|
|
bool
|
|
|
|
config HAVE_KVM_PM_NOTIFIER
|
|
bool
|
|
|
|
config KVM_GENERIC_HARDWARE_ENABLING
|
|
bool
|
|
|
|
config KVM_GENERIC_MMU_NOTIFIER
|
|
select MMU_NOTIFIER
|
|
bool
|
|
|
|
config KVM_GENERIC_MEMORY_ATTRIBUTES
|
|
select KVM_GENERIC_MMU_NOTIFIER
|
|
bool
|