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 <sea...@google.com>
---
 virt/kvm/guest_memfd.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/virt/kvm/guest_memfd.c b/virt/kvm/guest_memfd.c
index 8f079a61a56d..8a878e57c5d4 100644
--- a/virt/kvm/guest_memfd.c
+++ b/virt/kvm/guest_memfd.c
@@ -302,6 +302,11 @@ static inline struct file *kvm_gmem_get_file(struct 
kvm_memory_slot *slot)
        return get_file_active(&slot->gmem.file);
 }
 
+static pgoff_t kvm_gmem_get_index(struct kvm_memory_slot *slot, gfn_t gfn)
+{
+       return gfn - slot->base_gfn + slot->gmem.pgoff;
+}
+
 static struct file_operations kvm_gmem_fops = {
        .open           = generic_file_open,
        .release        = kvm_gmem_release,
@@ -551,12 +556,11 @@ void kvm_gmem_unbind(struct kvm_memory_slot *slot)
 }
 
 /* Returns a locked folio on success.  */
-static struct folio *
-__kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot,
-                  gfn_t gfn, kvm_pfn_t *pfn, bool *is_prepared,
-                  int *max_order)
+static struct folio *__kvm_gmem_get_pfn(struct file *file,
+                                       struct kvm_memory_slot *slot,
+                                       pgoff_t index, kvm_pfn_t *pfn,
+                                       bool *is_prepared, int *max_order)
 {
-       pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff;
        struct kvm_gmem *gmem = file->private_data;
        struct folio *folio;
 
@@ -592,6 +596,7 @@ __kvm_gmem_get_pfn(struct file *file, struct 
kvm_memory_slot *slot,
 int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot,
                     gfn_t gfn, kvm_pfn_t *pfn, int *max_order)
 {
+       pgoff_t index = kvm_gmem_get_index(slot, gfn);
        struct file *file = kvm_gmem_get_file(slot);
        struct folio *folio;
        bool is_prepared = false;
@@ -600,7 +605,7 @@ int kvm_gmem_get_pfn(struct kvm *kvm, struct 
kvm_memory_slot *slot,
        if (!file)
                return -EFAULT;
 
-       folio = __kvm_gmem_get_pfn(file, slot, gfn, pfn, &is_prepared, 
max_order);
+       folio = __kvm_gmem_get_pfn(file, slot, index, pfn, &is_prepared, 
max_order);
        if (IS_ERR(folio)) {
                r = PTR_ERR(folio);
                goto out;
@@ -648,6 +653,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, 
void __user *src, long
        for (i = 0; i < npages; i += (1 << max_order)) {
                struct folio *folio;
                gfn_t gfn = start_gfn + i;
+               pgoff_t index = kvm_gmem_get_index(slot, gfn);
                bool is_prepared = false;
                kvm_pfn_t pfn;
 
@@ -656,7 +662,7 @@ long kvm_gmem_populate(struct kvm *kvm, gfn_t start_gfn, 
void __user *src, long
                        break;
                }
 
-               folio = __kvm_gmem_get_pfn(file, slot, gfn, &pfn, &is_prepared, 
&max_order);
+               folio = __kvm_gmem_get_pfn(file, slot, index, &pfn, 
&is_prepared, &max_order);
                if (IS_ERR(folio)) {
                        ret = PTR_ERR(folio);
                        break;
-- 
2.47.0.rc1.288.g06298d1525-goog


Reply via email to