xen: avoid link error on ARM
Building the privcmd code as a loadable module on ARM, we get a link error due to the private cache management functions: ERROR: "__sync_icache_dcache" [drivers/xen/xen-privcmd.ko] undefined! Move the code into a new that is always built in when Xen is enabled, as suggested by Juergen Gross and Boris Ostrovsky. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> Signed-off-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
parent
8d1502f629
commit
a78d14a316
|
@ -724,25 +724,6 @@ static long privcmd_ioctl_restrict(struct file *file, void __user *udata)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct remap_pfn {
|
|
||||||
struct mm_struct *mm;
|
|
||||||
struct page **pages;
|
|
||||||
pgprot_t prot;
|
|
||||||
unsigned long i;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data)
|
|
||||||
{
|
|
||||||
struct remap_pfn *r = data;
|
|
||||||
struct page *page = r->pages[r->i];
|
|
||||||
pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot));
|
|
||||||
|
|
||||||
set_pte_at(r->mm, addr, ptep, pte);
|
|
||||||
r->i++;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
|
static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
|
||||||
{
|
{
|
||||||
struct privcmd_data *data = file->private_data;
|
struct privcmd_data *data = file->private_data;
|
||||||
|
@ -774,7 +755,8 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_auto_translated_physmap)) {
|
if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
|
||||||
|
xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||||
unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE);
|
unsigned int nr = DIV_ROUND_UP(kdata.num, XEN_PFN_PER_PAGE);
|
||||||
struct page **pages;
|
struct page **pages;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
@ -808,16 +790,9 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_auto_translated_physmap)) {
|
if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
|
||||||
struct remap_pfn r = {
|
xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||||
.mm = vma->vm_mm,
|
rc = xen_remap_vma_range(vma, kdata.addr, kdata.num << PAGE_SHIFT);
|
||||||
.pages = vma->vm_private_data,
|
|
||||||
.prot = vma->vm_page_prot,
|
|
||||||
};
|
|
||||||
|
|
||||||
rc = apply_to_page_range(r.mm, kdata.addr,
|
|
||||||
kdata.num << PAGE_SHIFT,
|
|
||||||
remap_pfn_fn, &r);
|
|
||||||
} else {
|
} else {
|
||||||
unsigned int domid =
|
unsigned int domid =
|
||||||
(xdata.flags & XENMEM_rsrc_acq_caller_owned) ?
|
(xdata.flags & XENMEM_rsrc_acq_caller_owned) ?
|
||||||
|
|
|
@ -262,3 +262,35 @@ int __init xen_xlate_map_ballooned_pages(xen_pfn_t **gfns, void **virt,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages);
|
EXPORT_SYMBOL_GPL(xen_xlate_map_ballooned_pages);
|
||||||
|
|
||||||
|
struct remap_pfn {
|
||||||
|
struct mm_struct *mm;
|
||||||
|
struct page **pages;
|
||||||
|
pgprot_t prot;
|
||||||
|
unsigned long i;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int remap_pfn_fn(pte_t *ptep, unsigned long addr, void *data)
|
||||||
|
{
|
||||||
|
struct remap_pfn *r = data;
|
||||||
|
struct page *page = r->pages[r->i];
|
||||||
|
pte_t pte = pte_mkspecial(pfn_pte(page_to_pfn(page), r->prot));
|
||||||
|
|
||||||
|
set_pte_at(r->mm, addr, ptep, pte);
|
||||||
|
r->i++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Used by the privcmd module, but has to be built-in on ARM */
|
||||||
|
int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr, unsigned long len)
|
||||||
|
{
|
||||||
|
struct remap_pfn r = {
|
||||||
|
.mm = vma->vm_mm,
|
||||||
|
.pages = vma->vm_private_data,
|
||||||
|
.prot = vma->vm_page_prot,
|
||||||
|
};
|
||||||
|
|
||||||
|
return apply_to_page_range(vma->vm_mm, addr, len, remap_pfn_fn, &r);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(xen_remap_vma_range);
|
||||||
|
|
|
@ -109,6 +109,9 @@ static inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr,
|
||||||
|
unsigned long len);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
|
* xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
|
||||||
* @vma: VMA to map the pages into
|
* @vma: VMA to map the pages into
|
||||||
|
|
Loading…
Reference in New Issue