[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.1-testing] 32-on-64: Fix domain address-size clamping, implement
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1196962872 0 # Node ID 1177efd2500e84b5a8cee0d94541a8decffd1d2d # Parent 4d260fce3a7d50d7e082549fa2cdcdbcc069b6ab 32-on-64: Fix domain address-size clamping, implement copy-on-grant-transfer, and eliminate 166GB memory limit for x86/64 Xen. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 16548:cd5e1e76d0bc66440a04122baa27860f5d763b5b xen-unstable date: Thu Dec 06 13:39:19 2007 +0000 32-on-64: Fixes to previous changeset. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> xen-unstable changeset: 16549:baf90ee3c1dab65f4a386521be6e108920622866 xen-unstable date: Thu Dec 06 13:56:00 2007 +0000 --- xen/arch/x86/domain.c | 2 -- xen/arch/x86/domain_build.c | 2 +- xen/arch/x86/x86_64/mm.c | 2 +- xen/common/grant_table.c | 29 +++++++++++++++++++++++++++++ xen/common/memory.c | 15 +++------------ xen/common/page_alloc.c | 16 +++++++--------- xen/include/public/grant_table.h | 6 ++++-- 7 files changed, 45 insertions(+), 27 deletions(-) diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/arch/x86/domain.c Thu Dec 06 17:41:12 2007 +0000 @@ -296,8 +296,6 @@ int switch_native(struct domain *d) release_compat_l4(d->vcpu[vcpuid]); } - d->arch.physaddr_bitsize = 64; - return 0; } diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/arch/x86/domain_build.c Thu Dec 06 17:41:12 2007 +0000 @@ -363,7 +363,7 @@ int __init construct_dom0( #ifdef CONFIG_COMPAT HYPERVISOR_COMPAT_VIRT_START(d) = max_t(unsigned int, m2p_compat_vstart, value); - d->arch.physaddr_bitsize = !is_pv_32on64_domain(d) ? 64 : + d->arch.physaddr_bitsize = fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1 + (PAGE_SIZE - 2); if ( value > (!is_pv_32on64_domain(d) ? diff -r 4d260fce3a7d -r 1177efd2500e xen/arch/x86/x86_64/mm.c --- a/xen/arch/x86/x86_64/mm.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/arch/x86/x86_64/mm.c Thu Dec 06 17:41:12 2007 +0000 @@ -428,7 +428,7 @@ int check_descriptor(const struct domain unsigned int domain_clamp_alloc_bitsize(struct domain *d, unsigned int bits) { - if ( d == NULL ) + if ( (d == NULL) || !is_pv_32on64_domain(d) ) return bits; return min(d->arch.physaddr_bitsize, bits); } diff -r 4d260fce3a7d -r 1177efd2500e xen/common/grant_table.c --- a/xen/common/grant_table.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/common/grant_table.c Thu Dec 06 17:41:12 2007 +0000 @@ -809,6 +809,7 @@ gnttab_transfer( grant_entry_t *sha; struct gnttab_transfer gop; unsigned long mfn; + unsigned int max_bitsize; for ( i = 0; i < count; i++ ) { @@ -855,6 +856,34 @@ gnttab_transfer( free_domheap_page(page); gop.status = GNTST_bad_domain; goto copyback; + } + + max_bitsize = domain_clamp_alloc_bitsize( + e, BITS_PER_LONG+PAGE_SHIFT-1); + if ( (1UL << (max_bitsize - PAGE_SHIFT)) <= mfn ) + { + struct page_info *new_page; + void *sp, *dp; + + new_page = alloc_domheap_pages(NULL, 0, MEMF_bits(max_bitsize)); + if ( new_page == NULL ) + { + rcu_unlock_domain(e); + page->count_info &= ~(PGC_count_mask|PGC_allocated); + free_domheap_page(page); + gop.status = GNTST_address_too_big; + goto copyback; + } + + sp = map_domain_page(mfn); + dp = map_domain_page(page_to_mfn(new_page)); + memcpy(dp, sp, PAGE_SIZE); + unmap_domain_page(dp); + unmap_domain_page(sp); + + page->count_info &= ~(PGC_count_mask|PGC_allocated); + free_domheap_page(page); + page = new_page; } spin_lock(&e->page_alloc_lock); diff -r 4d260fce3a7d -r 1177efd2500e xen/common/memory.c --- a/xen/common/memory.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/common/memory.c Thu Dec 06 17:41:12 2007 +0000 @@ -309,18 +309,6 @@ static long memory_exchange(XEN_GUEST_HA goto fail_early; } - if ( (exch.out.address_bits != 0) && - (exch.out.address_bits < - (get_order_from_pages(max_page) + PAGE_SHIFT)) ) - { - if ( exch.out.address_bits <= PAGE_SHIFT ) - { - rc = -ENOMEM; - goto fail_early; - } - memflags = MEMF_bits(exch.out.address_bits); - } - if ( exch.in.extent_order <= exch.out.extent_order ) { in_chunk_order = exch.out.extent_order - exch.in.extent_order; @@ -342,6 +330,9 @@ static long memory_exchange(XEN_GUEST_HA goto fail_early; } d = current->domain; + + memflags |= MEMF_bits(domain_clamp_alloc_bitsize( + d, exch.out.address_bits ? : (BITS_PER_LONG+PAGE_SHIFT))); cpu = select_local_cpu(d); diff -r 4d260fce3a7d -r 1177efd2500e xen/common/page_alloc.c --- a/xen/common/page_alloc.c Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/common/page_alloc.c Thu Dec 06 17:41:12 2007 +0000 @@ -817,15 +817,13 @@ struct page_info *__alloc_domheap_pages( ASSERT(!in_irq()); - if ( bits ) - { - bits = domain_clamp_alloc_bitsize(d, bits); - if ( bits <= (PAGE_SHIFT + 1) ) - return NULL; - bits -= PAGE_SHIFT + 1; - if ( bits < zone_hi ) - zone_hi = bits; - } + bits = domain_clamp_alloc_bitsize(d, bits ? : (BITS_PER_LONG+PAGE_SHIFT)); + if ( bits <= (PAGE_SHIFT + 1) ) + return NULL; + + bits -= PAGE_SHIFT + 1; + if ( bits < zone_hi ) + zone_hi = bits; if ( (zone_hi + PAGE_SHIFT) >= dma_bitsize ) { diff -r 4d260fce3a7d -r 1177efd2500e xen/include/public/grant_table.h --- a/xen/include/public/grant_table.h Thu Dec 06 17:36:07 2007 +0000 +++ b/xen/include/public/grant_table.h Thu Dec 06 17:41:12 2007 +0000 @@ -370,7 +370,8 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_query_siz #define GNTST_no_device_space (-7) /* Out of space in I/O MMU. */ #define GNTST_permission_denied (-8) /* Not enough privilege for operation. */ #define GNTST_bad_page (-9) /* Specified page was invalid for op. */ -#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary */ +#define GNTST_bad_copy_arg (-10) /* copy arguments cross page boundary. */ +#define GNTST_address_too_big (-11) /* transfer page address too large. */ #define GNTTABOP_error_msgs { \ "okay", \ @@ -383,7 +384,8 @@ DEFINE_XEN_GUEST_HANDLE(gnttab_query_siz "no spare translation slot in the I/O MMU", \ "permission denied", \ "bad page", \ - "copy arguments cross page boundary" \ + "copy arguments cross page boundary", \ + "page address size too large" \ } #endif /* __XEN_PUBLIC_GRANT_TABLE_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |