Commit 3ad26d8139a82b0510b1e0435ee82ae461d33401
1 parent
506f0d6f9c
Exists in
master
and in
39 other branches
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, |
virt/kvm/iommu.c
... | ... | @@ -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 | } |
virt/kvm/kvm_main.c