Commit ac924c60 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 5afdbd6e
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/mempolicy.h> #include <linux/mempolicy.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/div64.h>
#include "internal.h" #include "internal.h"
/* /*
...@@ -2566,9 +2567,11 @@ void setup_per_zone_pages_min(void) ...@@ -2566,9 +2567,11 @@ void setup_per_zone_pages_min(void)
} }
for_each_zone(zone) { for_each_zone(zone) {
unsigned long tmp; u64 tmp;
spin_lock_irqsave(&zone->lru_lock, flags); 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)) { if (is_highmem(zone)) {
/* /*
* __GFP_HIGH and PF_MEMALLOC allocations usually don't * __GFP_HIGH and PF_MEMALLOC allocations usually don't
...@@ -2595,8 +2598,8 @@ void setup_per_zone_pages_min(void) ...@@ -2595,8 +2598,8 @@ void setup_per_zone_pages_min(void)
zone->pages_min = tmp; zone->pages_min = tmp;
} }
zone->pages_low = zone->pages_min + tmp / 4; zone->pages_low = zone->pages_min + (tmp >> 2);
zone->pages_high = zone->pages_min + tmp / 2; zone->pages_high = zone->pages_min + (tmp >> 1);
spin_unlock_irqrestore(&zone->lru_lock, flags); spin_unlock_irqrestore(&zone->lru_lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment