Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 289b777e authored by Stefano Stabellini's avatar Stefano Stabellini Committed by Konrad Rzeszutek Wilk
Browse files

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: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 9b705f0e
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -447,6 +447,42 @@ unsigned int gnttab_max_grant_frames(void)
}
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)
{
	struct gnttab_setup_table setup;
+5 −0
Original line number Diff line number Diff line
@@ -155,4 +155,9 @@ unsigned int gnttab_max_grant_frames(void);

#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__ */