diff options
Diffstat (limited to 'drivers/xen/privcmd.c')
-rw-r--r-- | drivers/xen/privcmd.c | 35 |
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 | ||
727 | struct remap_pfn { | ||
728 | struct mm_struct *mm; | ||
729 | struct page **pages; | ||
730 | pgprot_t prot; | ||
731 | unsigned long i; | ||
732 | }; | ||
733 | |||
734 | static 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 | |||
746 | static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata) | 727 | static 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) ? |