KVM: iommu: fix releasing unmapped page
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Fri, 3 Aug 2012 07:36:52 +0000 (15:36 +0800)
committerAvi Kivity <avi@redhat.com>
Mon, 6 Aug 2012 13:04:46 +0000 (16:04 +0300)
There are two bugs:
- the 'error page' is forgot to be released
  [ it is unneeded after commit a2766325cf9f9, for backport, we
    still do kvm_release_pfn_clean for the error pfn ]

- guest pages are always released regardless of the unmapped page
  (e,g, caused by hwpoison)

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
virt/kvm/iommu.c

index c03f1fb26701f026a41fb5eccc194526530f67ea..6a67bea4019c000af722bf81369c0793b66b3386 100644 (file)
@@ -107,6 +107,7 @@ int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
                 */
                pfn = kvm_pin_pages(slot, gfn, page_size);
                if (is_error_pfn(pfn)) {
+                       kvm_release_pfn_clean(pfn);
                        gfn += 1;
                        continue;
                }
@@ -300,6 +301,12 @@ static void kvm_iommu_put_pages(struct kvm *kvm,
 
                /* Get physical address */
                phys = iommu_iova_to_phys(domain, gfn_to_gpa(gfn));
+
+               if (!phys) {
+                       gfn++;
+                       continue;
+               }
+
                pfn  = phys >> PAGE_SHIFT;
 
                /* Unmap address from IO address space */