diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/page_alloc.c | 22 | ||||
-rw-r--r-- | mm/vmscan.c | 27 |
2 files changed, 36 insertions, 13 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 3e792a583f3b..54a4f5375bba 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2005,6 +2005,10 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat, | |||
2005 | 2005 | ||
2006 | zone->spanned_pages = size; | 2006 | zone->spanned_pages = size; |
2007 | zone->present_pages = realsize; | 2007 | zone->present_pages = realsize; |
2008 | #ifdef CONFIG_NUMA | ||
2009 | zone->min_unmapped_ratio = (realsize*sysctl_min_unmapped_ratio) | ||
2010 | / 100; | ||
2011 | #endif | ||
2008 | zone->name = zone_names[j]; | 2012 | zone->name = zone_names[j]; |
2009 | spin_lock_init(&zone->lock); | 2013 | spin_lock_init(&zone->lock); |
2010 | spin_lock_init(&zone->lru_lock); | 2014 | spin_lock_init(&zone->lru_lock); |
@@ -2298,6 +2302,24 @@ int min_free_kbytes_sysctl_handler(ctl_table *table, int write, | |||
2298 | return 0; | 2302 | return 0; |
2299 | } | 2303 | } |
2300 | 2304 | ||
2305 | #ifdef CONFIG_NUMA | ||
2306 | int sysctl_min_unmapped_ratio_sysctl_handler(ctl_table *table, int write, | ||
2307 | struct file *file, void __user *buffer, size_t *length, loff_t *ppos) | ||
2308 | { | ||
2309 | struct zone *zone; | ||
2310 | int rc; | ||
2311 | |||
2312 | rc = proc_dointvec_minmax(table, write, file, buffer, length, ppos); | ||
2313 | if (rc) | ||
2314 | return rc; | ||
2315 | |||
2316 | for_each_zone(zone) | ||
2317 | zone->min_unmapped_ratio = (zone->present_pages * | ||
2318 | sysctl_min_unmapped_ratio) / 100; | ||
2319 | return 0; | ||
2320 | } | ||
2321 | #endif | ||
2322 | |||
2301 | /* | 2323 | /* |
2302 | * lowmem_reserve_ratio_sysctl_handler - just a wrapper around | 2324 | * lowmem_reserve_ratio_sysctl_handler - just a wrapper around |
2303 | * proc_dointvec() so that we can call setup_per_zone_lowmem_reserve() | 2325 | * proc_dointvec() so that we can call setup_per_zone_lowmem_reserve() |
diff --git a/mm/vmscan.c b/mm/vmscan.c index ff2ebe9458a3..5d4c4d02254d 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -1503,10 +1503,6 @@ module_init(kswapd_init) | |||
1503 | * | 1503 | * |
1504 | * If non-zero call zone_reclaim when the number of free pages falls below | 1504 | * If non-zero call zone_reclaim when the number of free pages falls below |
1505 | * the watermarks. | 1505 | * the watermarks. |
1506 | * | ||
1507 | * In the future we may add flags to the mode. However, the page allocator | ||
1508 | * should only have to check that zone_reclaim_mode != 0 before calling | ||
1509 | * zone_reclaim(). | ||
1510 | */ | 1506 | */ |
1511 | int zone_reclaim_mode __read_mostly; | 1507 | int zone_reclaim_mode __read_mostly; |
1512 | 1508 | ||
@@ -1524,6 +1520,12 @@ int zone_reclaim_mode __read_mostly; | |||
1524 | #define ZONE_RECLAIM_PRIORITY 4 | 1520 | #define ZONE_RECLAIM_PRIORITY 4 |
1525 | 1521 | ||
1526 | /* | 1522 | /* |
1523 | * Percentage of pages in a zone that must be unmapped for zone_reclaim to | ||
1524 | * occur. | ||
1525 | */ | ||
1526 | int sysctl_min_unmapped_ratio = 1; | ||
1527 | |||
1528 | /* | ||
1527 | * Try to free up some pages from this zone through reclaim. | 1529 | * Try to free up some pages from this zone through reclaim. |
1528 | */ | 1530 | */ |
1529 | static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | 1531 | static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) |
@@ -1590,18 +1592,17 @@ int zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
1590 | int node_id; | 1592 | int node_id; |
1591 | 1593 | ||
1592 | /* | 1594 | /* |
1593 | * Do not reclaim if there are not enough reclaimable pages in this | 1595 | * Zone reclaim reclaims unmapped file backed pages. |
1594 | * zone that would satify this allocations. | ||
1595 | * | 1596 | * |
1596 | * All unmapped pagecache pages are reclaimable. | 1597 | * A small portion of unmapped file backed pages is needed for |
1597 | * | 1598 | * file I/O otherwise pages read by file I/O will be immediately |
1598 | * Both counters may be temporarily off a bit so we use | 1599 | * thrown out if the zone is overallocated. So we do not reclaim |
1599 | * SWAP_CLUSTER_MAX as the boundary. It may also be good to | 1600 | * if less than a specified percentage of the zone is used by |
1600 | * leave a few frequently used unmapped pagecache pages around. | 1601 | * unmapped file backed pages. |
1601 | */ | 1602 | */ |
1602 | if (zone_page_state(zone, NR_FILE_PAGES) - | 1603 | if (zone_page_state(zone, NR_FILE_PAGES) - |
1603 | zone_page_state(zone, NR_FILE_MAPPED) < SWAP_CLUSTER_MAX) | 1604 | zone_page_state(zone, NR_FILE_MAPPED) <= zone->min_unmapped_ratio) |
1604 | return 0; | 1605 | return 0; |
1605 | 1606 | ||
1606 | /* | 1607 | /* |
1607 | * Avoid concurrent zone reclaims, do not reclaim in a zone that does | 1608 | * Avoid concurrent zone reclaims, do not reclaim in a zone that does |