* [RFC] [PATCH] naming reserved pages and remove PG_uncached [1/3]
2005-04-28 8:16 [RFC] [PATCH] naming reserved pages and remove PG_uncached [0/3] KAMEZAWA Hiroyuki
@ 2005-04-28 8:19 ` KAMEZAWA Hiroyuki
2005-04-28 8:20 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [2/3] KAMEZAWA Hiroyuki
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: KAMEZAWA Hiroyuki @ 2005-04-28 8:19 UTC (permalink / raw)
To: linux-ia64
[-- Attachment #1: Type: text/plain, Size: 52 bytes --]
inline functions for naming reserved pages.
-- Kame
[-- Attachment #2: name_reserved.patch --]
[-- Type: text/plain, Size: 2111 bytes --]
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 <kamezawa.hiroyu@jp.fujitsu.com>
---
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
_
^ permalink raw reply [flat|nested] 5+ messages in thread* [RFC] [PATCH] naming reserved pages and remove PG_uncached [2/3]
2005-04-28 8:16 [RFC] [PATCH] naming reserved pages and remove PG_uncached [0/3] KAMEZAWA Hiroyuki
2005-04-28 8:19 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [1/3] KAMEZAWA Hiroyuki
@ 2005-04-28 8:20 ` KAMEZAWA Hiroyuki
2005-04-28 8:22 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [3/3] KAMEZAWA Hiroyuki
2005-04-28 8:24 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: KAMEZAWA Hiroyuki @ 2005-04-28 8:20 UTC (permalink / raw)
To: linux-ia64
[-- Attachment #1: Type: text/plain, Size: 29 bytes --]
set reserved_at_boot
-- Kame
[-- Attachment #2: set_rsvd_at_boot.patch --]
[-- Type: text/plain, Size: 832 bytes --]
set reserved_at_boot in page->private at the boot time.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
linux-2.6.12-rc2-mm3-kamezawa/mm/page_alloc.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)
diff -puN mm/page_alloc.c~set_rsvd_at_boot mm/page_alloc.c
--- linux-2.6.12-rc2-mm3/mm/page_alloc.c~set_rsvd_at_boot 2005-04-28 16:28:54.000000000 +0900
+++ linux-2.6.12-rc2-mm3-kamezawa/mm/page_alloc.c 2005-04-28 16:28:54.000000000 +0900
@@ -1641,7 +1641,7 @@ void __init memmap_init_zone(unsigned lo
set_page_links(page, zone, nid);
set_page_count(page, 0);
reset_page_mapcount(page);
- SetPageReserved(page);
+ set_page_reserved(page, reserved_at_boot);
INIT_LIST_HEAD(&page->lru);
#ifdef WANT_PAGE_VIRTUAL
/* The shift won't overflow because ZONE_NORMAL is below 4G. */
_
^ permalink raw reply [flat|nested] 5+ messages in thread
* [RFC] [PATCH] naming reserved pages and remove PG_uncached [3/3]
2005-04-28 8:16 [RFC] [PATCH] naming reserved pages and remove PG_uncached [0/3] KAMEZAWA Hiroyuki
2005-04-28 8:19 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [1/3] KAMEZAWA Hiroyuki
2005-04-28 8:20 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [2/3] KAMEZAWA Hiroyuki
@ 2005-04-28 8:22 ` KAMEZAWA Hiroyuki
2005-04-28 8:24 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: KAMEZAWA Hiroyuki @ 2005-04-28 8:22 UTC (permalink / raw)
To: linux-ia64
[-- Attachment #1: Type: text/plain, Size: 29 bytes --]
removing PG_uncached
-- Kame
[-- Attachment #2: uncached_rsvd_page.patch --]
[-- Type: text/plain, Size: 3353 bytes --]
Now, PG_uncached is used to remember that a page is uncached.
PG_uncached pages is not freed or allocated while it is uncached.
So, PageReserved(page) && ( page->private = reserved_uncached)
can work enough, I think.
Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
---
linux-2.6.12-rc2-mm3-kamezawa/include/asm-ia64/uaccess.h | 4 +-
linux-2.6.12-rc2-mm3-kamezawa/include/linux/mm.h | 21 ++++++++++++---
linux-2.6.12-rc2-mm3-kamezawa/include/linux/page-flags.h | 3 --
3 files changed, 20 insertions(+), 8 deletions(-)
diff -puN include/linux/mm.h~uncached_rsvd_page include/linux/mm.h
--- linux-2.6.12-rc2-mm3/include/linux/mm.h~uncached_rsvd_page 2005-04-28 16:28:58.000000000 +0900
+++ linux-2.6.12-rc2-mm3-kamezawa/include/linux/mm.h 2005-04-28 16:28:58.000000000 +0900
@@ -358,10 +358,11 @@ static inline void put_page(struct page
*/
enum page_type {
page_common = 0,
- reserved_unknown = 1,
- reserved_at_boot,
+ page_reserved_unknown = 1,
+ page_reserved_at_boot,
+ page_reserved_uncached,
max_reserved_types,
- invalid_page_type = 0xff,
+ page_invalid_type = 0xff,
};
/*
@@ -376,6 +377,12 @@ static inline void set_page_reserved(str
page->private = (unsigned long)type;
}
+static inline void clear_page_reserved(struct page *page)
+{
+ page->private = 0;
+ ClearPageReserved(page);
+}
+
static inline unsigned char reserved_page_type(struct page *page)
{
if (!PageReserved(page))
@@ -383,6 +390,14 @@ static inline unsigned char reserved_pag
return (unsigned char) page->private;
}
+#define set_page_uncached(page) \
+ set_page_reserved((page), page_reserved_uncached)
+#define clr_page_uncahced(page)\
+ clear_page_reserved(page);
+#define page_is_uncached(page)\
+ (reserved_page_type(page) == page_reserved_uncached)
+
+
/*
* Multiple processes may "see" the same page. E.g. for untouched
* mappings of /dev/null, all processes see the same page full of
diff -puN include/linux/page-flags.h~uncached_rsvd_page include/linux/page-flags.h
--- linux-2.6.12-rc2-mm3/include/linux/page-flags.h~uncached_rsvd_page 2005-04-28 16:28:58.000000000 +0900
+++ linux-2.6.12-rc2-mm3-kamezawa/include/linux/page-flags.h 2005-04-28 16:28:58.000000000 +0900
@@ -302,9 +302,6 @@ extern void __mod_page_state(unsigned of
#define PageSwapCache(page) 0
#endif
-#define PageUncached(page) test_bit(PG_uncached, &(page)->flags)
-#define SetPageUncached(page) set_bit(PG_uncached, &(page)->flags)
-#define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags)
struct page; /* forward declaration */
diff -puN include/asm-ia64/uaccess.h~uncached_rsvd_page include/asm-ia64/uaccess.h
--- linux-2.6.12-rc2-mm3/include/asm-ia64/uaccess.h~uncached_rsvd_page 2005-04-28 16:28:58.000000000 +0900
+++ linux-2.6.12-rc2-mm3-kamezawa/include/asm-ia64/uaccess.h 2005-04-28 16:28:58.000000000 +0900
@@ -379,7 +379,7 @@ xlate_dev_mem_ptr (unsigned long p)
char * ptr;
page = pfn_to_page(p >> PAGE_SHIFT);
- if (PageUncached(page))
+ if (page_is_uncached(page))
ptr = (char *)p + __IA64_UNCACHED_OFFSET;
else
ptr = __va(p);
@@ -397,7 +397,7 @@ xlate_dev_kmem_ptr (char * p)
char * ptr;
page = virt_to_page((unsigned long)p >> PAGE_SHIFT);
- if (PageUncached(page))
+ if (page_is_uncached(page))
ptr = (char *)__pa(p) + __IA64_UNCACHED_OFFSET;
else
ptr = p;
_
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [RFC] [PATCH] naming reserved pages and remove PG_uncached
2005-04-28 8:16 [RFC] [PATCH] naming reserved pages and remove PG_uncached [0/3] KAMEZAWA Hiroyuki
` (2 preceding siblings ...)
2005-04-28 8:22 ` [RFC] [PATCH] naming reserved pages and remove PG_uncached [3/3] KAMEZAWA Hiroyuki
@ 2005-04-28 8:24 ` Andrew Morton
3 siblings, 0 replies; 5+ messages in thread
From: Andrew Morton @ 2005-04-28 8:24 UTC (permalink / raw)
To: linux-ia64
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote:
>
> +#define clr_page_uncahced(page)\
typo there.
Please use "clear_page_uncacheed", not "clr_page_uncached".
Please avoid sending multiple patches under the same Subject:. See
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread