# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1283332669 -3600
# Node ID 972d90ff31349816cc8c785a8b2defb2f70ed441
# Parent 0eb89b465e46cbc688bcce5f451e125c1650b353
x86_64: Ensure frame-table compression leaves MAX_ORDER aligned
contiguous ranges of page_info structs. This allows page-pointer
arithmetic in places like our buddy allocator.
This restriction was already implicitly guaranteed, but it is good to
make it explicit in the pdx-related initialisation.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
xen/arch/x86/x86_64/mm.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff -r 0eb89b465e46 -r 972d90ff3134 xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c Wed Sep 01 10:17:29 2010 +0100
+++ b/xen/arch/x86/x86_64/mm.c Wed Sep 01 10:17:49 2010 +0100
@@ -163,9 +163,15 @@ void *do_page_walk(struct vcpu *v, unsig
void __init pfn_pdx_hole_setup(unsigned long mask)
{
- unsigned int i, j, bottom_shift, hole_shift;
-
- for ( hole_shift = bottom_shift = j = 0; ; )
+ unsigned int i, j, bottom_shift = 0, hole_shift = 0;
+
+ /*
+ * We skip the first MAX_ORDER bits, as we never want to compress them.
+ * This guarantees that page-pointer arithmetic remains valid within
+ * contiguous aligned ranges of 2^MAX_ORDER pages. Among others, our
+ * buddy allocator relies on this assumption.
+ */
+ for ( j = MAX_ORDER-1; ; )
{
i = find_next_zero_bit(&mask, BITS_PER_LONG, j);
j = find_next_bit(&mask, BITS_PER_LONG, i);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|