mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
KVM: guest_memfd: Pass index, not gfn, to __kvm_gmem_get_pfn()
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>
This commit is contained in:
parent
54ba8c98a2
commit
4af18dc6a9
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user