Ok, I'm pretty certain I got it, I didn't noticed here because it can be
reproduced only with HIGHMEM and I didn't had time to test highmem yet
(btw, highmem emulation would been enough to reproduce it).
It was really an allocator bug. Totally untested fix appended
but recommended anyways for integration.
Marcelo can you also test it in your workload (feel free to use eepro100
too now).
--- 2.4.10pre11aa1/mm/page_alloc.c.~1~ Tue Sep 18 15:39:50 2001
+++ 2.4.10pre11aa1/mm/page_alloc.c Thu Sep 20 00:36:11 2001
@@ -369,6 +369,7 @@
return NULL;
}
+ rebalance:
page = balance_classzone(classzone, gfp_mask, order, &freed);
if (page)
return page;
@@ -380,10 +381,13 @@
if (!z)
break;
- page = rmqueue(z, order);
- if (page)
- return page;
+ if (zone_free_pages(z, order) > z->pages_min) {
+ page = rmqueue(z, order);
+ if (page)
+ return page;
+ }
}
+ goto rebalance;
} else {
/*
* Check that no other task is been killed meanwhile,
Andrea
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/