|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv5 03/14] xen/grant-table: pre-populate kernel unmap ops for xen_gnttab_unmap_refs()
On Tue, 27 Jan 2015, David Vrabel wrote:
> When unmapping grants, instead of converting the kernel map ops to
> unmap ops on the fly, pre-populate the set of unmap ops.
>
> This allows the grant unmap for the kernel mappings to be trivially
> batched in the future.
>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
Reviewed-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> arch/arm/include/asm/xen/page.h | 2 +-
> arch/arm/xen/p2m.c | 2 +-
> arch/x86/include/asm/xen/page.h | 2 +-
> arch/x86/xen/p2m.c | 21 ++++++++++-----------
> drivers/xen/gntdev.c | 20 ++++++++++++++------
> drivers/xen/grant-table.c | 4 ++--
> include/xen/grant_table.h | 2 +-
> 7 files changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h
> index 68c739b..2f7e6ff 100644
> --- a/arch/arm/include/asm/xen/page.h
> +++ b/arch/arm/include/asm/xen/page.h
> @@ -92,7 +92,7 @@ extern int set_foreign_p2m_mapping(struct
> gnttab_map_grant_ref *map_ops,
> struct page **pages, unsigned int count);
>
> extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref
> *unmap_ops,
> - struct gnttab_map_grant_ref *kmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count);
>
> bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn);
> diff --git a/arch/arm/xen/p2m.c b/arch/arm/xen/p2m.c
> index 0548577..cb7a14c 100644
> --- a/arch/arm/xen/p2m.c
> +++ b/arch/arm/xen/p2m.c
> @@ -102,7 +102,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref
> *map_ops,
> EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping);
>
> int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
> - struct gnttab_map_grant_ref *kmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count)
> {
> int i;
> diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
> index 5eea099..e9f52fe 100644
> --- a/arch/x86/include/asm/xen/page.h
> +++ b/arch/x86/include/asm/xen/page.h
> @@ -55,7 +55,7 @@ extern int set_foreign_p2m_mapping(struct
> gnttab_map_grant_ref *map_ops,
> struct gnttab_map_grant_ref *kmap_ops,
> struct page **pages, unsigned int count);
> extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref
> *unmap_ops,
> - struct gnttab_map_grant_ref *kmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count);
> extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long
> pfn);
>
> diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
> index 70fb507..df40b28 100644
> --- a/arch/x86/xen/p2m.c
> +++ b/arch/x86/xen/p2m.c
> @@ -816,7 +816,7 @@ static struct page *m2p_find_override(unsigned long mfn)
> }
>
> static int m2p_remove_override(struct page *page,
> - struct gnttab_map_grant_ref *kmap_op,
> + struct gnttab_unmap_grant_ref *kunmap_op,
> unsigned long mfn)
> {
> unsigned long flags;
> @@ -840,7 +840,7 @@ static int m2p_remove_override(struct page *page,
> list_del(&page->lru);
> spin_unlock_irqrestore(&m2p_override_lock, flags);
>
> - if (kmap_op != NULL) {
> + if (kunmap_op != NULL) {
> if (!PageHighMem(page)) {
> struct multicall_space mcs;
> struct gnttab_unmap_and_replace *unmap_op;
> @@ -855,13 +855,13 @@ static int m2p_remove_override(struct page *page,
> * issued. In this case handle is going to -1 because
> * it hasn't been modified yet.
> */
> - if (kmap_op->handle == -1)
> + if (kunmap_op->handle == -1)
> xen_mc_flush();
> /*
> * Now if kmap_op->handle is negative it means that the
> * hypercall actually returned an error.
> */
> - if (kmap_op->handle == GNTST_general_error) {
> + if (kunmap_op->handle == GNTST_general_error) {
> pr_warn("m2p_remove_override: pfn %lx mfn %lx,
> failed to modify kernel mappings",
> pfn, mfn);
> put_balloon_scratch_page();
> @@ -873,9 +873,9 @@ static int m2p_remove_override(struct page *page,
> mcs = __xen_mc_entry(
> sizeof(struct gnttab_unmap_and_replace));
> unmap_op = mcs.args;
> - unmap_op->host_addr = kmap_op->host_addr;
> + unmap_op->host_addr = kunmap_op->host_addr;
> unmap_op->new_addr = scratch_page_address;
> - unmap_op->handle = kmap_op->handle;
> + unmap_op->handle = kunmap_op->handle;
>
> MULTI_grant_table_op(mcs.mc,
> GNTTABOP_unmap_and_replace, unmap_op, 1);
> @@ -887,7 +887,6 @@ static int m2p_remove_override(struct page *page,
>
> xen_mc_issue(PARAVIRT_LAZY_MMU);
>
> - kmap_op->host_addr = 0;
> put_balloon_scratch_page();
> }
> }
> @@ -912,7 +911,7 @@ static int m2p_remove_override(struct page *page,
> }
>
> int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
> - struct gnttab_map_grant_ref *kmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count)
> {
> int i, ret = 0;
> @@ -921,7 +920,7 @@ int clear_foreign_p2m_mapping(struct
> gnttab_unmap_grant_ref *unmap_ops,
> if (xen_feature(XENFEAT_auto_translated_physmap))
> return 0;
>
> - if (kmap_ops &&
> + if (kunmap_ops &&
> !in_interrupt() &&
> paravirt_get_lazy_mode() == PARAVIRT_LAZY_NONE) {
> arch_enter_lazy_mmu_mode();
> @@ -942,8 +941,8 @@ int clear_foreign_p2m_mapping(struct
> gnttab_unmap_grant_ref *unmap_ops,
> ClearPagePrivate(pages[i]);
> set_phys_to_machine(pfn, pages[i]->index);
>
> - if (kmap_ops)
> - ret = m2p_remove_override(pages[i], &kmap_ops[i], mfn);
> + if (kunmap_ops)
> + ret = m2p_remove_override(pages[i], &kunmap_ops[i],
> mfn);
> if (ret)
> goto out;
> }
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index 073b4a1..6444172 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -91,6 +91,7 @@ struct grant_map {
> struct gnttab_map_grant_ref *map_ops;
> struct gnttab_unmap_grant_ref *unmap_ops;
> struct gnttab_map_grant_ref *kmap_ops;
> + struct gnttab_unmap_grant_ref *kunmap_ops;
> struct page **pages;
> };
>
> @@ -124,6 +125,7 @@ static void gntdev_free_map(struct grant_map *map)
> kfree(map->map_ops);
> kfree(map->unmap_ops);
> kfree(map->kmap_ops);
> + kfree(map->kunmap_ops);
> kfree(map);
> }
>
> @@ -140,11 +142,13 @@ static struct grant_map *gntdev_alloc_map(struct
> gntdev_priv *priv, int count)
> add->map_ops = kcalloc(count, sizeof(add->map_ops[0]), GFP_KERNEL);
> add->unmap_ops = kcalloc(count, sizeof(add->unmap_ops[0]), GFP_KERNEL);
> add->kmap_ops = kcalloc(count, sizeof(add->kmap_ops[0]), GFP_KERNEL);
> + add->kunmap_ops = kcalloc(count, sizeof(add->kunmap_ops[0]),
> GFP_KERNEL);
> add->pages = kcalloc(count, sizeof(add->pages[0]), GFP_KERNEL);
> if (NULL == add->grants ||
> NULL == add->map_ops ||
> NULL == add->unmap_ops ||
> NULL == add->kmap_ops ||
> + NULL == add->kunmap_ops ||
> NULL == add->pages)
> goto err;
>
> @@ -155,6 +159,7 @@ static struct grant_map *gntdev_alloc_map(struct
> gntdev_priv *priv, int count)
> add->map_ops[i].handle = -1;
> add->unmap_ops[i].handle = -1;
> add->kmap_ops[i].handle = -1;
> + add->kunmap_ops[i].handle = -1;
> }
>
> add->index = 0;
> @@ -280,6 +285,8 @@ static int map_grant_pages(struct grant_map *map)
> map->flags | GNTMAP_host_map,
> map->grants[i].ref,
> map->grants[i].domid);
> + gnttab_set_unmap_op(&map->kunmap_ops[i], address,
> + map->flags | GNTMAP_host_map, -1);
> }
> }
>
> @@ -290,13 +297,14 @@ static int map_grant_pages(struct grant_map *map)
> return err;
>
> for (i = 0; i < map->count; i++) {
> - if (map->map_ops[i].status)
> + if (map->map_ops[i].status) {
> err = -EINVAL;
> - else {
> - BUG_ON(map->map_ops[i].handle == -1);
> - map->unmap_ops[i].handle = map->map_ops[i].handle;
> - pr_debug("map handle=%d\n", map->map_ops[i].handle);
> + continue;
> }
> +
> + map->unmap_ops[i].handle = map->map_ops[i].handle;
> + if (use_ptemod)
> + map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
> }
> return err;
> }
> @@ -316,7 +324,7 @@ static int __unmap_grant_pages(struct grant_map *map, int
> offset, int pages)
> }
>
> err = gnttab_unmap_refs(map->unmap_ops + offset,
> - use_ptemod ? map->kmap_ops + offset : NULL, map->pages
> + offset,
> + use_ptemod ? map->kunmap_ops + offset : NULL,
> map->pages + offset,
> pages);
> if (err)
> return err;
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index 7786291..999d7ab 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -738,7 +738,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
> EXPORT_SYMBOL_GPL(gnttab_map_refs);
>
> int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
> - struct gnttab_map_grant_ref *kmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count)
> {
> int ret;
> @@ -747,7 +747,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref
> *unmap_ops,
> if (ret)
> return ret;
>
> - return clear_foreign_p2m_mapping(unmap_ops, kmap_ops, pages, count);
> + return clear_foreign_p2m_mapping(unmap_ops, kunmap_ops, pages, count);
> }
> EXPORT_SYMBOL_GPL(gnttab_unmap_refs);
>
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index 3387465..7235d8f 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -167,7 +167,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
> struct gnttab_map_grant_ref *kmap_ops,
> struct page **pages, unsigned int count);
> int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
> - struct gnttab_map_grant_ref *kunmap_ops,
> + struct gnttab_unmap_grant_ref *kunmap_ops,
> struct page **pages, unsigned int count);
>
> /* Perform a batch of grant map/copy operations. Retry every batch slot
> --
> 1.7.10.4
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |