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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
struct page **pages;
|
||||
unsigned int i;
|
||||
|
@ -808,16 +790,9 @@ static long privcmd_ioctl_mmap_resource(struct file *file, void __user *udata)
|
|||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
struct remap_pfn r = {
|
||||
.mm = vma->vm_mm,
|
||||
.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);
|
||||
if (IS_ENABLED(CONFIG_XEN_AUTO_XLATE) &&
|
||||
xen_feature(XENFEAT_auto_translated_physmap)) {
|
||||
rc = xen_remap_vma_range(vma, kdata.addr, kdata.num << PAGE_SHIFT);
|
||||
} else {
|
||||
unsigned int domid =
|
||||
(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;
|
||||
}
|
||||
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
|
||||
|
||||
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
|
||||
* @vma: VMA to map the pages into
|
||||
|
|
Loading…
Reference in a new issue