[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xen: Replace stupid page_alloc fix.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1173266223 0 # Node ID dad3d143c3b0319ed6265a89879c3e11308b1c1f # Parent e68ee3665cba1d11017a1ad9a924078cbdb54ff2 xen: Replace stupid page_alloc fix. I broke the 'correct' fix when I copied it out of an email. The actual correct version, with an extra +1 in the for-loop header is rather abusive of for loops, so I've changed it now to a do-while loop and an extra comment so I don't screw up this backwards loop ever again. This version does actually boot. :-) Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/common/page_alloc.c | 35 +++++++++++++++++------------------ 1 files changed, 17 insertions(+), 18 deletions(-) diff -r e68ee3665cba -r dad3d143c3b0 xen/common/page_alloc.c --- a/xen/common/page_alloc.c Wed Mar 07 10:53:34 2007 +0000 +++ b/xen/common/page_alloc.c Wed Mar 07 11:17:03 2007 +0000 @@ -339,7 +339,7 @@ static void init_heap_block(heap_by_zone /* Allocate 2^@order contiguous pages. */ static struct page_info *alloc_heap_pages( - unsigned int zone_lo, unsigned zone_hi, + unsigned int zone_lo, unsigned int zone_hi, unsigned int cpu, unsigned int order) { unsigned int i, j, zone; @@ -357,25 +357,24 @@ static struct page_info *alloc_heap_page spin_lock(&heap_lock); - /* start with requested node, but exhaust all node memory - * in requested zone before failing, only calc new node - * value if we fail to find memory in target node, this avoids - * needless computation on fast-path */ + /* + * Start with requested node, but exhaust all node memory in requested + * zone before failing, only calc new node value if we fail to find memory + * in target node, this avoids needless computation on fast-path. + */ for ( i = 0; i < num_nodes; i++ ) { - for ( zone = zone_hi; zone-- > zone_lo; ) - { - /* check if target node can support the allocation */ - if ( avail[node] && (avail[node][zone] >= request) ) - { - /* Find smallest order which can satisfy the request. */ - for ( j = order; j <= MAX_ORDER; j++ ) - { - if ( !list_empty(&heap(node, zone, j)) ) - goto found; - } - } - } + zone = zone_hi; + do { + /* Check if target node can support the allocation. */ + if ( !avail[node] || (avail[node][zone] < request) ) + continue; + + /* Find smallest order which can satisfy the request. */ + for ( j = order; j <= MAX_ORDER; j++ ) + if ( !list_empty(&heap(node, zone, j)) ) + goto found; + } while ( zone-- > zone_lo ); /* careful: unsigned zone may wrap */ /* Pick next node, wrapping around if needed. */ if ( ++node == num_nodes ) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |