Skip to content

Commit

Permalink
KVM: Device Assignment: Map mmio pages into VT-d page table
Browse files Browse the repository at this point in the history
Assigned device could DMA to mmio pages, so also need to map mmio pages
into VT-d page table.

Signed-off-by: Weidong Han <weidong.han@intel.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
  • Loading branch information
Weidong Han authored and Avi Kivity committed Oct 15, 2008
1 parent e482580 commit e5fcfc8
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 21 deletions.
29 changes: 11 additions & 18 deletions arch/x86/kvm/vtd.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,37 +36,30 @@ 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,
gfn_to_gpa(gfn));
if (pfn && !is_mmio_pfn(pfn))
if (pfn)
continue;

pfn = gfn_to_pfn(kvm, gfn);
if (!is_mmio_pfn(pfn)) {
r = intel_iommu_page_mapping(domain,
gfn_to_gpa(gfn),
pfn_to_hpa(pfn),
PAGE_SIZE,
DMA_PTE_READ |
DMA_PTE_WRITE);
if (r) {
printk(KERN_DEBUG "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);
r = intel_iommu_page_mapping(domain,
gfn_to_gpa(gfn),
pfn_to_hpa(pfn),
PAGE_SIZE,
DMA_PTE_READ |
DMA_PTE_WRITE);
if (r) {
printk(KERN_ERR "kvm_iommu_map_pages:"
"iommu failed to map pfn=%lx\n", pfn);
goto unmap_pages;
}
gfn++;
Expand Down
2 changes: 0 additions & 2 deletions include/asm-x86/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -502,8 +502,6 @@ int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
int kvm_pv_mmu_op(struct kvm_vcpu *vcpu, unsigned long bytes,
gpa_t addr, unsigned long *ret);

int is_mmio_pfn(pfn_t pfn);

extern bool tdp_enabled;

enum emulation_result {
Expand Down
2 changes: 1 addition & 1 deletion virt/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ static inline int valid_vcpu(int n)
return likely(n >= 0 && n < KVM_MAX_VCPUS);
}

inline int is_mmio_pfn(pfn_t pfn)
static inline int is_mmio_pfn(pfn_t pfn)
{
if (pfn_valid(pfn))
return PageReserved(pfn_to_page(pfn));
Expand Down

0 comments on commit e5fcfc8

Please sign in to comment.