Skip to content

Commit 15b8f44

Browse files
sean-jcjfvogel
authored andcommitted
KVM: guest_memfd: Pass index, not gfn, to __kvm_gmem_get_pfn()
[ Upstream commit 4af18dc ] Refactor guest_memfd usage of __kvm_gmem_get_pfn() to pass the index into the guest_memfd file instead of the gfn, i.e. resolve the index based on the slot+gfn in the caller instead of in __kvm_gmem_get_pfn(). This will allow kvm_gmem_get_pfn() to retrieve and return the specific "struct page", which requires the index into the folio, without a redoing the index calculation multiple times (which isn't costly, just hard to follow). Opportunistically add a kvm_gmem_get_index() helper to make the copy+pasted code easier to understand. Signed-off-by: Sean Christopherson <seanjc@google.com> Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-ID: <20241010182427.1434605-46-seanjc@google.com> Stable-dep-of: ae431059e75d ("KVM: guest_memfd: Remove bindings on memslot deletion when gmem is dying") Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 4559d96554dc9d9680699166d86c5cc2d9ab1bc3) Signed-off-by: Jack Vogel <jack.vogel@oracle.com>
1 parent cf23e30 commit 15b8f44

File tree

1 file changed

+13
-7
lines changed

1 file changed

+13
-7
lines changed

virt/kvm/guest_memfd.c

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,11 @@ static inline struct file *kvm_gmem_get_file(struct kvm_memory_slot *slot)
304304
return get_file_active(&slot->gmem.file);
305305
}
306306

307+
static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn)
308+
{
309+
return gfn - slot->base_gfn + slot->gmem.pgoff;
310+
}
311+
307312
static struct file_operations kvm_gmem_fops = {
308313
.open = generic_file_open,
309314
.release = kvm_gmem_release,
@@ -553,12 +558,11 @@ void kvm_gmem_unbind(struct kvm_memory_slot *slot)
553558
}
554559

555560
/* Returns a locked folio on success. */
556-
static struct folio *
557-
__kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot,
558-
gfn_t gfn, kvm_pfn_t *pfn, bool *is_prepared,
559-
int *max_order)
561+
static struct folio *__kvm_gmem_get_pfn(struct file *file,
562+
struct kvm_memory_slot *slot,
563+
pgoff_t index, kvm_pfn_t *pfn,
564+
bool *is_prepared, int *max_order)
560565
{
561-
pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff;
562566
struct kvm_gmem *gmem = file->private_data;
563567
struct folio *folio;
564568

@@ -594,6 +598,7 @@ __kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot,
594598
int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
595599
gfn_t gfn, kvm_pfn_t *pfn, int *max_order)
596600
{
601+
pgoff_t index = kvm_gmem_get_index(slot, gfn);
597602
struct file *file = kvm_gmem_get_file(slot);
598603
struct folio *folio;
599604
bool is_prepared = false;
@@ -602,7 +607,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
602607
if (!file)
603608
return -EFAULT;
604609

605-
folio = __kvm_gmem_get_pfn(file, slot, gfn, pfn, &is_prepared, max_order);
610+
folio = __kvm_gmem_get_pfn(file, slot, index, pfn, &is_prepared, max_order);
606611
if (IS_ERR(folio)) {
607612
r = PTR_ERR(folio);
608613
goto out;
@@ -650,6 +655,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, void __user *src, long
650655
for (i = 0; i < npages; i += (1 << max_order)) {
651656
struct folio *folio;
652657
gfn_t gfn = start_gfn + i;
658+
pgoff_t index = kvm_gmem_get_index(slot, gfn);
653659
bool is_prepared = false;
654660
kvm_pfn_t pfn;
655661

@@ -658,7 +664,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, void __user *src, long
658664
break;
659665
}
660666

661-
folio = __kvm_gmem_get_pfn(file, slot, gfn, &pfn, &is_prepared, &max_order);
667+
folio = __kvm_gmem_get_pfn(file, slot, index, &pfn, &is_prepared, &max_order);
662668
if (IS_ERR(folio)) {
663669
ret = PTR_ERR(folio);
664670
break;

0 commit comments

Comments
 (0)