[PATCH] setup_per_zone_pages_min() overflow fix
As pointed out in http://bugzilla.kernel.org/show_bug.cgi?id=6490, this function can experience overflows on 32-bit machines, causing our response to changed values of min_free_kbytes to go whacky. Fixing it efficiently is all too hard, so fix it with 64-bit math instead. Cc: Ake Sandgren <ake.sandgren@hpc2n.umu.se> Cc: Martin Bligh <mbligh@google.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
5afdbd6e84
commit
ac924c6034
1 changed files with 7 additions and 4 deletions
|
@ -39,6 +39,7 @@
|
|||
#include <linux/mempolicy.h>
|
||||
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/div64.h>
|
||||
#include "internal.h"
|
||||
|
||||
/*
|
||||
|
@ -2566,9 +2567,11 @@ void setup_per_zone_pages_min(void)
|
|||
}
|
||||
|
||||
for_each_zone(zone) {
|
||||
unsigned long tmp;
|
||||
u64 tmp;
|
||||
|
||||
spin_lock_irqsave(&zone->lru_lock, flags);
|
||||
tmp = (pages_min * zone->present_pages) / lowmem_pages;
|
||||
tmp = (u64)pages_min * zone->present_pages;
|
||||
do_div(tmp, lowmem_pages);
|
||||
if (is_highmem(zone)) {
|
||||
/*
|
||||
* __GFP_HIGH and PF_MEMALLOC allocations usually don't
|
||||
|
@ -2595,8 +2598,8 @@ void setup_per_zone_pages_min(void)
|
|||
zone->pages_min = tmp;
|
||||
}
|
||||
|
||||
zone->pages_low = zone->pages_min + tmp / 4;
|
||||
zone->pages_high = zone->pages_min + tmp / 2;
|
||||
zone->pages_low = zone->pages_min + (tmp >> 2);
|
||||
zone->pages_high = zone->pages_min + (tmp >> 1);
|
||||
spin_unlock_irqrestore(&zone->lru_lock, flags);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue