This patch add additonal information to 'Reserved' pages. Information is stored in page->private. Now, PG_reserved is used for many purpose and we cannot find why it is reserved easily. I'm now thinking of distinguishing a) Memory Hole b) isolated by MCA c) Reserved by drivers d) others ,which are all "Reserved". Further more investigation will be needed. By the way there are two way to isolate pages, (i) set PG_reserved (ii) allocate and never free. Using (i) and setting page->private correctly looks clearer way and wiil help memory-hotplug (and other stuffs). Signed-off-by: KAMEZAWA Hiroyuki --- linux-2.6.12-rc2-mm3-kamezawa/include/linux/mm.h | 31 +++++++++++++++++++++++ 1 files changed, 31 insertions(+) diff -puN include/linux/mm.h~name_reserved include/linux/mm.h --- linux-2.6.12-rc2-mm3/include/linux/mm.h~name_reserved 2005-04-28 15:11:23.000000000 +0900 +++ linux-2.6.12-rc2-mm3-kamezawa/include/linux/mm.h 2005-04-28 16:28:41.000000000 +0900 @@ -353,6 +353,37 @@ static inline void put_page(struct page #endif /* CONFIG_HUGETLB_PAGE */ /* + * types of pages + * value range is 0-255. + */ +enum page_type { + page_common = 0, + reserved_unknown = 1, + reserved_at_boot, + max_reserved_types, + invalid_page_type = 0xff, +}; + +/* + * Basically, page->private has no meaning without PG_private. + * Here, we use page->private for PG_reserved pages to record a type of a page. + * Because a page is reserved, anyone will not modify page->private. + * When it is freed, page->private will be overwritten by some code. + */ +static inline void set_page_reserved(struct page *page, enum page_type type) +{ + SetPageReserved(page); + page->private = (unsigned long)type; +} + +static inline unsigned char reserved_page_type(struct page *page) +{ + if (!PageReserved(page)) + return 0; + return (unsigned char) page->private; +} + +/* * Multiple processes may "see" the same page. E.g. for untouched * mappings of /dev/null, all processes see the same page full of * zeroes, and text pages of executables and shared libraries have _