mm: Cast lowmem_reserve to long

z->lowmem_reserve[classzone_idx] is an unsigned long but
free_pages and min are longs. If free_pages is
negative, the function will incorrectly return true
because it will treat the negative long as a large,
positive unsigned long.

This change casts z->lowmem_reserve to a long and
fixes a typo in the comment.

Change-Id: Icada1fa5ca650fbcdb0656f637adbb98f223eec5
Signed-off-by: Jack Cheung <jackc@codeaurora.org>
(cherry picked from commit 9f41da81017657a194a4e145bab337f13a4d7fd9)
This commit is contained in:
Jack Cheung
2011-11-28 16:41:28 -08:00
committed by Stephen Boyd
parent 4fe9e26803
commit 18e44d3eaf

View File

@@ -1548,8 +1548,9 @@ static inline int should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
int classzone_idx, int alloc_flags, long free_pages) int classzone_idx, int alloc_flags, long free_pages)
{ {
/* free_pages my go negative - that's OK */ /* free_pages may go negative - that's OK */
long min = mark; long min = mark;
long lowmem_reserve = z->lowmem_reserve[classzone_idx];
int o; int o;
free_pages -= (1 << order) - 1; free_pages -= (1 << order) - 1;
@@ -1558,7 +1559,7 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,
if (alloc_flags & ALLOC_HARDER) if (alloc_flags & ALLOC_HARDER)
min -= min / 4; min -= min / 4;
if (free_pages <= min + z->lowmem_reserve[classzone_idx]) if (free_pages <= min + lowmem_reserve)
return false; return false;
for (o = 0; o < order; o++) { for (o = 0; o < order; o++) {
/* At the next order, this order's pages become unavailable */ /* At the next order, this order's pages become unavailable */