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.