x86_64: Ensure frame-table compression leaves MAX_ORDER aligned
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 1 Sep 2010 09:17:49 +0000 (10:17 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 1 Sep 2010 09:17:49 +0000 (10:17 +0100)
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@citrix.com>
xen/arch/x86/x86_64/mm.c

index 271cea5ef3b66621c35fce6446ec6084cc6de6d7..126b2c9421d7f43a1d6068e673827fd8ab7688aa 100644 (file)
@@ -163,9 +163,15 @@ void *do_page_walk(struct vcpu *v, unsigned long addr)
 
 void __init pfn_pdx_hole_setup(unsigned long mask)
 {
-    unsigned int i, j, bottom_shift, hole_shift;
+    unsigned int i, j, bottom_shift = 0, hole_shift = 0;
 
-    for ( hole_shift = bottom_shift = j = 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);