linux/Documentation
Chao Peng 8dd2eee9d5 KVM: x86/mmu: Handle page fault for private memory
Add support for resolving page faults on guest private memory for VMs
that differentiate between "shared" and "private" memory.  For such VMs,
KVM_MEM_GUEST_MEMFD memslots can include both fd-based private memory and
hva-based shared memory, and KVM needs to map in the "correct" variant,
i.e. KVM needs to map the gfn shared/private as appropriate based on the
current state of the gfn's KVM_MEMORY_ATTRIBUTE_PRIVATE flag.

For AMD's SEV-SNP and Intel's TDX, the guest effectively gets to request
shared vs. private via a bit in the guest page tables, i.e. what the guest
wants may conflict with the current memory attributes.  To support such
"implicit" conversion requests, exit to user with KVM_EXIT_MEMORY_FAULT
to forward the request to userspace.  Add a new flag for memory faults,
KVM_MEMORY_EXIT_FLAG_PRIVATE, to communicate whether the guest wants to
map memory as shared vs. private.

Like KVM_MEMORY_ATTRIBUTE_PRIVATE, use bit 3 for flagging private memory
so that KVM can use bits 0-2 for capturing RWX behavior if/when userspace
needs such information, e.g. a likely user of KVM_EXIT_MEMORY_FAULT is to
exit on missing mappings when handling guest page fault VM-Exits.  In
that case, userspace will want to know RWX information in order to
correctly/precisely resolve the fault.

Note, private memory *must* be backed by guest_memfd, i.e. shared mappings
always come from the host userspace page tables, and private mappings
always come from a guest_memfd instance.

Co-developed-by: Yu Zhang <yu.c.zhang@linux.intel.com>
Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com>
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>
Reviewed-by: Fuad Tabba <tabba@google.com>
Tested-by: Fuad Tabba <tabba@google.com>
Message-Id: <20231027182217.3615211-21-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2023-11-14 08:01:04 -05:00
..
2023-10-06 07:46:25 -07:00
2023-09-08 12:16:52 -07:00
2023-10-31 10:09:39 -04:00
2023-09-05 12:37:28 -07:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00
2023-09-08 12:16:52 -07:00
2023-09-10 11:55:26 -07:00
2023-09-01 12:21:32 -07:00
2023-07-03 11:26:05 -07:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00
2023-08-31 12:20:12 -07:00
2023-08-29 11:03:57 -05:00
2023-08-18 11:29:03 -06:00
2023-08-31 12:43:10 -07:00
2023-09-02 12:02:41 -07:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00
2023-08-18 11:29:03 -06:00