mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-28 21:02:43 +01:00
KVM: SEV: Drop FOLL_WRITE for encrypted region registration
When pinning SEV guest memory, drop FOLL_WRITE and rely on FOLL_LONGTERM to break CoW, as *KVM* doesn't actually to the memory using the GUP'd pages. Omitting FOLL_WRITE fixes a regression when using file-backed guest memory that was introduced when KVM (correctly) added FOLL_LONG (e.g. to ensure anonymous memory is migrated out of MIGRATE_CMA/ZONE_MOVABLE before a long term pin). Unfortunately, as of commits:8ac268436e("mm/gup: disallow FOLL_LONGTERM GUP-nonfast writing to file-backed mappings")a6e79df92e("mm/gup: disallow FOLL_LONGTERM GUP-fast writing to file-backed mappings") GUP uses FOLL_LONGTERM as a canary of sorts to detect pins that are likely to be problematic, and disallows WRITE+LONGTERM pins for file-backed memory. As a result, backing SEV+ guests with file-backed memory, e.g. virtio-pmem, fails due to the disallowed FOLL_LONGTERM+FOLL_WRITE combination. Note, in the past, FOLL_WRITE was required to trigger CoW unsharing, to prevent replacing the page in the (primary MMU's) page tables during a later write fault after already having pinned a (shared) page in MAP_PRIVATE mappings. FOLL_LONGTERM does that nowadays, even without FOLL_WRITE (see gup_must_unshare()). Fixes:7e066cb9b7("KVM: SEV: Use long-term pin when registering encrypted memory regions") Cc: [email protected] Suggested-by: "David Hildenbrand (Arm)" <[email protected]> Link: https://lore.kernel.org/all/[email protected]/ Signed-off-by: Pankaj Gupta <[email protected]> Acked-by: David Hildenbrand (Arm) <[email protected]> Acked-by: Lorenzo Stoakes (ARM) <[email protected]> Link: https://patch.msgid.link/[email protected] [sean: massage changelog, add comment about CoW unsharing] Signed-off-by: Sean Christopherson <[email protected]>
This commit is contained in:
1 parent
bfafeb04a0
commit
ee1a586dd1
1 file changed
+5
-1
@@ -2750,8 +2750,12 @@ int sev_mem_enc_register_region(struct kvm *kvm,
|
||||
if (!region)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* Do NOT specify FOLL_WRITE, as KVM isn't using the pinned pages to
|
||||
* write memory, and FOLL_LONGTERM itself triggers CoW unshare.
|
||||
*/
|
||||
region->pages = sev_pin_memory(kvm, range->addr, range->size, ®ion->npages,
|
||||
FOLL_WRITE | FOLL_LONGTERM);
|
||||
FOLL_LONGTERM);
|
||||
if (IS_ERR(region->pages)) {
|
||||
ret = PTR_ERR(region->pages);
|
||||
goto e_free;
|
||||
|
||||
Reference in new issue
Block a user