aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen/privcmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/xen/privcmd.c')
-rw-r--r--drivers/xen/privcmd.c35
1 files changed, 5 insertions, 30 deletions
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
index 2f5ce7230a43..c6070e70dd73 100644
--- a/drivers/xen/privcmd.c
+++ b/drivers/xen/privcmd.c
@@ -724,25 +724,6 @@ static long privcmd_ioctl_restrict(struct file *file, void __user *udata)
724 return 0; 724 return 0;
725} 725}
726 726
727struct remap_pfn {
728 struct mm_struct *mm;
729 struct page **pages;
730 pgprot_t prot;
731 unsigned long i;
732};
733
734static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data)
735{
736 struct remap_pfn *r = data;
737 struct page *page = r->pages[r->i];
738 pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot));
739
740 set_pte_at(r->mm, addr, ptep, pte);
741 r->i++;
742
743 return 0;
744}
745
746static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) 727static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
747{ 728{
748 struct privcmd_data *data = file->private_data; 729 struct privcmd_data *data = file->private_data;
@@ -774,7 +755,8 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
774 goto out; 755 goto out;
775 } 756 }
776 757
777 if (xen_feature(XENFEAT_auto_translated_physmap)) { 758 if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
759 xen_feature(XENFEAT_auto_translated_physmap)) {
778 unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE); 760 unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE);
779 struct page **pages; 761 struct page **pages;
780 unsigned int i; 762 unsigned int i;
@@ -808,16 +790,9 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
808 if (rc) 790 if (rc)
809 goto out; 791 goto out;
810 792
811 if (xen_feature(XENFEAT_auto_translated_physmap)) { 793 if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
812 struct remap_pfn r = { 794 xen_feature(XENFEAT_auto_translated_physmap)) {
813 .mm = vma->vm_mm, 795 rc = xen_remap_vma_range(vma, kdata.addr, kdata.num << PAGE_SHIFT);
814 .pages = vma->vm_private_data,
815 .prot = vma->vm_page_prot,
816 };
817
818 rc = apply_to_page_range(r.mm, kdata.addr,
819 kdata.num << PAGE_SHIFT,
820 remap_pfn_fn, &r);
821 } else { 796 } else {
822 unsigned int domid = 797 unsigned int domid =
823 (xdata.flags & XENMEM_rsrc_acq_caller_owned) ? 798 (xdata.flags & XENMEM_rsrc_acq_caller_owned) ?