aboutsummaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c52
1 files changed, 36 insertions, 16 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index ee744fa3b93d..3fbe73a6fe4b 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -4060,7 +4060,7 @@ long si_mem_available(void)
4060 int lru; 4060 int lru;
4061 4061
4062 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++) 4062 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
4063 pages[lru] = global_page_state(NR_LRU_BASE + lru); 4063 pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
4064 4064
4065 for_each_zone(zone) 4065 for_each_zone(zone)
4066 wmark_low += zone->watermark[WMARK_LOW]; 4066 wmark_low += zone->watermark[WMARK_LOW];
@@ -4757,6 +4757,8 @@ int local_memory_node(int node)
4757} 4757}
4758#endif 4758#endif
4759 4759
4760static void setup_min_unmapped_ratio(void);
4761static void setup_min_slab_ratio(void);
4760#else /* CONFIG_NUMA */ 4762#else /* CONFIG_NUMA */
4761 4763
4762static void set_zonelist_order(void) 4764static void set_zonelist_order(void)
@@ -5878,9 +5880,6 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat)
5878 zone->managed_pages = is_highmem_idx(j) ? realsize : freesize; 5880 zone->managed_pages = is_highmem_idx(j) ? realsize : freesize;
5879#ifdef CONFIG_NUMA 5881#ifdef CONFIG_NUMA
5880 zone->node = nid; 5882 zone->node = nid;
5881 pgdat->min_unmapped_pages += (freesize*sysctl_min_unmapped_ratio)
5882 / 100;
5883 pgdat->min_slab_pages += (freesize * sysctl_min_slab_ratio) / 100;
5884#endif 5883#endif
5885 zone->name = zone_names[j]; 5884 zone->name = zone_names[j];
5886 zone->zone_pgdat = pgdat; 5885 zone->zone_pgdat = pgdat;
@@ -6801,6 +6800,12 @@ int __meminit init_per_zone_wmark_min(void)
6801 setup_per_zone_wmarks(); 6800 setup_per_zone_wmarks();
6802 refresh_zone_stat_thresholds(); 6801 refresh_zone_stat_thresholds();
6803 setup_per_zone_lowmem_reserve(); 6802 setup_per_zone_lowmem_reserve();
6803
6804#ifdef CONFIG_NUMA
6805 setup_min_unmapped_ratio();
6806 setup_min_slab_ratio();
6807#endif
6808
6804 return 0; 6809 return 0;
6805} 6810}
6806core_initcall(init_per_zone_wmark_min) 6811core_initcall(init_per_zone_wmark_min)
@@ -6842,43 +6847,58 @@ int watermark_scale_factor_sysctl_handler(struct ctl_table *table, int write,
6842} 6847}
6843 6848
6844#ifdef CONFIG_NUMA 6849#ifdef CONFIG_NUMA
6850static void setup_min_unmapped_ratio(void)
6851{
6852 pg_data_t *pgdat;
6853 struct zone *zone;
6854
6855 for_each_online_pgdat(pgdat)
6856 pgdat->min_unmapped_pages = 0;
6857
6858 for_each_zone(zone)
6859 zone->zone_pgdat->min_unmapped_pages += (zone->managed_pages *
6860 sysctl_min_unmapped_ratio) / 100;
6861}
6862
6863
6845int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *table, int write, 6864int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *table, int write,
6846 void __user *buffer, size_t *length, loff_t *ppos) 6865 void __user *buffer, size_t *length, loff_t *ppos)
6847{ 6866{
6848 struct pglist_data *pgdat;
6849 struct zone *zone;
6850 int rc; 6867 int rc;
6851 6868
6852 rc = proc_dointvec_minmax(table, write, buffer, length, ppos); 6869 rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
6853 if (rc) 6870 if (rc)
6854 return rc; 6871 return rc;
6855 6872
6873 setup_min_unmapped_ratio();
6874
6875 return 0;
6876}
6877
6878static void setup_min_slab_ratio(void)
6879{
6880 pg_data_t *pgdat;
6881 struct zone *zone;
6882
6856 for_each_online_pgdat(pgdat) 6883 for_each_online_pgdat(pgdat)
6857 pgdat->min_slab_pages = 0; 6884 pgdat->min_slab_pages = 0;
6858 6885
6859 for_each_zone(zone) 6886 for_each_zone(zone)
6860 zone->zone_pgdat->min_unmapped_pages += (zone->managed_pages * 6887 zone->zone_pgdat->min_slab_pages += (zone->managed_pages *
6861 sysctl_min_unmapped_ratio) / 100; 6888 sysctl_min_slab_ratio) / 100;
6862 return 0;
6863} 6889}
6864 6890
6865int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *table, int write, 6891int sysctl_min_slab_ratio_sysctl_handler(struct ctl_table *table, int write,
6866 void __user *buffer, size_t *length, loff_t *ppos) 6892 void __user *buffer, size_t *length, loff_t *ppos)
6867{ 6893{
6868 struct pglist_data *pgdat;
6869 struct zone *zone;
6870 int rc; 6894 int rc;
6871 6895
6872 rc = proc_dointvec_minmax(table, write, buffer, length, ppos); 6896 rc = proc_dointvec_minmax(table, write, buffer, length, ppos);
6873 if (rc) 6897 if (rc)
6874 return rc; 6898 return rc;
6875 6899
6876 for_each_online_pgdat(pgdat) 6900 setup_min_slab_ratio();
6877 pgdat->min_slab_pages = 0;
6878 6901
6879 for_each_zone(zone)
6880 zone->zone_pgdat->min_slab_pages += (zone->managed_pages *
6881 sysctl_min_slab_ratio) / 100;
6882 return 0; 6902 return 0;
6883} 6903}
6884#endif 6904#endif