diff --git a/xen/common/memory.c b/xen/common/memory.c index a744272539..45e9cc6852 100644 --- a/xen/common/memory.c +++ b/xen/common/memory.c @@ -154,7 +154,8 @@ long do_memory_op(int cmd, void *arg) reservation.nr_extents -= start_extent; if ( (reservation.address_bits != 0) && - (reservation.address_bits < (get_order(max_page) + PAGE_SHIFT)) ) + (reservation.address_bits < + (get_order_from_pages(max_page) + PAGE_SHIFT)) ) { if ( reservation.address_bits < 31 ) return -ENOMEM; diff --git a/xen/include/asm-x86/page.h b/xen/include/asm-x86/page.h index 71edad1530..2473b8cbf3 100644 --- a/xen/include/asm-x86/page.h +++ b/xen/include/asm-x86/page.h @@ -280,7 +280,7 @@ extern void paging_init(void); #ifndef __ASSEMBLY__ -static __inline__ int get_order(unsigned long size) +static inline int get_order_from_bytes(physaddr_t size) { int order; size = (size-1) >> PAGE_SHIFT; @@ -289,6 +289,17 @@ static __inline__ int get_order(unsigned long size) return order; } +static inline int get_order_from_pages(unsigned long nr_pages) +{ + int order; + nr_pages--; + for ( order = 0; nr_pages; order++ ) + nr_pages >>= 1; + return order; +} + +#define get_order(s) get_order_from_bytes(s) + /* Allocator functions for Xen pagetables. */ struct pfn_info *alloc_xen_pagetable(void); void free_xen_pagetable(struct pfn_info *pg);