diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 1729178..ed0a455 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -2345,21 +2345,18 @@ static int remap_area_mfn_pte_fn(pte_t *ptep, pgtable_t token, return 0; } -int xen_remap_domain_mfn_range(struct vm_area_struct *vma, - unsigned long addr, - unsigned long mfn, int nr, - pgprot_t prot, unsigned domid) +static int __xen_remap_domain_mfn_range(struct mm_struct *mm, + unsigned long addr, + unsigned long mfn, int nr, + pgprot_t prot, unsigned domid) { struct remap_data rmd; struct mmu_update mmu_update[REMAP_BATCH_SIZE]; int batch; unsigned long range; - int err = 0; - - prot = __pgprot(pgprot_val(prot) | _PAGE_IOMAP); - - vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; + int err; + rmd.mfn = mfn; rmd.prot = prot; @@ -2368,14 +2365,16 @@ int xen_remap_domain_mfn_range(struct vm_area_struct *vma, range = (unsigned long)batch << PAGE_SHIFT; rmd.mmu_update = mmu_update; - err = apply_to_page_range(vma->vm_mm, addr, range, + + err = apply_to_page_range(mm, addr, range, remap_area_mfn_pte_fn, &rmd); if (err) goto out; - err = -EFAULT; - if (HYPERVISOR_mmu_update(mmu_update, batch, NULL, domid) < 0) + if (HYPERVISOR_mmu_update(mmu_update, batch, NULL, domid) < 0) { + err = -EFAULT; goto out; + } nr -= batch; addr += range; @@ -2383,13 +2382,33 @@ int xen_remap_domain_mfn_range(struct vm_area_struct *vma, err = 0; out: - flush_tlb_all(); - return err; } + +int xen_remap_domain_mfn_range(struct vm_area_struct *vma, + unsigned long addr, + unsigned long mfn, int nr, + pgprot_t prot, unsigned domid) +{ + prot = __pgprot(pgprot_val(prot) | _PAGE_IOMAP); + + vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; + + return __xen_remap_domain_mfn_range(vma->vm_mm, addr, + mfn, nr, prot, domid); +} EXPORT_SYMBOL_GPL(xen_remap_domain_mfn_range); +int xen_remap_domain_kernel_mfn_range(unsigned long addr, + unsigned long mfn, int nr, + pgprot_t prot, unsigned domid) +{ + return __xen_remap_domain_mfn_range(&init_mm, addr, + mfn, nr, prot, domid); +} +EXPORT_SYMBOL_GPL(xen_remap_domain_kernel_mfn_range); + #ifdef CONFIG_XEN_DEBUG_FS static struct dentry *d_mmu_debug; diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h index 9769738..1922ef3 100644 --- a/include/xen/xen-ops.h +++ b/include/xen/xen-ops.h @@ -24,5 +24,8 @@ int xen_remap_domain_mfn_range(struct vm_area_struct *vma, unsigned long mfn, int nr, pgprot_t prot, unsigned domid); +int xen_remap_domain_kernel_mfn_range(unsigned long addr, + unsigned long mfn, int nr, + pgprot_t prot, unsigned domid); #endif /* INCLUDE_XEN_OPS_H */