# 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
|