Avi Kivity wrote: > Han, Weidong wrote: >> Don't need to map mmio pages for iommu. When find mmio pages in >> kvm_iommu_map_pages(), don't map them, and shouldn't return error >> due to it's not an error. If return error (such as -EINVAL), device >> assigment will fail. >> >> > > > I don't understand. Why don't we need to map mmio pages? We > certainly don't want them emulated.
mmio pages need not to be mapped in VT-d page table, which only translate DMA addresses. Amit's userspace patch register memslot for mmios of assigned devices, it doesn't emulate them. > >> @@ -36,14 +36,13 @@ int kvm_iommu_map_pages(struct kvm *kvm, { >> gfn_t gfn = base_gfn; >> pfn_t pfn; >> - int i, r; >> + int i, r = 0; >> struct dmar_domain *domain = kvm->arch.intel_iommu_domain; >> >> /* check if iommu exists and in use */ >> if (!domain) >> return 0; >> >> - r = -EINVAL; >> for (i = 0; i < npages; i++) { >> /* check if already mapped */ >> pfn = (pfn_t)intel_iommu_iova_to_pfn(domain, >> @@ -60,13 +59,14 @@ int kvm_iommu_map_pages(struct kvm *kvm, >> DMA_PTE_READ | DMA_PTE_WRITE); >> if (r) { >> - printk(KERN_DEBUG "kvm_iommu_map_pages:" >> + printk(KERN_ERR "kvm_iommu_map_pages:" >> "iommu failed to map pfn=%lx\n", >> pfn); >> goto unmap_pages; >> } >> } else { >> - printk(KERN_DEBUG "kvm_iommu_map_page:" >> - "invalid pfn=%lx\n", pfn); >> + printk(KERN_DEBUG "kvm_iommu_map_pages:" >> + "invalid pfn=%lx, iommu needn't map " >> + "MMIO pages!\n", pfn); >> goto unmap_pages; >> } > > If a slot has a mix of mmio and non-mmio pages, you will unmap the > non-mmio pages, yet return no error. > I didn't consider this mix case. In this mix case, we don't goto unmap_pages, actually we should remove else {} block. That maps non-mmio pages while don't map mmio pages. I will resend the patch. Randy (Weidong) > -- > error compiling committee.c: too many arguments to function -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html