|
@@ -158,6 +158,26 @@ static inline bool balloon_page_movable(struct page *page)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * isolated_balloon_page - identify an isolated balloon page on private
|
|
|
+ * compaction/migration page lists.
|
|
|
+ *
|
|
|
+ * After a compaction thread isolates a balloon page for migration, it raises
|
|
|
+ * the page refcount to prevent concurrent compaction threads from re-isolating
|
|
|
+ * the same page. For that reason putback_movable_pages(), or other routines
|
|
|
+ * that need to identify isolated balloon pages on private pagelists, cannot
|
|
|
+ * rely on balloon_page_movable() to accomplish the task.
|
|
|
+ */
|
|
|
+static inline bool isolated_balloon_page(struct page *page)
|
|
|
+{
|
|
|
+ /* Already isolated balloon pages, by default, have a raised refcount */
|
|
|
+ if (page_flags_cleared(page) && !page_mapped(page) &&
|
|
|
+ page_count(page) >= 2)
|
|
|
+ return __is_movable_balloon_page(page);
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* balloon_page_insert - insert a page into the balloon's page list and make
|
|
|
* the page->mapping assignment accordingly.
|
|
@@ -243,6 +263,11 @@ static inline bool balloon_page_movable(struct page *page)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static inline bool isolated_balloon_page(struct page *page)
|
|
|
+{
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
static inline bool balloon_page_isolate(struct page *page)
|
|
|
{
|
|
|
return false;
|