All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20100901124138.GD6663@tiehlicka.suse.cz>

diff --git a/a/1.txt b/N1/1.txt
index 4cf3044..11c7477 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -19,138 +19,3 @@ On Wed 01-09-10 14:19:51, Michal Hocko wrote:
 > Doesn't it make sense to check for !MIGRATE_UNMOVABLE then?
 
 Something like the following patch.
-
-
->From de85f1aa42115678d3340f0448cd798577036496 Mon Sep 17 00:00:00 2001
-From: Michal Hocko <mhocko@suse.cz>
-Date: Fri, 20 Aug 2010 15:39:16 +0200
-Subject: [PATCH] Make is_mem_section_removable more conformable with offlining code
-
-Currently is_mem_section_removable checks whether each pageblock from
-the given pfn range is of MIGRATE_MOVABLE type or if it is free. If both
-are false then the range is considered non removable.
-
-On the other hand, offlining code (more specifically
-set_migratetype_isolate) doesn't care whether a page is free and instead
-it just checks the migrate type of the page and whether the page's zone
-is movable.
-
-This can lead into a situation when we can mark a node as not removable
-just because a pageblock is MIGRATE_RESERVE and it is not free.
-
-Let's make a common helper is_page_removable which unifies both tests
-at one place. Also let's check for MIGRATE_UNMOVABLE rather than all
-possible MIGRATEable types.
-
-Signed-off-by: Michal Hocko <mhocko@suse.cz>
----
- include/linux/mmzone.h |   26 ++++++++++++++++++++++++++
- mm/memory_hotplug.c    |   19 +------------------
- mm/page_alloc.c        |    5 +----
- 3 files changed, 28 insertions(+), 22 deletions(-)
-
-diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
-index 6e6e626..7aaa272 100644
---- a/include/linux/mmzone.h
-+++ b/include/linux/mmzone.h
-@@ -669,6 +669,32 @@ unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
-  */
- #define zone_idx(zone)		((zone) - (zone)->zone_pgdat->node_zones)
- 
-+#ifdef CONFIG_MEMORY_HOTREMOVE
-+/*
-+ * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy
-+ * set and the size of the free page is given by page_order(). Using this,
-+ * the function determines if the pageblock contains only free pages.
-+ * Due to buddy contraints, a free page at least the size of a pageblock will
-+ * be located at the start of the pageblock
-+ */
-+static inline int pageblock_free(struct page *page)
-+{
-+	return PageBuddy(page) && page_order(page) >= pageblock_order;
-+}
-+
-+/*
-+ * A free pageblock or the one which is movable or reclaimable is
-+ * considered to be removable
-+ */
-+static inline bool is_page_removable(struct page *page)
-+{
-+	return get_pageblock_migratetype(page) != MIGRATE_UNMOVABLE
-+		|| pageblock_free(page);
-+}
-+#else
-+#define is_page_removable(p) 0
-+#endif
-+
- static inline int populated_zone(struct zone *zone)
- {
- 	return (!!zone->present_pages);
-diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
-index a4cfcdc..66195b8 100644
---- a/mm/memory_hotplug.c
-+++ b/mm/memory_hotplug.c
-@@ -569,17 +569,6 @@ out:
- EXPORT_SYMBOL_GPL(add_memory);
- 
- #ifdef CONFIG_MEMORY_HOTREMOVE
--/*
-- * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy
-- * set and the size of the free page is given by page_order(). Using this,
-- * the function determines if the pageblock contains only free pages.
-- * Due to buddy contraints, a free page at least the size of a pageblock will
-- * be located at the start of the pageblock
-- */
--static inline int pageblock_free(struct page *page)
--{
--	return PageBuddy(page) && page_order(page) >= pageblock_order;
--}
- 
- /* Return the start of the next active pageblock after a given page */
- static struct page *next_active_pageblock(struct page *page)
-@@ -608,13 +597,7 @@ int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)
- 
- 	/* Check the starting page of each pageblock within the range */
- 	for (; page < end_page; page = next_active_pageblock(page)) {
--		type = get_pageblock_migratetype(page);
--
--		/*
--		 * A pageblock containing MOVABLE or free pages is considered
--		 * removable
--		 */
--		if (type != MIGRATE_MOVABLE && !pageblock_free(page))
-+		if (!is_page_removable(page))
- 			return 0;
- 
- 		/*
-diff --git a/mm/page_alloc.c b/mm/page_alloc.c
-index a9649f4..c2e2576 100644
---- a/mm/page_alloc.c
-+++ b/mm/page_alloc.c
-@@ -5277,14 +5277,11 @@ int set_migratetype_isolate(struct page *page)
- 	struct memory_isolate_notify arg;
- 	int notifier_ret;
- 	int ret = -EBUSY;
--	int zone_idx;
- 
- 	zone = page_zone(page);
--	zone_idx = zone_idx(zone);
- 
- 	spin_lock_irqsave(&zone->lock, flags);
--	if (get_pageblock_migratetype(page) == MIGRATE_MOVABLE ||
--	    zone_idx == ZONE_MOVABLE) {
-+	if (is_page_removable(page)) {
- 		ret = 0;
- 		goto out;
- 	}
--- 
-1.7.1
-
-
--- 
-Michal Hocko
-L3 team 
-SUSE LINUX s.r.o.
-Lihovarska 1060/12
-190 00 Praha 9    
-Czech Republic
diff --git a/a/content_digest b/N1/content_digest
index 4f7bb3d..d6d0add 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -37,141 +37,6 @@
  "> \n"
  "> Doesn't it make sense to check for !MIGRATE_UNMOVABLE then?\n"
  "\n"
- "Something like the following patch.\n"
- "\n"
- "\n"
- ">From de85f1aa42115678d3340f0448cd798577036496 Mon Sep 17 00:00:00 2001\n"
- "From: Michal Hocko <mhocko@suse.cz>\n"
- "Date: Fri, 20 Aug 2010 15:39:16 +0200\n"
- "Subject: [PATCH] Make is_mem_section_removable more conformable with offlining code\n"
- "\n"
- "Currently is_mem_section_removable checks whether each pageblock from\n"
- "the given pfn range is of MIGRATE_MOVABLE type or if it is free. If both\n"
- "are false then the range is considered non removable.\n"
- "\n"
- "On the other hand, offlining code (more specifically\n"
- "set_migratetype_isolate) doesn't care whether a page is free and instead\n"
- "it just checks the migrate type of the page and whether the page's zone\n"
- "is movable.\n"
- "\n"
- "This can lead into a situation when we can mark a node as not removable\n"
- "just because a pageblock is MIGRATE_RESERVE and it is not free.\n"
- "\n"
- "Let's make a common helper is_page_removable which unifies both tests\n"
- "at one place. Also let's check for MIGRATE_UNMOVABLE rather than all\n"
- "possible MIGRATEable types.\n"
- "\n"
- "Signed-off-by: Michal Hocko <mhocko@suse.cz>\n"
- "---\n"
- " include/linux/mmzone.h |   26 ++++++++++++++++++++++++++\n"
- " mm/memory_hotplug.c    |   19 +------------------\n"
- " mm/page_alloc.c        |    5 +----\n"
- " 3 files changed, 28 insertions(+), 22 deletions(-)\n"
- "\n"
- "diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h\n"
- "index 6e6e626..7aaa272 100644\n"
- "--- a/include/linux/mmzone.h\n"
- "+++ b/include/linux/mmzone.h\n"
- "@@ -669,6 +669,32 @@ unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);\n"
- "  */\n"
- " #define zone_idx(zone)\t\t((zone) - (zone)->zone_pgdat->node_zones)\n"
- " \n"
- "+#ifdef CONFIG_MEMORY_HOTREMOVE\n"
- "+/*\n"
- "+ * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy\n"
- "+ * set and the size of the free page is given by page_order(). Using this,\n"
- "+ * the function determines if the pageblock contains only free pages.\n"
- "+ * Due to buddy contraints, a free page at least the size of a pageblock will\n"
- "+ * be located at the start of the pageblock\n"
- "+ */\n"
- "+static inline int pageblock_free(struct page *page)\n"
- "+{\n"
- "+\treturn PageBuddy(page) && page_order(page) >= pageblock_order;\n"
- "+}\n"
- "+\n"
- "+/*\n"
- "+ * A free pageblock or the one which is movable or reclaimable is\n"
- "+ * considered to be removable\n"
- "+ */\n"
- "+static inline bool is_page_removable(struct page *page)\n"
- "+{\n"
- "+\treturn get_pageblock_migratetype(page) != MIGRATE_UNMOVABLE\n"
- "+\t\t|| pageblock_free(page);\n"
- "+}\n"
- "+#else\n"
- "+#define is_page_removable(p) 0\n"
- "+#endif\n"
- "+\n"
- " static inline int populated_zone(struct zone *zone)\n"
- " {\n"
- " \treturn (!!zone->present_pages);\n"
- "diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c\n"
- "index a4cfcdc..66195b8 100644\n"
- "--- a/mm/memory_hotplug.c\n"
- "+++ b/mm/memory_hotplug.c\n"
- "@@ -569,17 +569,6 @@ out:\n"
- " EXPORT_SYMBOL_GPL(add_memory);\n"
- " \n"
- " #ifdef CONFIG_MEMORY_HOTREMOVE\n"
- "-/*\n"
- "- * A free page on the buddy free lists (not the per-cpu lists) has PageBuddy\n"
- "- * set and the size of the free page is given by page_order(). Using this,\n"
- "- * the function determines if the pageblock contains only free pages.\n"
- "- * Due to buddy contraints, a free page at least the size of a pageblock will\n"
- "- * be located at the start of the pageblock\n"
- "- */\n"
- "-static inline int pageblock_free(struct page *page)\n"
- "-{\n"
- "-\treturn PageBuddy(page) && page_order(page) >= pageblock_order;\n"
- "-}\n"
- " \n"
- " /* Return the start of the next active pageblock after a given page */\n"
- " static struct page *next_active_pageblock(struct page *page)\n"
- "@@ -608,13 +597,7 @@ int is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages)\n"
- " \n"
- " \t/* Check the starting page of each pageblock within the range */\n"
- " \tfor (; page < end_page; page = next_active_pageblock(page)) {\n"
- "-\t\ttype = get_pageblock_migratetype(page);\n"
- "-\n"
- "-\t\t/*\n"
- "-\t\t * A pageblock containing MOVABLE or free pages is considered\n"
- "-\t\t * removable\n"
- "-\t\t */\n"
- "-\t\tif (type != MIGRATE_MOVABLE && !pageblock_free(page))\n"
- "+\t\tif (!is_page_removable(page))\n"
- " \t\t\treturn 0;\n"
- " \n"
- " \t\t/*\n"
- "diff --git a/mm/page_alloc.c b/mm/page_alloc.c\n"
- "index a9649f4..c2e2576 100644\n"
- "--- a/mm/page_alloc.c\n"
- "+++ b/mm/page_alloc.c\n"
- "@@ -5277,14 +5277,11 @@ int set_migratetype_isolate(struct page *page)\n"
- " \tstruct memory_isolate_notify arg;\n"
- " \tint notifier_ret;\n"
- " \tint ret = -EBUSY;\n"
- "-\tint zone_idx;\n"
- " \n"
- " \tzone = page_zone(page);\n"
- "-\tzone_idx = zone_idx(zone);\n"
- " \n"
- " \tspin_lock_irqsave(&zone->lock, flags);\n"
- "-\tif (get_pageblock_migratetype(page) == MIGRATE_MOVABLE ||\n"
- "-\t    zone_idx == ZONE_MOVABLE) {\n"
- "+\tif (is_page_removable(page)) {\n"
- " \t\tret = 0;\n"
- " \t\tgoto out;\n"
- " \t}\n"
- "-- \n"
- "1.7.1\n"
- "\n"
- "\n"
- "-- \n"
- "Michal Hocko\n"
- "L3 team \n"
- "SUSE LINUX s.r.o.\n"
- "Lihovarska 1060/12\n"
- "190 00 Praha 9    \n"
- Czech Republic
+ Something like the following patch.
 
-de5545031ca2f86c5edc08e7013af3440844d58310b1cfbba992840e03cbf5f7
+c85b7b9c819a841ec78baba4c30a5af8cfe5db57161ee52055961162bd18481a

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.