Thread (6 messages) flat view 6 messages, 3 authors, 2009-10-02

Re: [PATCH 1/2] mm: add notifier in pageblock isolation for balloon drivers

From: Robert Jennings <hidden>
Date: 2009-10-02 18:31:46
Also in: linux-mm, lkml

* Nathan Fontenot (nfont@austin.ibm.com) wrote:
Robert Jennings wrote:
quoted
Memory balloon drivers can allocate a large amount of memory which
is not movable but could be freed to accommodate memory hotplug remove.

Prior to calling the memory hotplug notifier chain the memory in the
pageblock is isolated.  If the migrate type is not MIGRATE_MOVABLE the
isolation will not proceed, causing the memory removal for that page
range to fail.

Rather than immediately failing pageblock isolation if the the
migrateteype is not MIGRATE_MOVABLE, this patch checks if all of the
pages in the pageblock are owned by a registered balloon driver using a
notifier chain.  If all of the non-movable pages are owned by a balloon,
they can be freed later through the memory notifier chain and the range
can still be isolated in set_migratetype_isolate().

Signed-off-by: Robert Jennings <redacted>

---
 drivers/base/memory.c  |   19 +++++++++++++++++++
 include/linux/memory.h |   22 ++++++++++++++++++++++
 mm/page_alloc.c        |   49 +++++++++++++++++++++++++++++++++++++++++--------
 3 files changed, 82 insertions(+), 8 deletions(-)
<snip>
quoted
Index: b/mm/page_alloc.c
===================================================================
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -48,6 +48,7 @@
 #include <linux/page_cgroup.h>
 #include <linux/debugobjects.h>
 #include <linux/kmemleak.h>
+#include <linux/memory.h>
 #include <trace/events/kmem.h>
  #include <asm/tlbflush.h>
@@ -4985,23 +4986,55 @@ void set_pageblock_flags_group(struct pa
 int set_migratetype_isolate(struct page *page)
 {
 	struct zone *zone;
-	unsigned long flags;
+	unsigned long flags, pfn, iter;
+	long immobile = 0;
+	struct memory_isolate_notify arg;
+	int notifier_ret;
 	int ret = -EBUSY;
 	int zone_idx;
  	zone = page_zone(page);
 	zone_idx = zone_idx(zone);
+
+	pfn = page_to_pfn(page);
+	arg.start_addr = (unsigned long)page_address(page);
+	arg.nr_pages = pageblock_nr_pages;
+	arg.pages_found = 0;
+
 	spin_lock_irqsave(&zone->lock, flags);
 	/*
 	 * In future, more migrate types will be able to be isolation target.
 	 */
-	if (get_pageblock_migratetype(page) != MIGRATE_MOVABLE &&
-	    zone_idx != ZONE_MOVABLE)
-		goto out;
-	set_pageblock_migratetype(page, MIGRATE_ISOLATE);
-	move_freepages_block(zone, page, MIGRATE_ISOLATE);
-	ret = 0;
-out:
+	do {
+		if (get_pageblock_migratetype(page) == MIGRATE_MOVABLE &&
+		    zone_idx == ZONE_MOVABLE) {
+			ret = 0;
+			break;
+		}
+
+		/*
+		 * If all of the pages in a zone are used by a balloon,
+		 * the range can be still be isolated.  The balloon will
+		 * free these pages from the memory notifier chain.
+		 */
+		notifier_ret = memory_isolate_notify(MEM_ISOLATE_COUNT, &arg);
+		notifier_ret = notifier_to_errno(ret);
Should this be

		notifier_ret = notifier_to_errno(notifier_ret);

-Nathan
I'll correct this.  Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help