From: Sean Christopherson <seanjc@google.com>
To: Sean Christopherson <seanjc@google.com>,
Paolo Bonzini <pbonzini@redhat.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
Liam Merwick <liam.merwick@oracle.com>
Subject: [PATCH 3/5] KVM: SEV: Disallow pinning more pages than exist in the system
Date: Thu, 12 Mar 2026 17:33:00 -0700 [thread overview]
Message-ID: <20260313003302.3136111-4-seanjc@google.com> (raw)
In-Reply-To: <20260313003302.3136111-1-seanjc@google.com>
Explicitly disallow pinning more pages for an SEV VM than exist in the
system to defend against absurd userspace requests without relying on
somewhat arbitrary kernel functionality to prevent truly stupid KVM
behavior. E.g. even with the INT_MAX check, userspace can request that
KVM pin nearly 8TiB of memory, regardless of how much RAM exists in the
system.
Opportunistically rename "locked" to a more descriptive "total_npages".
Signed-off-by: Sean Christopherson <seanjc@google.com>
---
arch/x86/kvm/svm/sev.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
index 857771586f16..bd94c64a9783 100644
--- a/arch/x86/kvm/svm/sev.c
+++ b/arch/x86/kvm/svm/sev.c
@@ -680,7 +680,7 @@ static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
struct kvm_sev_info *sev = to_kvm_sev_info(kvm);
unsigned long npages, size;
int npinned;
- unsigned long locked, lock_limit;
+ unsigned long total_npages, lock_limit;
struct page **pages;
unsigned long first, last;
int ret;
@@ -701,10 +701,14 @@ static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
if (npages > INT_MAX)
return ERR_PTR(-EINVAL);
- locked = sev->pages_locked + npages;
+ total_npages = sev->pages_locked + npages;
+ if (total_npages > totalram_pages())
+ return ERR_PTR(-EINVAL);
+
lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
- if (locked > lock_limit && !capable(CAP_IPC_LOCK)) {
- pr_err("SEV: %lu locked pages exceed the lock limit of %lu.\n", locked, lock_limit);
+ if (total_npages > lock_limit && !capable(CAP_IPC_LOCK)) {
+ pr_err("SEV: %lu total pages would exceed the lock limit of %lu.\n",
+ total_npages, lock_limit);
return ERR_PTR(-ENOMEM);
}
@@ -727,7 +731,7 @@ static struct page **sev_pin_memory(struct kvm *kvm, unsigned long uaddr,
}
*n = npages;
- sev->pages_locked = locked;
+ sev->pages_locked = total_npages;
return pages;
--
2.53.0.851.ga537e3e6e9-goog
next prev parent reply other threads:[~2026-03-13 0:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-13 0:32 [PATCH 0/5] KVM: SEV: Drop user-triggerable WARN clean up REG_REGION Sean Christopherson
2026-03-13 0:32 ` [PATCH 1/5] KVM: SEV: Drop WARN on large size for KVM_MEMORY_ENCRYPT_REG_REGION Sean Christopherson
2026-03-13 0:32 ` [PATCH 2/5] KVM: SEV: Drop useless sanity checks in sev_mem_enc_register_region() Sean Christopherson
2026-03-13 0:33 ` Sean Christopherson [this message]
2026-03-13 0:33 ` [PATCH 4/5] KVM: SEV: Use PFN_DOWN() to simplify "number of pages" math when pinning memory Sean Christopherson
2026-03-13 0:33 ` [PATCH 5/5] KVM: SEV: Use kvzalloc_objs() when pinning userpages Sean Christopherson
2026-03-16 16:04 ` [PATCH 0/5] KVM: SEV: Drop user-triggerable WARN clean up REG_REGION Liam Merwick
2026-04-08 0:14 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260313003302.3136111-4-seanjc@google.com \
--to=seanjc@google.com \
--cc=kvm@vger.kernel.org \
--cc=liam.merwick@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox