diff options
author | Michal Nazarewicz <mina86@mina86.com> | 2012-04-03 09:06:15 -0400 |
---|---|---|
committer | Marek Szyprowski <m.szyprowski@samsung.com> | 2012-05-21 09:09:33 -0400 |
commit | 0815f3d81d76dfbf2abcfd93a85ff0a6008fe4c0 (patch) | |
tree | 750e239c7c522a206bb04bd8bfcd89c3bf3be30d /mm/page_isolation.c | |
parent | 47118af076f64844b4f423bc2f545b2da9dab50d (diff) |
mm: page_isolation: MIGRATE_CMA isolation functions added
This commit changes various functions that change pages and
pageblocks migrate type between MIGRATE_ISOLATE and
MIGRATE_MOVABLE in such a way as to allow to work with
MIGRATE_CMA migrate type.
Signed-off-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Tested-by: Rob Clark <rob.clark@linaro.org>
Tested-by: Ohad Ben-Cohen <ohad@wizery.com>
Tested-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Tested-by: Robert Nelson <robertcnelson@gmail.com>
Tested-by: Barry Song <Baohua.Song@csr.com>
Diffstat (limited to 'mm/page_isolation.c')
-rw-r--r-- | mm/page_isolation.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 4ae42bb40892..c9f04774f2b8 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c | |||
@@ -24,6 +24,7 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages) | |||
24 | * to be MIGRATE_ISOLATE. | 24 | * to be MIGRATE_ISOLATE. |
25 | * @start_pfn: The lower PFN of the range to be isolated. | 25 | * @start_pfn: The lower PFN of the range to be isolated. |
26 | * @end_pfn: The upper PFN of the range to be isolated. | 26 | * @end_pfn: The upper PFN of the range to be isolated. |
27 | * @migratetype: migrate type to set in error recovery. | ||
27 | * | 28 | * |
28 | * Making page-allocation-type to be MIGRATE_ISOLATE means free pages in | 29 | * Making page-allocation-type to be MIGRATE_ISOLATE means free pages in |
29 | * the range will never be allocated. Any free pages and pages freed in the | 30 | * the range will never be allocated. Any free pages and pages freed in the |
@@ -32,8 +33,8 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages) | |||
32 | * start_pfn/end_pfn must be aligned to pageblock_order. | 33 | * start_pfn/end_pfn must be aligned to pageblock_order. |
33 | * Returns 0 on success and -EBUSY if any part of range cannot be isolated. | 34 | * Returns 0 on success and -EBUSY if any part of range cannot be isolated. |
34 | */ | 35 | */ |
35 | int | 36 | int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, |
36 | start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn) | 37 | unsigned migratetype) |
37 | { | 38 | { |
38 | unsigned long pfn; | 39 | unsigned long pfn; |
39 | unsigned long undo_pfn; | 40 | unsigned long undo_pfn; |
@@ -56,7 +57,7 @@ undo: | |||
56 | for (pfn = start_pfn; | 57 | for (pfn = start_pfn; |
57 | pfn < undo_pfn; | 58 | pfn < undo_pfn; |
58 | pfn += pageblock_nr_pages) | 59 | pfn += pageblock_nr_pages) |
59 | unset_migratetype_isolate(pfn_to_page(pfn)); | 60 | unset_migratetype_isolate(pfn_to_page(pfn), migratetype); |
60 | 61 | ||
61 | return -EBUSY; | 62 | return -EBUSY; |
62 | } | 63 | } |
@@ -64,8 +65,8 @@ undo: | |||
64 | /* | 65 | /* |
65 | * Make isolated pages available again. | 66 | * Make isolated pages available again. |
66 | */ | 67 | */ |
67 | int | 68 | int undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn, |
68 | undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn) | 69 | unsigned migratetype) |
69 | { | 70 | { |
70 | unsigned long pfn; | 71 | unsigned long pfn; |
71 | struct page *page; | 72 | struct page *page; |
@@ -77,7 +78,7 @@ undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn) | |||
77 | page = __first_valid_page(pfn, pageblock_nr_pages); | 78 | page = __first_valid_page(pfn, pageblock_nr_pages); |
78 | if (!page || get_pageblock_migratetype(page) != MIGRATE_ISOLATE) | 79 | if (!page || get_pageblock_migratetype(page) != MIGRATE_ISOLATE) |
79 | continue; | 80 | continue; |
80 | unset_migratetype_isolate(page); | 81 | unset_migratetype_isolate(page, migratetype); |
81 | } | 82 | } |
82 | return 0; | 83 | return 0; |
83 | } | 84 | } |
@@ -86,7 +87,7 @@ undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn) | |||
86 | * all pages in [start_pfn...end_pfn) must be in the same zone. | 87 | * all pages in [start_pfn...end_pfn) must be in the same zone. |
87 | * zone->lock must be held before call this. | 88 | * zone->lock must be held before call this. |
88 | * | 89 | * |
89 | * Returns 1 if all pages in the range is isolated. | 90 | * Returns 1 if all pages in the range are isolated. |
90 | */ | 91 | */ |
91 | static int | 92 | static int |
92 | __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn) | 93 | __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn) |