# 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
|