2010/9/2 Michal Hocko <mhocko@xxxxxxx>: > What about this? Just compile tested. > > --- > From a2aaeafbaeb5b195b699df25060128b9e547949c Mon Sep 17 00:00:00 2001 > From: Michal Hocko <mhocko@xxxxxxx> > 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 but still > movable. > > Let's make a common helper is_page_removable which unifies both tests > at one place. > > Do not rely on any of MIGRATE_* types as all others than MIGRATE_MOVABLE > may be tricky. MIGRATE_RESERVE can be anything that just happened to > fallback to that allocation, MIGRATE_RECLAIMABLE can be unmovable > because slab (or what ever) has this page currently in use. If we tried > to remove those pages and the isolation failed then those blocks > would get to the MIRAGTE_MOVABLE list and we will end up with the > unmovable pages in the movable zone. > > Let's, instead, check just whether a pageblock contains free or LRU > pages. > > Signed-off-by: Michal Hocko <mhocko@xxxxxxx> > --- > include/linux/mmzone.h | 24 ++++++++++++++++++++++++ > mm/memory_hotplug.c | 19 +------------------ > mm/page_alloc.c | 5 +---- > 3 files changed, 26 insertions(+), 22 deletions(-) > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 6e6e626..0bd941b 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -669,6 +669,30 @@ 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 or LRU pages block are removable > + * Do not use MIGRATE_MOVABLE because it can be insufficient and > + * other MIGRATE types are tricky. > + */ > +static inline bool is_page_removable(struct page *page) > +{ > + int page_block = 1 << pageblock_order; > + for (page_block > 0) { for ? > + if (PageBuddy(page)) { > + page_block -= page_order(page); > + }else if (PageLRU(page)) > + page_block--; > + else > + return false; > + } > + > + return true; > +} Hmm. above for is intending to check all pages in the block ? I'll look into details, tomorrow. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href