2 * linux/mm/page_isolation.c
7 #include <linux/page-isolation.h>
8 #include <linux/pageblock-flags.h>
11 static inline struct page
*
12 __first_valid_page(unsigned long pfn
, unsigned long nr_pages
)
15 for (i
= 0; i
< nr_pages
; i
++)
16 if (pfn_valid_within(pfn
+ i
))
18 if (unlikely(i
== nr_pages
))
20 return pfn_to_page(pfn
+ i
);
24 * start_isolate_page_range() -- make page-allocation-type of range of pages
25 * to be MIGRATE_ISOLATE.
26 * @start_pfn: The lower PFN of the range to be isolated.
27 * @end_pfn: The upper PFN of the range to be isolated.
29 * Making page-allocation-type to be MIGRATE_ISOLATE means free pages in
30 * the range will never be allocated. Any free pages and pages freed in the
31 * future will not be allocated again.
33 * start_pfn/end_pfn must be aligned to pageblock_order.
34 * Returns 0 on success and -EBUSY if any part of range cannot be isolated.
37 start_isolate_page_range(unsigned long start_pfn
, unsigned long end_pfn
)
40 unsigned long undo_pfn
;
43 BUG_ON((start_pfn
) & (pageblock_nr_pages
- 1));
44 BUG_ON((end_pfn
) & (pageblock_nr_pages
- 1));
48 pfn
+= pageblock_nr_pages
) {
49 page
= __first_valid_page(pfn
, pageblock_nr_pages
);
50 if (page
&& set_migratetype_isolate(page
)) {
59 pfn
+= pageblock_nr_pages
)
60 unset_migratetype_isolate(pfn_to_page(pfn
));
66 * Make isolated pages available again.
69 undo_isolate_page_range(unsigned long start_pfn
, unsigned long end_pfn
)
73 BUG_ON((start_pfn
) & (pageblock_nr_pages
- 1));
74 BUG_ON((end_pfn
) & (pageblock_nr_pages
- 1));
77 pfn
+= pageblock_nr_pages
) {
78 page
= __first_valid_page(pfn
, pageblock_nr_pages
);
79 if (!page
|| get_pageblock_migratetype(page
) != MIGRATE_ISOLATE
)
81 unset_migratetype_isolate(page
);
86 * Test all pages in the range is free(means isolated) or not.
87 * all pages in [start_pfn...end_pfn) must be in the same zone.
88 * zone->lock must be held before call this.
90 * Returns 0 if all pages in the range is isolated.
93 __test_page_isolated_in_pageblock(unsigned long pfn
, unsigned long end_pfn
)
97 while (pfn
< end_pfn
) {
98 if (!pfn_valid_within(pfn
)) {
102 page
= pfn_to_page(pfn
);
104 pfn
+= 1 << page_order(page
);
105 else if (page_count(page
) == 0 &&
106 page_private(page
) == MIGRATE_ISOLATE
)
116 int test_pages_isolated(unsigned long start_pfn
, unsigned long end_pfn
)
123 * Note: pageblock_nr_page != MAX_ORDER. Then, chunks of free page
124 * is not aligned to pageblock_nr_pages.
125 * Then we just check pagetype fist.
127 for (pfn
= start_pfn
; pfn
< end_pfn
; pfn
+= pageblock_nr_pages
) {
128 page
= __first_valid_page(pfn
, pageblock_nr_pages
);
129 if (page
&& get_pageblock_migratetype(page
) != MIGRATE_ISOLATE
)
134 /* Check all pages are free or Marked as ISOLATED */
135 if (__test_page_isolated_in_pageblock(start_pfn
, end_pfn
))
This page took 0.033937 seconds and 5 git commands to generate.