summaryrefslogtreecommitdiffstats
path: root/mm/page_alloc.c
diff options
context:
space:
mode:
authorJoonsoo Kim <iamjoonsoo.kim@lge.com>2016-05-19 20:12:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-19 22:12:14 -0400
commitba6b0979e346fd91d3b7ef6956d7155877308f0f (patch)
tree42f2e0c5742eddba84ab3765e3eb42a80d4f8d0e /mm/page_alloc.c
parent9d43f5aec9506d98ad492a783aa8a18226c5d474 (diff)
power: add zone range overlapping check
There is a system thats node's pfns are overlapped as follows: -----pfn--------> N0 N1 N2 N0 N1 N2 Therefore, we need to care this overlapping when iterating pfn range. mark_free_pages() iterates requested zone's pfn range and unset all range's bitmap first. And then it marks freepages in a zone to the bitmap. If there is an overlapping zone, above unset could clear previous marked bit and reference to this bitmap in the future will cause the problem. To prevent it, this patch adds a zone check in mark_free_pages(). Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Rik van Riel <riel@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Mel Gorman <mgorman@suse.de> Cc: Laura Abbott <lauraa@codeaurora.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Michal Nazarewicz <mina86@mina86.com> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r--mm/page_alloc.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 19fe7e9c39a6..e132705d19fd 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2156,6 +2156,10 @@ void mark_free_pages(struct zone *zone)
2156 for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) 2156 for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++)
2157 if (pfn_valid(pfn)) { 2157 if (pfn_valid(pfn)) {
2158 page = pfn_to_page(pfn); 2158 page = pfn_to_page(pfn);
2159
2160 if (page_zone(page) != zone)
2161 continue;
2162
2159 if (!swsusp_page_is_forbidden(page)) 2163 if (!swsusp_page_is_forbidden(page))
2160 swsusp_unset_page_free(page); 2164 swsusp_unset_page_free(page);
2161 } 2165 }