]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From: Peter Zijlstra <a.p.zijlstra@chello.nl> |
2 | Subject: mm: serialize access to min_free_kbytes | |
3 | Patch-mainline: No | |
4 | References: FATE#303834 | |
5 | ||
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. | |
9 | ||
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> | |
14 | ||
15 | --- | |
16 | mm/page_alloc.c | 16 +++++++++++++--- | |
17 | 1 file changed, 13 insertions(+), 3 deletions(-) | |
18 | ||
19 | --- a/mm/page_alloc.c | |
20 | +++ b/mm/page_alloc.c | |
21 | @@ -120,6 +120,7 @@ static char * const zone_names[MAX_NR_ZO | |
22 | "Movable", | |
23 | }; | |
24 | ||
25 | +static DEFINE_SPINLOCK(min_free_lock); | |
26 | int min_free_kbytes = 1024; | |
27 | ||
28 | unsigned long __meminitdata nr_kernel_pages; | |
29 | @@ -4265,12 +4266,12 @@ static void setup_per_zone_lowmem_reserv | |
30 | } | |
31 | ||
32 | /** | |
33 | - * setup_per_zone_pages_min - called when min_free_kbytes changes. | |
34 | + * __setup_per_zone_pages_min - called when min_free_kbytes changes. | |
35 | * | |
36 | * Ensures that the pages_{min,low,high} values for each zone are set correctly | |
37 | * with respect to min_free_kbytes. | |
38 | */ | |
39 | -void setup_per_zone_pages_min(void) | |
40 | +static void __setup_per_zone_pages_min(void) | |
41 | { | |
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(); | |
46 | } | |
47 | ||
48 | +void setup_per_zone_pages_min(void) | |
49 | +{ | |
50 | + unsigned long flags; | |
51 | + | |
52 | + spin_lock_irqsave(&min_free_lock, flags); | |
53 | + __setup_per_zone_pages_min(); | |
54 | + spin_unlock_irqrestore(&min_free_lock, flags); | |
55 | +} | |
56 | + | |
57 | /* | |
58 | * Initialise min_free_kbytes. | |
59 | * | |
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(); | |
67 | return 0; | |
68 | } |