diff options
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 35fdde041f5c..0b9f577b1a2a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2170,6 +2170,18 @@ static inline void boost_watermark(struct zone *zone) | |||
2170 | 2170 | ||
2171 | max_boost = mult_frac(zone->_watermark[WMARK_HIGH], | 2171 | max_boost = mult_frac(zone->_watermark[WMARK_HIGH], |
2172 | watermark_boost_factor, 10000); | 2172 | watermark_boost_factor, 10000); |
2173 | |||
2174 | /* | ||
2175 | * high watermark may be uninitialised if fragmentation occurs | ||
2176 | * very early in boot so do not boost. We do not fall | ||
2177 | * through and boost by pageblock_nr_pages as failing | ||
2178 | * allocations that early means that reclaim is not going | ||
2179 | * to help and it may even be impossible to reclaim the | ||
2180 | * boosted watermark resulting in a hang. | ||
2181 | */ | ||
2182 | if (!max_boost) | ||
2183 | return; | ||
2184 | |||
2173 | max_boost = max(pageblock_nr_pages, max_boost); | 2185 | max_boost = max(pageblock_nr_pages, max_boost); |
2174 | 2186 | ||
2175 | zone->watermark_boost = min(zone->watermark_boost + pageblock_nr_pages, | 2187 | zone->watermark_boost = min(zone->watermark_boost + pageblock_nr_pages, |
@@ -4675,11 +4687,11 @@ refill: | |||
4675 | /* Even if we own the page, we do not use atomic_set(). | 4687 | /* Even if we own the page, we do not use atomic_set(). |
4676 | * This would break get_page_unless_zero() users. | 4688 | * This would break get_page_unless_zero() users. |
4677 | */ | 4689 | */ |
4678 | page_ref_add(page, size - 1); | 4690 | page_ref_add(page, PAGE_FRAG_CACHE_MAX_SIZE); |
4679 | 4691 | ||
4680 | /* reset page count bias and offset to start of new frag */ | 4692 | /* reset page count bias and offset to start of new frag */ |
4681 | nc->pfmemalloc = page_is_pfmemalloc(page); | 4693 | nc->pfmemalloc = page_is_pfmemalloc(page); |
4682 | nc->pagecnt_bias = size; | 4694 | nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; |
4683 | nc->offset = size; | 4695 | nc->offset = size; |
4684 | } | 4696 | } |
4685 | 4697 | ||
@@ -4695,10 +4707,10 @@ refill: | |||
4695 | size = nc->size; | 4707 | size = nc->size; |
4696 | #endif | 4708 | #endif |
4697 | /* OK, page count is 0, we can safely set it */ | 4709 | /* OK, page count is 0, we can safely set it */ |
4698 | set_page_count(page, size); | 4710 | set_page_count(page, PAGE_FRAG_CACHE_MAX_SIZE + 1); |
4699 | 4711 | ||
4700 | /* reset page count bias and offset to start of new frag */ | 4712 | /* reset page count bias and offset to start of new frag */ |
4701 | nc->pagecnt_bias = size; | 4713 | nc->pagecnt_bias = PAGE_FRAG_CACHE_MAX_SIZE + 1; |
4702 | offset = size - fragsz; | 4714 | offset = size - fragsz; |
4703 | } | 4715 | } |
4704 | 4716 | ||