1 From: Peter Zijlstra <a.p.zijlstra@chello.nl>
2 Subject: mm: serialize access to min_free_kbytes
4 References: FATE#303834
6 There is a small race between the procfs caller and the memory hotplug caller
7 of setup_per_zone_pages_min(). Not a big deal, but the next patch will add yet
8 another caller. Time to close the gap.
10 Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
11 Reviewed-by: Pekka Enberg <penberg@cs.helsinki.fi>
12 Acked-by: Neil Brown <neilb@suse.de>
13 Acked-by: Suresh Jayaraman <sjayaraman@suse.de>
16 mm/page_alloc.c | 16 +++++++++++++---
17 1 file changed, 13 insertions(+), 3 deletions(-)
21 @@ -120,6 +120,7 @@ static char * const zone_names[MAX_NR_ZO
25 +static DEFINE_SPINLOCK(min_free_lock);
26 int min_free_kbytes = 1024;
28 unsigned long __meminitdata nr_kernel_pages;
29 @@ -4265,12 +4266,12 @@ static void setup_per_zone_lowmem_reserv
33 - * setup_per_zone_pages_min - called when min_free_kbytes changes.
34 + * __setup_per_zone_pages_min - called when min_free_kbytes changes.
36 * Ensures that the pages_{min,low,high} values for each zone are set correctly
37 * with respect to min_free_kbytes.
39 -void setup_per_zone_pages_min(void)
40 +static void __setup_per_zone_pages_min(void)
42 unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
43 unsigned long lowmem_pages = 0;
44 @@ -4325,6 +4326,15 @@ void setup_per_zone_pages_min(void)
45 calculate_totalreserve_pages();
48 +void setup_per_zone_pages_min(void)
50 + unsigned long flags;
52 + spin_lock_irqsave(&min_free_lock, flags);
53 + __setup_per_zone_pages_min();
54 + spin_unlock_irqrestore(&min_free_lock, flags);
58 * Initialise min_free_kbytes.
60 @@ -4360,7 +4370,7 @@ static int __init init_per_zone_pages_mi
61 min_free_kbytes = 128;
62 if (min_free_kbytes > 65536)
63 min_free_kbytes = 65536;
64 - setup_per_zone_pages_min();
65 + __setup_per_zone_pages_min();
66 setup_per_zone_lowmem_reserve();