All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xishi Qiu <qiuxishi@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>,
	Mel Gorman <mgorman@suse.de>,
	cody@linux.vnet.ibm.com, Liujiang <jiang.liu@huawei.com>,
	Minchan Kim <minchan@kernel.org>,
	Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
	b.zolnierkie@samsung.com
Cc: linux-mm@kvack.org, LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH] mm/hotplug: fix a drain pcp bug when offline pages
Date: Thu, 1 Aug 2013 17:18:56 +0800	[thread overview]
Message-ID: <51FA2800.9070706@huawei.com> (raw)

__offline_pages()
   start_isolate_page_range()
      set_migratetype_isolate()
         set_pageblock_migratetype() -> this pageblock will be marked as MIGRATE_ISOLATE
         move_freepages_block() -> pages in PageBuddy will be moved into MIGRATE_ISOLATE list
         drain_all_pages() -> drain PCP
            free_pcppages_bulk()
               mt = get_freepage_migratetype(page); -> PCP's migratetype is not MIGRATE_ISOLATE
               __free_one_page(page, zone, 0, mt); -> so PCP will not be freed into into MIGRATE_ISOLATE list

In this case, the PCP may be allocated again, because they are not in 
PageBuddy's MIGRATE_ISOLATE list. This will cause offline_pages failed.

Signed-off-by: Xishi Qiu <qiuxishi@huawei.com>
---
 mm/page_alloc.c     |   10 ++++++----
 mm/page_isolation.c |   15 ++++++++++++++-
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index b100255..d873471 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -965,11 +965,13 @@ int move_freepages(struct zone *zone,
 		}
 
 		order = page_order(page);
-		list_move(&page->lru,
-			  &zone->free_area[order].free_list[migratetype]);
-		set_freepage_migratetype(page, migratetype);
+		if (get_freepage_migratetype(page) != migratetype) {
+			list_move(&page->lru,
+				&zone->free_area[order].free_list[migratetype]);
+			set_freepage_migratetype(page, migratetype);
+			pages_moved += 1 << order;
+		}
 		page += 1 << order;
-		pages_moved += 1 << order;
 	}
 
 	return pages_moved;
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 383bdbb..ba1afc9 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -65,8 +65,21 @@ out:
 	}
 
 	spin_unlock_irqrestore(&zone->lock, flags);
-	if (!ret)
+
+	if (!ret) {
 		drain_all_pages();
+		/*
+		 * When drain_all_pages() frees cached pages into the buddy
+		 * system, it uses the stale migratetype cached in the
+		 * page->index field, so try to move free pages to ISOLATE
+		 * list again.
+		 */
+		spin_lock_irqsave(&zone->lock, flags);
+		nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
+		__mod_zone_freepage_state(zone, -nr_pages, migratetype);
+		spin_unlock_irqrestore(&zone->lock, flags);
+	}
+
 	return ret;
 }
 
-- 
1.7.1

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Xishi Qiu <qiuxishi@huawei.com>
To: Andrew Morton <akpm@linux-foundation.org>,
	Mel Gorman <mgorman@suse.de>, <cody@linux.vnet.ibm.com>,
	Liujiang <jiang.liu@huawei.com>, Minchan Kim <minchan@kernel.org>,
	Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>,
	<b.zolnierkie@samsung.com>
Cc: <linux-mm@kvack.org>, LKML <linux-kernel@vger.kernel.org>
Subject: [PATCH] mm/hotplug: fix a drain pcp bug when offline pages
Date: Thu, 1 Aug 2013 17:18:56 +0800	[thread overview]
Message-ID: <51FA2800.9070706@huawei.com> (raw)

__offline_pages()
   start_isolate_page_range()
      set_migratetype_isolate()
         set_pageblock_migratetype() -> this pageblock will be marked as MIGRATE_ISOLATE
         move_freepages_block() -> pages in PageBuddy will be moved into MIGRATE_ISOLATE list
         drain_all_pages() -> drain PCP
            free_pcppages_bulk()
               mt = get_freepage_migratetype(page); -> PCP's migratetype is not MIGRATE_ISOLATE
               __free_one_page(page, zone, 0, mt); -> so PCP will not be freed into into MIGRATE_ISOLATE list

In this case, the PCP may be allocated again, because they are not in 
PageBuddy's MIGRATE_ISOLATE list. This will cause offline_pages failed.

Signed-off-by: Xishi Qiu <qiuxishi@huawei.com>
---
 mm/page_alloc.c     |   10 ++++++----
 mm/page_isolation.c |   15 ++++++++++++++-
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index b100255..d873471 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -965,11 +965,13 @@ int move_freepages(struct zone *zone,
 		}
 
 		order = page_order(page);
-		list_move(&page->lru,
-			  &zone->free_area[order].free_list[migratetype]);
-		set_freepage_migratetype(page, migratetype);
+		if (get_freepage_migratetype(page) != migratetype) {
+			list_move(&page->lru,
+				&zone->free_area[order].free_list[migratetype]);
+			set_freepage_migratetype(page, migratetype);
+			pages_moved += 1 << order;
+		}
 		page += 1 << order;
-		pages_moved += 1 << order;
 	}
 
 	return pages_moved;
diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 383bdbb..ba1afc9 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -65,8 +65,21 @@ out:
 	}
 
 	spin_unlock_irqrestore(&zone->lock, flags);
-	if (!ret)
+
+	if (!ret) {
 		drain_all_pages();
+		/*
+		 * When drain_all_pages() frees cached pages into the buddy
+		 * system, it uses the stale migratetype cached in the
+		 * page->index field, so try to move free pages to ISOLATE
+		 * list again.
+		 */
+		spin_lock_irqsave(&zone->lock, flags);
+		nr_pages = move_freepages_block(zone, page, MIGRATE_ISOLATE);
+		__mod_zone_freepage_state(zone, -nr_pages, migratetype);
+		spin_unlock_irqrestore(&zone->lock, flags);
+	}
+
 	return ret;
 }
 
-- 
1.7.1


             reply	other threads:[~2013-08-01  9:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-01  9:18 Xishi Qiu [this message]
2013-08-01  9:18 ` [PATCH] mm/hotplug: fix a drain pcp bug when offline pages Xishi Qiu
2013-08-01 18:59 ` Cody P Schafer
2013-08-01 18:59   ` Cody P Schafer
2013-08-02  2:30   ` Xishi Qiu
2013-08-02  2:30     ` Xishi Qiu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51FA2800.9070706@huawei.com \
    --to=qiuxishi@huawei.com \
    --cc=akpm@linux-foundation.org \
    --cc=b.zolnierkie@samsung.com \
    --cc=cody@linux.vnet.ibm.com \
    --cc=isimatu.yasuaki@jp.fujitsu.com \
    --cc=jiang.liu@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mgorman@suse.de \
    --cc=minchan@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.