Skip to content

Commit 7ea92af

Browse files
Maxim Levitskybonzini
authored andcommitted
KVM: SEV: Use long-term pin when registering encrypted memory regions
JIRA: https://issues.redhat.com/browse/RHEL-95318 commit 7e066cb Author: Ge Yang <yangge1116@126.com> Date: Tue Feb 11 10:37:03 2025 +0800 KVM: SEV: Use long-term pin when registering encrypted memory regions When registering an encrypted memory region for SEV-MEM/SEV-ES guests, pin the pages with FOLL_TERM so that the pages are migrated out of MIGRATE_CMA/ZONE_MOVABLE. Failure to do so violates the CMA/MOVABLE mechanisms and can result in fragmentation due to unmovable pages, e.g. can make CMA allocations fail. Signed-off-by: Ge Yang <yangge1116@126.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Acked-by: David Hildenbrand <david@redhat.com> Link: https://lore.kernel.org/r/1739241423-14326-1-git-send-email-yangge1116@126.com [sean: massage changelog, make @flags an unsigned int] Signed-off-by: Sean Christopherson <seanjc@google.com> Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent d6a7ad2 commit 7ea92af

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

arch/x86/kvm/svm/sev.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ static int sev_launch_start(struct kvm *kvm, struct kvm_sev_cmd *argp)
627627

628628
static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
629629
unsigned long ulen, unsigned long *n,
630-
int write)
630+
unsigned int flags)
631631
{
632632
struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info;
633633
unsigned long npages, size;
@@ -668,7 +668,7 @@ static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
668668
return ERR_PTR(-ENOMEM);
669669

670670
/* Pin the user virtual address. */
671-
npinned = pin_user_pages_fast(uaddr, npages, write ? FOLL_WRITE : 0, pages);
671+
npinned = pin_user_pages_fast(uaddr, npages, flags, pages);
672672
if (npinned != npages) {
673673
pr_err("SEV: Failure locking %lu pages.\n", npages);
674674
ret = -ENOMEM;
@@ -756,7 +756,7 @@ static int sev_launch_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp)
756756
vaddr_end = vaddr + size;
757757

758758
/* Lock the user memory. */
759-
inpages = sev_pin_memory(kvm, vaddr, size, &npages, 1);
759+
inpages = sev_pin_memory(kvm, vaddr, size, &npages, FOLL_WRITE);
760760
if (IS_ERR(inpages))
761761
return PTR_ERR(inpages);
762762

@@ -1255,7 +1255,7 @@ static int sev_dbg_crypt(struct kvm *kvm, struct kvm_sev_cmd *argp, bool dec)
12551255
if (IS_ERR(src_p))
12561256
return PTR_ERR(src_p);
12571257

1258-
dst_p = sev_pin_memory(kvm, dst_vaddr & PAGE_MASK, PAGE_SIZE, &n, 1);
1258+
dst_p = sev_pin_memory(kvm, dst_vaddr & PAGE_MASK, PAGE_SIZE, &n, FOLL_WRITE);
12591259
if (IS_ERR(dst_p)) {
12601260
sev_unpin_memory(kvm, src_p, n);
12611261
return PTR_ERR(dst_p);
@@ -1321,7 +1321,7 @@ static int sev_launch_secret(struct kvm *kvm, struct kvm_sev_cmd *argp)
13211321
if (copy_from_user(&params, (void __user *)(uintptr_t)argp->data, sizeof(params)))
13221322
return -EFAULT;
13231323

1324-
pages = sev_pin_memory(kvm, params.guest_uaddr, params.guest_len, &n, 1);
1324+
pages = sev_pin_memory(kvm, params.guest_uaddr, params.guest_len, &n, FOLL_WRITE);
13251325
if (IS_ERR(pages))
13261326
return PTR_ERR(pages);
13271327

@@ -1803,7 +1803,7 @@ static int sev_receive_update_data(struct kvm *kvm, struct kvm_sev_cmd *argp)
18031803

18041804
/* Pin guest memory */
18051805
guest_page = sev_pin_memory(kvm, params.guest_uaddr & PAGE_MASK,
1806-
PAGE_SIZE, &n, 1);
1806+
PAGE_SIZE, &n, FOLL_WRITE);
18071807
if (IS_ERR(guest_page)) {
18081808
ret = PTR_ERR(guest_page);
18091809
goto e_free_trans;
@@ -2705,7 +2705,8 @@ int sev_mem_enc_register_region(struct kvm *kvm,
27052705
return -ENOMEM;
27062706

27072707
mutex_lock(&kvm->lock);
2708-
region->pages = sev_pin_memory(kvm, range->addr, range->size, &region->npages, 1);
2708+
region->pages = sev_pin_memory(kvm, range->addr, range->size, &region->npages,
2709+
FOLL_WRITE | FOLL_LONGTERM);
27092710
if (IS_ERR(region->pages)) {
27102711
ret = PTR_ERR(region->pages);
27112712
mutex_unlock(&kvm->lock);

0 commit comments

Comments
 (0)