mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 05:34:13 +08:00
xen: introduce gnttab_map_refs and gnttab_unmap_refs
gnttab_map_refs maps some grant refs and uses the new m2p override to set a proper m2p mapping for the granted pages. gnttab_unmap_refs unmaps the granted refs and removes th mappings from the m2p override. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
This commit is contained in:
parent
9b705f0e98
commit
289b777eac
@ -447,6 +447,42 @@ unsigned int gnttab_max_grant_frames(void)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(gnttab_max_grant_frames);
|
EXPORT_SYMBOL_GPL(gnttab_max_grant_frames);
|
||||||
|
|
||||||
|
int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
|
||||||
|
struct page **pages, unsigned int count)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
pte_t *pte;
|
||||||
|
unsigned long mfn;
|
||||||
|
|
||||||
|
ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map_ops, count);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
/* m2p override only supported for GNTMAP_contains_pte mappings */
|
||||||
|
if (!(map_ops[i].flags & GNTMAP_contains_pte))
|
||||||
|
continue;
|
||||||
|
pte = (pte_t *) (mfn_to_virt(PFN_DOWN(map_ops[i].host_addr)) +
|
||||||
|
(map_ops[i].host_addr & ~PAGE_MASK));
|
||||||
|
mfn = pte_mfn(*pte);
|
||||||
|
m2p_add_override(mfn, pages[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gnttab_map_refs);
|
||||||
|
|
||||||
|
int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
|
||||||
|
struct page **pages, unsigned int count)
|
||||||
|
{
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
|
ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, unmap_ops, count);
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
m2p_remove_override(pages[i]);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
|
||||||
|
|
||||||
static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
|
static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
|
||||||
{
|
{
|
||||||
struct gnttab_setup_table setup;
|
struct gnttab_setup_table setup;
|
||||||
|
@ -155,4 +155,9 @@ unsigned int gnttab_max_grant_frames(void);
|
|||||||
|
|
||||||
#define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr))
|
#define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr))
|
||||||
|
|
||||||
|
int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
|
||||||
|
struct page **pages, unsigned int count);
|
||||||
|
int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
|
||||||
|
struct page **pages, unsigned int count);
|
||||||
|
|
||||||
#endif /* __ASM_GNTTAB_H__ */
|
#endif /* __ASM_GNTTAB_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user