Skip to content

Commit d3cda23

Browse files
JoonsooKimtorvalds
authored andcommitted
mm/page_alloc: don't reserve ZONE_HIGHMEM for ZONE_MOVABLE request
Freepage on ZONE_HIGHMEM doesn't work for kernel memory so it's not that important to reserve. When ZONE_MOVABLE is used, this problem would theorectically cause to decrease usable memory for GFP_HIGHUSER_MOVABLE allocation request which is mainly used for page cache and anon page allocation. So, fix it by setting 0 to sysctl_lowmem_reserve_ratio[ZONE_HIGHMEM]. And, defining sysctl_lowmem_reserve_ratio array by MAX_NR_ZONES - 1 size makes code complex. For example, if there is highmem system, following reserve ratio is activated for *NORMAL ZONE* which would be easyily misleading people. #ifdef CONFIG_HIGHMEM 32 #endif This patch also fixes this situation by defining sysctl_lowmem_reserve_ratio array by MAX_NR_ZONES and place "#ifdef" to right place. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Joonsoo Kim <[email protected]> Reviewed-by: Aneesh Kumar K.V <[email protected]> Acked-by: Vlastimil Babka <[email protected]> Tested-by: Tony Lindgren <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: "Aneesh Kumar K . V" <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Laura Abbott <[email protected]> Cc: Marek Szyprowski <[email protected]> Cc: Michal Nazarewicz <[email protected]> Cc: Russell King <[email protected]> Cc: Will Deacon <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 94723aa commit d3cda23

File tree

3 files changed

+17
-15
lines changed

3 files changed

+17
-15
lines changed

Documentation/sysctl/vm.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,6 @@ The lowmem_reserve_ratio is an array. You can see them by reading this file.
312312
% cat /proc/sys/vm/lowmem_reserve_ratio
313313
256 256 32
314314
-
315-
Note: # of this elements is one fewer than number of zones. Because the highest
316-
zone's value is not necessary for following calculation.
317315

318316
But, these values are not used directly. The kernel calculates # of protection
319317
pages for each zones from them. These are shown as array of protection pages
@@ -364,7 +362,8 @@ As above expression, they are reciprocal number of ratio.
364362
pages of higher zones on the node.
365363

366364
If you would like to protect more pages, smaller values are effective.
367-
The minimum value is 1 (1/1 -> 100%).
365+
The minimum value is 1 (1/1 -> 100%). The value less than 1 completely
366+
disables protection of the pages.
368367

369368
==============================================================
370369

include/linux/mmzone.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ int min_free_kbytes_sysctl_handler(struct ctl_table *, int,
885885
void __user *, size_t *, loff_t *);
886886
int watermark_scale_factor_sysctl_handler(struct ctl_table *, int,
887887
void __user *, size_t *, loff_t *);
888-
extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
888+
extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES];
889889
int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int,
890890
void __user *, size_t *, loff_t *);
891891
int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int,

mm/page_alloc.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -205,17 +205,18 @@ static void __free_pages_ok(struct page *page, unsigned int order);
205205
* TBD: should special case ZONE_DMA32 machines here - in those we normally
206206
* don't need any ZONE_NORMAL reservation
207207
*/
208-
int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1] = {
208+
int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES] = {
209209
#ifdef CONFIG_ZONE_DMA
210-
256,
210+
[ZONE_DMA] = 256,
211211
#endif
212212
#ifdef CONFIG_ZONE_DMA32
213-
256,
213+
[ZONE_DMA32] = 256,
214214
#endif
215+
[ZONE_NORMAL] = 32,
215216
#ifdef CONFIG_HIGHMEM
216-
32,
217+
[ZONE_HIGHMEM] = 0,
217218
#endif
218-
32,
219+
[ZONE_MOVABLE] = 0,
219220
};
220221

221222
EXPORT_SYMBOL(totalram_pages);
@@ -7132,13 +7133,15 @@ static void setup_per_zone_lowmem_reserve(void)
71327133
struct zone *lower_zone;
71337134

71347135
idx--;
7135-
7136-
if (sysctl_lowmem_reserve_ratio[idx] < 1)
7137-
sysctl_lowmem_reserve_ratio[idx] = 1;
7138-
71397136
lower_zone = pgdat->node_zones + idx;
7140-
lower_zone->lowmem_reserve[j] = managed_pages /
7141-
sysctl_lowmem_reserve_ratio[idx];
7137+
7138+
if (sysctl_lowmem_reserve_ratio[idx] < 1) {
7139+
sysctl_lowmem_reserve_ratio[idx] = 0;
7140+
lower_zone->lowmem_reserve[j] = 0;
7141+
} else {
7142+
lower_zone->lowmem_reserve[j] =
7143+
managed_pages / sysctl_lowmem_reserve_ratio[idx];
7144+
}
71427145
managed_pages += lower_zone->managed_pages;
71437146
}
71447147
}

0 commit comments

Comments
 (0)