--- linux/mm/bootmem.c Sun Nov 18 23:42:26 2001 +++ linux-arm/mm/bootmem.c Wed Nov 21 07:58:25 2001 @@ -462,14 +440,18 @@ * that is not sufficient because of alignment constraints. */ -#define FEASIBLE(seg, len, align) \ - ((RND_UP(segment_start(seg), align) + (len) - 1) <= segment_end(seg)) +#define FEASIBLE(seg, len, align) \ +( \ + (segment_end(seg) >= RND_UP(segment_start(seg), align)) \ + && \ + ((segment_end(seg) - RND_UP(segment_start(seg), align)) > (len))\ +) #define STARTS_BELOW(seg,goal,align,len) \ (RND_UP(segment_start(seg), align) <= (goal)) #define ENDS_ABOVE(seg, goal, align, len) \ - (segment_end(seg) > ((goal) + (len))) + ((segment_end(seg) > (goal)) && ((segment_end(seg) - (goal)) > (len))) #define GOAL_WITHIN(seg,goal,align,len) \ (STARTS_BELOW(seg,goal,align,len) && ENDS_ABOVE(seg,goal,align,len)) @@ -635,7 +608,9 @@ segment_set_endpoints(&reserved, goal, goal + length - 1); - if(!segment_contains(optimum, &reserved)) + if(!segment_contains_point(optimum, goal) + || !segment_contains(optimum, &reserved)) + segment_set_endpoints(&reserved, RND_UP(segment_start(optimum), align), RND_UP(segment_start(optimum),align)+length-1);