[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix dom0 memory allocation.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 0f69e0adddb040fabea6fa13efa126cea49de35c # Parent 19ef6202d75fa5fd7d514eecc52699aeacfd4a45 Fix dom0 memory allocation. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 19ef6202d75f -r 0f69e0adddb0 xen/arch/x86/domain_build.c --- a/xen/arch/x86/domain_build.c Sun Aug 21 00:10:30 2005 +++ b/xen/arch/x86/domain_build.c Sun Aug 21 08:14:36 2005 @@ -69,11 +69,21 @@ #define round_pgup(_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK) #define round_pgdown(_p) ((_p)&PAGE_MASK) -static struct pfn_info *alloc_largest(struct domain *d, unsigned long max) +static struct pfn_info *alloc_chunk(struct domain *d, unsigned long max_pages) { struct pfn_info *page; - unsigned int order = get_order(max)+PAGE_SHIFT-1; - if ( (max & (max-1)) != 0 ) + unsigned int order; + /* + * Allocate up to 2MB at a time: + * 1. This prevents overflow of get_order() when allocating more than + * 4GB to domain 0 on a PAE machine. + * 2. It prevents allocating very large chunks from DMA pools before + * the >4GB pool is fully depleted. + */ + if ( max_pages > (2UL << (20 - PAGE_SHIFT)) ) + max_pages = 2UL << (20 - PAGE_SHIFT); + order = get_order(max_pages << PAGE_SHIFT); + if ( (max_pages & (max_pages-1)) != 0 ) order--; while ( (page = alloc_domheap_pages(d, order, 0)) == NULL ) if ( order-- == 0 ) @@ -608,7 +618,7 @@ } while ( pfn < nr_pages ) { - if ( (page = alloc_largest(d, nr_pages - d->tot_pages)) == NULL ) + if ( (page = alloc_chunk(d, nr_pages - d->tot_pages)) == NULL ) panic("Not enough RAM for DOM0 reservation.\n"); while ( pfn < d->tot_pages ) { _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |