All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
@ 2016-02-04  7:08 ` Naoya Horiguchi
  0 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
is inconvenient when grasping how free pages are distributed. This patch
sets KPF_BUDDY for such pages.

With this patch:

  $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
  MemFree:         3134992 kB
               flags      page-count       MB  symbolic-flags                     long-symbolic-flags
  0x0000000000000400          779272     3044  __________B_______________________________ buddy
  0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
               total          783657     3061

783657 pages is 3134628 kB (roughly consistent with the global counter,)
so it's OK.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 fs/proc/page.c             | 2 ++
 include/linux/page-flags.h | 2 ++
 mm/internal.h              | 3 ---
 mm/page_alloc.c            | 2 --
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
index b2855ee..42998bb 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
@@ -148,6 +148,8 @@ u64 stable_page_flags(struct page *page)
 	 */
 	if (PageBuddy(page))
 		u |= 1 << KPF_BUDDY;
+	else if (page_count(page) == 0 && is_free_buddy_page(page))
+		u |= 1 << KPF_BUDDY;
 
 	if (PageBalloon(page))
 		u |= 1 << KPF_BALLOON;
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/include/linux/page-flags.h v4.5-rc2-mmotm-2016-02-02-17-08_patched/include/linux/page-flags.h
index 19724e6..5976955 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/include/linux/page-flags.h
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/include/linux/page-flags.h
@@ -593,6 +593,8 @@ static inline void __ClearPageBuddy(struct page *page)
 	atomic_set(&page->_mapcount, -1);
 }
 
+extern bool is_free_buddy_page(struct page *page);
+
 #define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
 
 static inline int PageBalloon(struct page *page)
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/mm/internal.h v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/internal.h
index 271ad95..06071af 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/mm/internal.h
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/internal.h
@@ -145,9 +145,6 @@ extern int __isolate_free_page(struct page *page, unsigned int order);
 extern void __free_pages_bootmem(struct page *page, unsigned long pfn,
 					unsigned int order);
 extern void prep_compound_page(struct page *page, unsigned int order);
-#ifdef CONFIG_MEMORY_FAILURE
-extern bool is_free_buddy_page(struct page *page);
-#endif
 extern int user_min_free_kbytes;
 
 #if defined CONFIG_COMPACTION || defined CONFIG_CMA
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/mm/page_alloc.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/page_alloc.c
index 555b9d2..d9c8b70 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/mm/page_alloc.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/page_alloc.c
@@ -7182,7 +7182,6 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
 }
 #endif
 
-#ifdef CONFIG_MEMORY_FAILURE
 bool is_free_buddy_page(struct page *page)
 {
 	struct zone *zone = page_zone(page);
@@ -7201,4 +7200,3 @@ bool is_free_buddy_page(struct page *page)
 
 	return order < MAX_ORDER;
 }
-#endif
-- 
2.7.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
@ 2016-02-04  7:08 ` Naoya Horiguchi
  0 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
is inconvenient when grasping how free pages are distributed. This patch
sets KPF_BUDDY for such pages.

With this patch:

  $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
  MemFree:         3134992 kB
               flags      page-count       MB  symbolic-flags                     long-symbolic-flags
  0x0000000000000400          779272     3044  __________B_______________________________ buddy
  0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
               total          783657     3061

783657 pages is 3134628 kB (roughly consistent with the global counter,)
so it's OK.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 fs/proc/page.c             | 2 ++
 include/linux/page-flags.h | 2 ++
 mm/internal.h              | 3 ---
 mm/page_alloc.c            | 2 --
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
index b2855ee..42998bb 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
@@ -148,6 +148,8 @@ u64 stable_page_flags(struct page *page)
 	 */
 	if (PageBuddy(page))
 		u |= 1 << KPF_BUDDY;
+	else if (page_count(page) == 0 && is_free_buddy_page(page))
+		u |= 1 << KPF_BUDDY;
 
 	if (PageBalloon(page))
 		u |= 1 << KPF_BALLOON;
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/include/linux/page-flags.h v4.5-rc2-mmotm-2016-02-02-17-08_patched/include/linux/page-flags.h
index 19724e6..5976955 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/include/linux/page-flags.h
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/include/linux/page-flags.h
@@ -593,6 +593,8 @@ static inline void __ClearPageBuddy(struct page *page)
 	atomic_set(&page->_mapcount, -1);
 }
 
+extern bool is_free_buddy_page(struct page *page);
+
 #define PAGE_BALLOON_MAPCOUNT_VALUE (-256)
 
 static inline int PageBalloon(struct page *page)
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/mm/internal.h v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/internal.h
index 271ad95..06071af 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/mm/internal.h
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/internal.h
@@ -145,9 +145,6 @@ extern int __isolate_free_page(struct page *page, unsigned int order);
 extern void __free_pages_bootmem(struct page *page, unsigned long pfn,
 					unsigned int order);
 extern void prep_compound_page(struct page *page, unsigned int order);
-#ifdef CONFIG_MEMORY_FAILURE
-extern bool is_free_buddy_page(struct page *page);
-#endif
 extern int user_min_free_kbytes;
 
 #if defined CONFIG_COMPACTION || defined CONFIG_CMA
diff --git v4.5-rc2-mmotm-2016-02-02-17-08/mm/page_alloc.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/page_alloc.c
index 555b9d2..d9c8b70 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/mm/page_alloc.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/mm/page_alloc.c
@@ -7182,7 +7182,6 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
 }
 #endif
 
-#ifdef CONFIG_MEMORY_FAILURE
 bool is_free_buddy_page(struct page *page)
 {
 	struct zone *zone = page_zone(page);
@@ -7201,4 +7200,3 @@ bool is_free_buddy_page(struct page *page)
 
 	return order < MAX_ORDER;
 }
-#endif
-- 
2.7.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 2/3] /proc/kpageflags: return KPF_SLAB for slab tail pages
  2016-02-04  7:08 ` Naoya Horiguchi
@ 2016-02-04  7:08   ` Naoya Horiguchi
  -1 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

Currently /proc/kpageflags returns just KPF_COMPOUND_TAIL for slab tail pages,
which is inconvenient when grasping how slab pages are distributed (userspace
always needs to check which kind of tail pages by itself). This patch sets
KPF_SLAB for such pages.

With this patch:

  $ grep Slab /proc/meminfo ; tools/vm/page-types -b slab
  Slab:              64880 kB
               flags      page-count       MB  symbolic-flags                     long-symbolic-flags
  0x0000000000000080           16220       63  _______S__________________________________ slab
               total           16220       63

16220 pages equals to 64880 kB, so returned result is consistent with the
global counter.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 fs/proc/page.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
index 42998bb..40a4685 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
@@ -160,6 +160,8 @@ u64 stable_page_flags(struct page *page)
 	u |= kpf_copy_bit(k, KPF_LOCKED,	PG_locked);
 
 	u |= kpf_copy_bit(k, KPF_SLAB,		PG_slab);
+	if (PageTail(page) && PageSlab(compound_head(page)))
+		u |= 1 << KPF_SLAB;
 
 	u |= kpf_copy_bit(k, KPF_ERROR,		PG_error);
 	u |= kpf_copy_bit(k, KPF_DIRTY,		PG_dirty);
-- 
2.7.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 2/3] /proc/kpageflags: return KPF_SLAB for slab tail pages
@ 2016-02-04  7:08   ` Naoya Horiguchi
  0 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

Currently /proc/kpageflags returns just KPF_COMPOUND_TAIL for slab tail pages,
which is inconvenient when grasping how slab pages are distributed (userspace
always needs to check which kind of tail pages by itself). This patch sets
KPF_SLAB for such pages.

With this patch:

  $ grep Slab /proc/meminfo ; tools/vm/page-types -b slab
  Slab:              64880 kB
               flags      page-count       MB  symbolic-flags                     long-symbolic-flags
  0x0000000000000080           16220       63  _______S__________________________________ slab
               total           16220       63

16220 pages equals to 64880 kB, so returned result is consistent with the
global counter.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 fs/proc/page.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
index 42998bb..40a4685 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/fs/proc/page.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/fs/proc/page.c
@@ -160,6 +160,8 @@ u64 stable_page_flags(struct page *page)
 	u |= kpf_copy_bit(k, KPF_LOCKED,	PG_locked);
 
 	u |= kpf_copy_bit(k, KPF_SLAB,		PG_slab);
+	if (PageTail(page) && PageSlab(compound_head(page)))
+		u |= 1 << KPF_SLAB;
 
 	u |= kpf_copy_bit(k, KPF_ERROR,		PG_error);
 	u |= kpf_copy_bit(k, KPF_DIRTY,		PG_dirty);
-- 
2.7.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 3/3] tools/vm/page-types.c: support swap entry
  2016-02-04  7:08 ` Naoya Horiguchi
@ 2016-02-04  7:08   ` Naoya Horiguchi
  -1 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

/proc/pid/pagemap (pte_to_pagemap_entry() internally) already reports about
swap entry, so let's make the in-kernel utility aware of it.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 tools/vm/page-types.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/tools/vm/page-types.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/tools/vm/page-types.c
index 5a60162..ec62ab4 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/tools/vm/page-types.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/tools/vm/page-types.c
@@ -61,6 +61,8 @@
 #define PM_PFRAME_BITS		55
 #define PM_PFRAME_MASK		((1LL << PM_PFRAME_BITS) - 1)
 #define PM_PFRAME(x)		((x) & PM_PFRAME_MASK)
+#define MAX_SWAPFILES_SHIFT	5
+#define PM_SWAP_OFFSET(x)	(((x) & PM_PFRAME_MASK) >> MAX_SWAPFILES_SHIFT)
 #define PM_SOFT_DIRTY		(1ULL << 55)
 #define PM_MMAP_EXCLUSIVE	(1ULL << 56)
 #define PM_FILE			(1ULL << 61)
@@ -92,7 +94,8 @@
 #define KPF_SLOB_FREE		49
 #define KPF_SLUB_FROZEN		50
 #define KPF_SLUB_DEBUG		51
-#define KPF_FILE		62
+#define KPF_FILE		61
+#define KPF_SWAP		62
 #define KPF_MMAP_EXCLUSIVE	63
 
 #define KPF_ALL_BITS		((uint64_t)~0ULL)
@@ -146,6 +149,7 @@ static const char * const page_flag_names[] = {
 	[KPF_SLUB_DEBUG]	= "E:slub_debug",
 
 	[KPF_FILE]		= "F:file",
+	[KPF_SWAP]		= "w:swap",
 	[KPF_MMAP_EXCLUSIVE]	= "1:mmap_exclusive",
 };
 
@@ -297,6 +301,10 @@ static unsigned long pagemap_pfn(uint64_t val)
 	return pfn;
 }
 
+static unsigned long pagemap_swap_offset(uint64_t val)
+{
+	return val & PM_SWAP ? PM_SWAP_OFFSET(val) : 0;
+}
 
 /*
  * page flag names
@@ -452,6 +460,8 @@ static uint64_t expand_overloaded_flags(uint64_t flags, uint64_t pme)
 		flags |= BIT(SOFTDIRTY);
 	if (pme & PM_FILE)
 		flags |= BIT(FILE);
+	if (pme & PM_SWAP)
+		flags |= BIT(SWAP);
 	if (pme & PM_MMAP_EXCLUSIVE)
 		flags |= BIT(MMAP_EXCLUSIVE);
 
@@ -613,6 +623,22 @@ static void walk_pfn(unsigned long voffset,
 	}
 }
 
+static void walk_swap(unsigned long voffset, uint64_t pme)
+{
+	uint64_t flags = kpageflags_flags(0, pme);
+
+	if (!bit_mask_ok(flags))
+		return;
+
+	if (opt_list == 1)
+		show_page_range(voffset, pagemap_swap_offset(pme), 1, flags);
+	else if (opt_list == 2)
+		show_page(voffset, pagemap_swap_offset(pme), flags);
+
+	nr_pages[hash_slot(flags)]++;
+	total_pages++;
+}
+
 #define PAGEMAP_BATCH	(64 << 10)
 static void walk_vma(unsigned long index, unsigned long count)
 {
@@ -632,6 +658,8 @@ static void walk_vma(unsigned long index, unsigned long count)
 			pfn = pagemap_pfn(buf[i]);
 			if (pfn)
 				walk_pfn(index + i, pfn, 1, buf[i]);
+			if (buf[i] & PM_SWAP)
+				walk_swap(index + i, buf[i]);
 		}
 
 		index += pages;
-- 
2.7.0

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v1 3/3] tools/vm/page-types.c: support swap entry
@ 2016-02-04  7:08   ` Naoya Horiguchi
  0 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04  7:08 UTC (permalink / raw)
  To: Andrew Morton
  Cc: Vladimir Davydov, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi, Naoya Horiguchi

/proc/pid/pagemap (pte_to_pagemap_entry() internally) already reports about
swap entry, so let's make the in-kernel utility aware of it.

Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
---
 tools/vm/page-types.c | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git v4.5-rc2-mmotm-2016-02-02-17-08/tools/vm/page-types.c v4.5-rc2-mmotm-2016-02-02-17-08_patched/tools/vm/page-types.c
index 5a60162..ec62ab4 100644
--- v4.5-rc2-mmotm-2016-02-02-17-08/tools/vm/page-types.c
+++ v4.5-rc2-mmotm-2016-02-02-17-08_patched/tools/vm/page-types.c
@@ -61,6 +61,8 @@
 #define PM_PFRAME_BITS		55
 #define PM_PFRAME_MASK		((1LL << PM_PFRAME_BITS) - 1)
 #define PM_PFRAME(x)		((x) & PM_PFRAME_MASK)
+#define MAX_SWAPFILES_SHIFT	5
+#define PM_SWAP_OFFSET(x)	(((x) & PM_PFRAME_MASK) >> MAX_SWAPFILES_SHIFT)
 #define PM_SOFT_DIRTY		(1ULL << 55)
 #define PM_MMAP_EXCLUSIVE	(1ULL << 56)
 #define PM_FILE			(1ULL << 61)
@@ -92,7 +94,8 @@
 #define KPF_SLOB_FREE		49
 #define KPF_SLUB_FROZEN		50
 #define KPF_SLUB_DEBUG		51
-#define KPF_FILE		62
+#define KPF_FILE		61
+#define KPF_SWAP		62
 #define KPF_MMAP_EXCLUSIVE	63
 
 #define KPF_ALL_BITS		((uint64_t)~0ULL)
@@ -146,6 +149,7 @@ static const char * const page_flag_names[] = {
 	[KPF_SLUB_DEBUG]	= "E:slub_debug",
 
 	[KPF_FILE]		= "F:file",
+	[KPF_SWAP]		= "w:swap",
 	[KPF_MMAP_EXCLUSIVE]	= "1:mmap_exclusive",
 };
 
@@ -297,6 +301,10 @@ static unsigned long pagemap_pfn(uint64_t val)
 	return pfn;
 }
 
+static unsigned long pagemap_swap_offset(uint64_t val)
+{
+	return val & PM_SWAP ? PM_SWAP_OFFSET(val) : 0;
+}
 
 /*
  * page flag names
@@ -452,6 +460,8 @@ static uint64_t expand_overloaded_flags(uint64_t flags, uint64_t pme)
 		flags |= BIT(SOFTDIRTY);
 	if (pme & PM_FILE)
 		flags |= BIT(FILE);
+	if (pme & PM_SWAP)
+		flags |= BIT(SWAP);
 	if (pme & PM_MMAP_EXCLUSIVE)
 		flags |= BIT(MMAP_EXCLUSIVE);
 
@@ -613,6 +623,22 @@ static void walk_pfn(unsigned long voffset,
 	}
 }
 
+static void walk_swap(unsigned long voffset, uint64_t pme)
+{
+	uint64_t flags = kpageflags_flags(0, pme);
+
+	if (!bit_mask_ok(flags))
+		return;
+
+	if (opt_list == 1)
+		show_page_range(voffset, pagemap_swap_offset(pme), 1, flags);
+	else if (opt_list == 2)
+		show_page(voffset, pagemap_swap_offset(pme), flags);
+
+	nr_pages[hash_slot(flags)]++;
+	total_pages++;
+}
+
 #define PAGEMAP_BATCH	(64 << 10)
 static void walk_vma(unsigned long index, unsigned long count)
 {
@@ -632,6 +658,8 @@ static void walk_vma(unsigned long index, unsigned long count)
 			pfn = pagemap_pfn(buf[i]);
 			if (pfn)
 				walk_pfn(index + i, pfn, 1, buf[i]);
+			if (buf[i] & PM_SWAP)
+				walk_swap(index + i, buf[i]);
 		}
 
 		index += pages;
-- 
2.7.0

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
  2016-02-04  7:08 ` Naoya Horiguchi
@ 2016-02-04 16:42   ` Vladimir Davydov
  -1 siblings, 0 replies; 12+ messages in thread
From: Vladimir Davydov @ 2016-02-04 16:42 UTC (permalink / raw)
  To: Naoya Horiguchi
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 04:08:01PM +0900, Naoya Horiguchi wrote:
> Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
> is inconvenient when grasping how free pages are distributed. This patch
> sets KPF_BUDDY for such pages.

Looks reasonable to me,

Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

> 
> With this patch:
> 
>   $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
>   MemFree:         3134992 kB
>                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
>   0x0000000000000400          779272     3044  __________B_______________________________ buddy
>   0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
>                total          783657     3061

Why are buddy pages reported as mmapped? That looks weird. Shouldn't we
fix it? Something like this, may be?
--
From: Vladimir Davydov <vdavydov@virtuozzo.com>
Subject: [PATCH] proc: kpageflags: do not report buddy and balloon pages as
 mapped

PageBuddy and PageBalloon are not usual page flags - they are identified
by a special negative (so as not to confuse with mapped pages) value of
page->_mapcount. Since /proc/kpageflags uses page_mapcount helper to
check if a page is mapped, it reports pages of these kinds as being
mapped, which is confusing. Fix that by replacing page_mapcount with
page_mapped.

Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>

diff --git a/fs/proc/page.c b/fs/proc/page.c
index b2855eea5405..332450d87ea4 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -105,7 +105,7 @@ u64 stable_page_flags(struct page *page)
 	 * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the
 	 * simple test in page_mapcount() is not enough.
 	 */
-	if (!PageSlab(page) && page_mapcount(page))
+	if (!PageSlab(page) && page_mapped(page))
 		u |= 1 << KPF_MMAP;
 	if (PageAnon(page))
 		u |= 1 << KPF_ANON;

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
@ 2016-02-04 16:42   ` Vladimir Davydov
  0 siblings, 0 replies; 12+ messages in thread
From: Vladimir Davydov @ 2016-02-04 16:42 UTC (permalink / raw)
  To: Naoya Horiguchi
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 04:08:01PM +0900, Naoya Horiguchi wrote:
> Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
> is inconvenient when grasping how free pages are distributed. This patch
> sets KPF_BUDDY for such pages.

Looks reasonable to me,

Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

> 
> With this patch:
> 
>   $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
>   MemFree:         3134992 kB
>                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
>   0x0000000000000400          779272     3044  __________B_______________________________ buddy
>   0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
>                total          783657     3061

Why are buddy pages reported as mmapped? That looks weird. Shouldn't we
fix it? Something like this, may be?
--
From: Vladimir Davydov <vdavydov@virtuozzo.com>
Subject: [PATCH] proc: kpageflags: do not report buddy and balloon pages as
 mapped

PageBuddy and PageBalloon are not usual page flags - they are identified
by a special negative (so as not to confuse with mapped pages) value of
page->_mapcount. Since /proc/kpageflags uses page_mapcount helper to
check if a page is mapped, it reports pages of these kinds as being
mapped, which is confusing. Fix that by replacing page_mapcount with
page_mapped.

Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>

diff --git a/fs/proc/page.c b/fs/proc/page.c
index b2855eea5405..332450d87ea4 100644
--- a/fs/proc/page.c
+++ b/fs/proc/page.c
@@ -105,7 +105,7 @@ u64 stable_page_flags(struct page *page)
 	 * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the
 	 * simple test in page_mapcount() is not enough.
 	 */
-	if (!PageSlab(page) && page_mapcount(page))
+	if (!PageSlab(page) && page_mapped(page))
 		u |= 1 << KPF_MMAP;
 	if (PageAnon(page))
 		u |= 1 << KPF_ANON;

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 2/3] /proc/kpageflags: return KPF_SLAB for slab tail pages
  2016-02-04  7:08   ` Naoya Horiguchi
@ 2016-02-04 16:43     ` Vladimir Davydov
  -1 siblings, 0 replies; 12+ messages in thread
From: Vladimir Davydov @ 2016-02-04 16:43 UTC (permalink / raw)
  To: Naoya Horiguchi
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 04:08:02PM +0900, Naoya Horiguchi wrote:
> Currently /proc/kpageflags returns just KPF_COMPOUND_TAIL for slab tail pages,
> which is inconvenient when grasping how slab pages are distributed (userspace
> always needs to check which kind of tail pages by itself). This patch sets
> KPF_SLAB for such pages.
> 
> With this patch:
> 
>   $ grep Slab /proc/meminfo ; tools/vm/page-types -b slab
>   Slab:              64880 kB
>                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
>   0x0000000000000080           16220       63  _______S__________________________________ slab
>                total           16220       63
> 
> 16220 pages equals to 64880 kB, so returned result is consistent with the
> global counter.
> 
> Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 2/3] /proc/kpageflags: return KPF_SLAB for slab tail pages
@ 2016-02-04 16:43     ` Vladimir Davydov
  0 siblings, 0 replies; 12+ messages in thread
From: Vladimir Davydov @ 2016-02-04 16:43 UTC (permalink / raw)
  To: Naoya Horiguchi
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 04:08:02PM +0900, Naoya Horiguchi wrote:
> Currently /proc/kpageflags returns just KPF_COMPOUND_TAIL for slab tail pages,
> which is inconvenient when grasping how slab pages are distributed (userspace
> always needs to check which kind of tail pages by itself). This patch sets
> KPF_SLAB for such pages.
> 
> With this patch:
> 
>   $ grep Slab /proc/meminfo ; tools/vm/page-types -b slab
>   Slab:              64880 kB
>                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
>   0x0000000000000080           16220       63  _______S__________________________________ slab
>                total           16220       63
> 
> 16220 pages equals to 64880 kB, so returned result is consistent with the
> global counter.
> 
> Signed-off-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
  2016-02-04 16:42   ` Vladimir Davydov
@ 2016-02-04 23:29     ` Naoya Horiguchi
  -1 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04 23:29 UTC (permalink / raw)
  To: Vladimir Davydov
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 07:42:26PM +0300, Vladimir Davydov wrote:
> On Thu, Feb 04, 2016 at 04:08:01PM +0900, Naoya Horiguchi wrote:
> > Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
> > is inconvenient when grasping how free pages are distributed. This patch
> > sets KPF_BUDDY for such pages.
> 
> Looks reasonable to me,
> 
> Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

Thank you.

> > 
> > With this patch:
> > 
> >   $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
> >   MemFree:         3134992 kB
> >                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
> >   0x0000000000000400          779272     3044  __________B_______________________________ buddy
> >   0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
> >                total          783657     3061
> 
> Why are buddy pages reported as mmapped? That looks weird. Shouldn't we
> fix it? Something like this, may be?
> 
> --
> From: Vladimir Davydov <vdavydov@virtuozzo.com>
> Subject: [PATCH] proc: kpageflags: do not report buddy and balloon pages as
>  mapped
> 
> PageBuddy and PageBalloon are not usual page flags - they are identified
> by a special negative (so as not to confuse with mapped pages) value of
> page->_mapcount. Since /proc/kpageflags uses page_mapcount helper to
> check if a page is mapped, it reports pages of these kinds as being
> mapped, which is confusing. Fix that by replacing page_mapcount with
> page_mapped.
> 
> Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>
> 
> diff --git a/fs/proc/page.c b/fs/proc/page.c
> index b2855eea5405..332450d87ea4 100644
> --- a/fs/proc/page.c
> +++ b/fs/proc/page.c
> @@ -105,7 +105,7 @@ u64 stable_page_flags(struct page *page)
>  	 * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the
>  	 * simple test in page_mapcount() is not enough.

We can do s/page_mapcount/page_mapped/ for this line too.

>  	 */
> -	if (!PageSlab(page) && page_mapcount(page))
> +	if (!PageSlab(page) && page_mapped(page))

Look good to me.

Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

>  		u |= 1 << KPF_MMAP;
>  	if (PageAnon(page))
>  		u |= 1 << KPF_ANON;

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages
@ 2016-02-04 23:29     ` Naoya Horiguchi
  0 siblings, 0 replies; 12+ messages in thread
From: Naoya Horiguchi @ 2016-02-04 23:29 UTC (permalink / raw)
  To: Vladimir Davydov
  Cc: Andrew Morton, Konstantin Khlebnikov, linux-mm, linux-kernel,
	Naoya Horiguchi

On Thu, Feb 04, 2016 at 07:42:26PM +0300, Vladimir Davydov wrote:
> On Thu, Feb 04, 2016 at 04:08:01PM +0900, Naoya Horiguchi wrote:
> > Currently /proc/kpageflags returns nothing for "tail" buddy pages, which
> > is inconvenient when grasping how free pages are distributed. This patch
> > sets KPF_BUDDY for such pages.
> 
> Looks reasonable to me,
> 
> Reviewed-by: Vladimir Davydov <vdavydov@virtuozzo.com>

Thank you.

> > 
> > With this patch:
> > 
> >   $ grep MemFree /proc/meminfo ; tools/vm/page-types -b buddy
> >   MemFree:         3134992 kB
> >                flags      page-count       MB  symbolic-flags                     long-symbolic-flags
> >   0x0000000000000400          779272     3044  __________B_______________________________ buddy
> >   0x0000000000000c00            4385       17  __________BM______________________________ buddy,mmap
> >                total          783657     3061
> 
> Why are buddy pages reported as mmapped? That looks weird. Shouldn't we
> fix it? Something like this, may be?
> 
> --
> From: Vladimir Davydov <vdavydov@virtuozzo.com>
> Subject: [PATCH] proc: kpageflags: do not report buddy and balloon pages as
>  mapped
> 
> PageBuddy and PageBalloon are not usual page flags - they are identified
> by a special negative (so as not to confuse with mapped pages) value of
> page->_mapcount. Since /proc/kpageflags uses page_mapcount helper to
> check if a page is mapped, it reports pages of these kinds as being
> mapped, which is confusing. Fix that by replacing page_mapcount with
> page_mapped.
> 
> Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>
> 
> diff --git a/fs/proc/page.c b/fs/proc/page.c
> index b2855eea5405..332450d87ea4 100644
> --- a/fs/proc/page.c
> +++ b/fs/proc/page.c
> @@ -105,7 +105,7 @@ u64 stable_page_flags(struct page *page)
>  	 * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the
>  	 * simple test in page_mapcount() is not enough.

We can do s/page_mapcount/page_mapped/ for this line too.

>  	 */
> -	if (!PageSlab(page) && page_mapcount(page))
> +	if (!PageSlab(page) && page_mapped(page))

Look good to me.

Acked-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>

>  		u |= 1 << KPF_MMAP;
>  	if (PageAnon(page))
>  		u |= 1 << KPF_ANON;
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-02-04 23:29 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-04  7:08 [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages Naoya Horiguchi
2016-02-04  7:08 ` Naoya Horiguchi
2016-02-04  7:08 ` [PATCH v1 2/3] /proc/kpageflags: return KPF_SLAB for slab tail pages Naoya Horiguchi
2016-02-04  7:08   ` Naoya Horiguchi
2016-02-04 16:43   ` Vladimir Davydov
2016-02-04 16:43     ` Vladimir Davydov
2016-02-04  7:08 ` [PATCH v1 3/3] tools/vm/page-types.c: support swap entry Naoya Horiguchi
2016-02-04  7:08   ` Naoya Horiguchi
2016-02-04 16:42 ` [PATCH v1 1/3] /proc/kpageflags: return KPF_BUDDY for "tail" buddy pages Vladimir Davydov
2016-02-04 16:42   ` Vladimir Davydov
2016-02-04 23:29   ` Naoya Horiguchi
2016-02-04 23:29     ` Naoya Horiguchi

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.