Commit 3ad26d8139a82b0510b1e0435ee82ae461d33401

Authored by Marcelo Tosatti
1 parent 506f0d6f9c

KVM: use gfn_to_pfn_memslot in kvm_iommu_map_pages

So its possible to iommu map a memslot before making it visible to
kvm.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

Showing 3 changed files with 8 additions and 10 deletions Side-by-side Diff

include/linux/kvm_host.h
... ... @@ -440,8 +440,7 @@
440 440 #define KVM_IOMMU_CACHE_COHERENCY 0x1
441 441  
442 442 #ifdef CONFIG_IOMMU_API
443   -int kvm_iommu_map_pages(struct kvm *kvm, gfn_t base_gfn,
444   - unsigned long npages);
  443 +int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot);
445 444 int kvm_iommu_map_guest(struct kvm *kvm);
446 445 int kvm_iommu_unmap_guest(struct kvm *kvm);
447 446 int kvm_assign_device(struct kvm *kvm,
... ... @@ -32,10 +32,10 @@
32 32 static void kvm_iommu_put_pages(struct kvm *kvm,
33 33 gfn_t base_gfn, unsigned long npages);
34 34  
35   -int kvm_iommu_map_pages(struct kvm *kvm,
36   - gfn_t base_gfn, unsigned long npages)
  35 +int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
37 36 {
38   - gfn_t gfn = base_gfn;
  37 + gfn_t gfn = slot->base_gfn;
  38 + unsigned long npages = slot->npages;
39 39 pfn_t pfn;
40 40 int i, r = 0;
41 41 struct iommu_domain *domain = kvm->arch.iommu_domain;
... ... @@ -54,7 +54,7 @@
54 54 if (iommu_iova_to_phys(domain, gfn_to_gpa(gfn)))
55 55 continue;
56 56  
57   - pfn = gfn_to_pfn(kvm, gfn);
  57 + pfn = gfn_to_pfn_memslot(kvm, slot, gfn);
58 58 r = iommu_map_range(domain,
59 59 gfn_to_gpa(gfn),
60 60 pfn_to_hpa(pfn),
... ... @@ -69,7 +69,7 @@
69 69 return 0;
70 70  
71 71 unmap_pages:
72   - kvm_iommu_put_pages(kvm, base_gfn, i);
  72 + kvm_iommu_put_pages(kvm, slot->base_gfn, i);
73 73 return r;
74 74 }
75 75  
... ... @@ -81,8 +81,7 @@
81 81 slots = kvm->memslots;
82 82  
83 83 for (i = 0; i < slots->nmemslots; i++) {
84   - r = kvm_iommu_map_pages(kvm, slots->memslots[i].base_gfn,
85   - slots->memslots[i].npages);
  84 + r = kvm_iommu_map_pages(kvm, &slots->memslots[i]);
86 85 if (r)
87 86 break;
88 87 }
... ... @@ -684,7 +684,7 @@
684 684 spin_unlock(&kvm->mmu_lock);
685 685 #ifdef CONFIG_DMAR
686 686 /* map the pages in iommu page table */
687   - r = kvm_iommu_map_pages(kvm, base_gfn, npages);
  687 + r = kvm_iommu_map_pages(kvm, memslot);
688 688 if (r)
689 689 goto out;
690 690 #endif