From 0a683c427953bdd0ef9222308f07f0b37d65ecea Mon Sep 17 00:00:00 2001 From: kfraser Date: Fri, 6 Jul 2007 17:33:03 +0100 Subject: [PATCH] Refactor grant table allocation into arch-specific code. Signed-off-by: Hollis Blanchard --- arch/ia64/xen/hypervisor.c | 5 +++++ drivers/xen/core/gnttab.c | 31 +++++++++++++++++-------------- include/xen/gnttab.h | 2 ++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/arch/ia64/xen/hypervisor.c b/arch/ia64/xen/hypervisor.c index 29d07dc1..bd8c8584 100644 --- a/arch/ia64/xen/hypervisor.c +++ b/arch/ia64/xen/hypervisor.c @@ -409,6 +409,11 @@ __xen_destroy_contiguous_region(unsigned long vstart, unsigned int order) #include #include +void *arch_gnttab_alloc_shared(unsigned long *frames) +{ + return __va(frames[0] << PAGE_SHIFT); +} + static void gnttab_map_grant_ref_pre(struct gnttab_map_grant_ref *uop) { diff --git a/drivers/xen/core/gnttab.c b/drivers/xen/core/gnttab.c index d3ce6056..161a6732 100644 --- a/drivers/xen/core/gnttab.c +++ b/drivers/xen/core/gnttab.c @@ -430,7 +430,7 @@ static inline unsigned int max_nr_grant_frames(void) #ifdef CONFIG_XEN -#ifndef __ia64__ +#ifdef CONFIG_X86 static int map_pte_fn(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) { @@ -448,7 +448,15 @@ static int unmap_pte_fn(pte_t *pte, struct page *pmd_page, set_pte_at(&init_mm, addr, pte, __pte(0)); return 0; } -#endif + +void *arch_gnttab_alloc_shared(unsigned long *frames) +{ + struct vm_struct *area; + area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames()); + BUG_ON(area == NULL); + return area->addr; +} +#endif /* CONFIG_X86 */ static int gnttab_map(unsigned int start_idx, unsigned int end_idx) { @@ -473,21 +481,16 @@ static int gnttab_map(unsigned int start_idx, unsigned int end_idx) BUG_ON(rc || setup.status); -#ifndef __ia64__ - if (shared == NULL) { - struct vm_struct *area; - area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames()); - BUG_ON(area == NULL); - shared = area->addr; - } + if (shared == NULL) + shared = arch_gnttab_alloc_shared(frames); + +#ifdef CONFIG_X86 rc = apply_to_page_range(&init_mm, (unsigned long)shared, PAGE_SIZE * nr_gframes, map_pte_fn, &frames); BUG_ON(rc); - frames -= nr_gframes; /* adjust after map_pte_fn() */ -#else - shared = __va(frames[0] << PAGE_SHIFT); -#endif + frames -= nr_gframes; /* adjust after map_pte_fn() */ +#endif /* CONFIG_X86 */ kfree(frames); @@ -623,7 +626,7 @@ int gnttab_resume(void) int gnttab_suspend(void) { -#ifndef __ia64__ +#ifdef CONFIG_X86 apply_to_page_range(&init_mm, (unsigned long)shared, PAGE_SIZE * nr_grant_frames, unmap_pte_fn, NULL); diff --git a/include/xen/gnttab.h b/include/xen/gnttab.h index affb8d05..b8bb06fe 100644 --- a/include/xen/gnttab.h +++ b/include/xen/gnttab.h @@ -117,6 +117,8 @@ static inline void gnttab_reset_grant_page(struct page *page) int gnttab_suspend(void); int gnttab_resume(void); +void *arch_gnttab_alloc_shared(unsigned long *frames); + static inline void gnttab_set_map_op(struct gnttab_map_grant_ref *map, maddr_t addr, uint32_t flags, grant_ref_t ref, domid_t domid) -- 2.39.5