diff options
| -rw-r--r-- | virt/kvm/iommu.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/virt/kvm/iommu.c b/virt/kvm/iommu.c index 0df7d4b34dfe..714b94932312 100644 --- a/virt/kvm/iommu.c +++ b/virt/kvm/iommu.c | |||
| @@ -61,6 +61,14 @@ static pfn_t kvm_pin_pages(struct kvm_memory_slot *slot, gfn_t gfn, | |||
| 61 | return pfn; | 61 | return pfn; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages) | ||
| 65 | { | ||
| 66 | unsigned long i; | ||
| 67 | |||
| 68 | for (i = 0; i < npages; ++i) | ||
| 69 | kvm_release_pfn_clean(pfn + i); | ||
| 70 | } | ||
| 71 | |||
| 64 | int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) | 72 | int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) |
| 65 | { | 73 | { |
| 66 | gfn_t gfn, end_gfn; | 74 | gfn_t gfn, end_gfn; |
| @@ -123,6 +131,7 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) | |||
| 123 | if (r) { | 131 | if (r) { |
| 124 | printk(KERN_ERR "kvm_iommu_map_address:" | 132 | printk(KERN_ERR "kvm_iommu_map_address:" |
| 125 | "iommu failed to map pfn=%llx\n", pfn); | 133 | "iommu failed to map pfn=%llx\n", pfn); |
| 134 | kvm_unpin_pages(kvm, pfn, page_size); | ||
| 126 | goto unmap_pages; | 135 | goto unmap_pages; |
| 127 | } | 136 | } |
| 128 | 137 | ||
| @@ -134,7 +143,7 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot) | |||
| 134 | return 0; | 143 | return 0; |
| 135 | 144 | ||
| 136 | unmap_pages: | 145 | unmap_pages: |
| 137 | kvm_iommu_put_pages(kvm, slot->base_gfn, gfn); | 146 | kvm_iommu_put_pages(kvm, slot->base_gfn, gfn - slot->base_gfn); |
| 138 | return r; | 147 | return r; |
| 139 | } | 148 | } |
| 140 | 149 | ||
| @@ -266,14 +275,6 @@ out_unlock: | |||
| 266 | return r; | 275 | return r; |
| 267 | } | 276 | } |
| 268 | 277 | ||
| 269 | static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages) | ||
| 270 | { | ||
| 271 | unsigned long i; | ||
| 272 | |||
| 273 | for (i = 0; i < npages; ++i) | ||
| 274 | kvm_release_pfn_clean(pfn + i); | ||
| 275 | } | ||
| 276 | |||
| 277 | static void kvm_iommu_put_pages(struct kvm *kvm, | 278 | static void kvm_iommu_put_pages(struct kvm *kvm, |
| 278 | gfn_t base_gfn, unsigned long npages) | 279 | gfn_t base_gfn, unsigned long npages) |
| 279 | { | 280 | { |
