All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20141028131810.GB9768@node.dhcp.inet.fi>

diff --git a/a/1.txt b/N1/1.txt
index 89380c3..2481ed3 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -59,245 +59,3 @@ with pmd to pte cast in smaps_pte_range(). Let's try to get rid of it
 instead.
 
 Could you test the patch below? I think it's a better fix.
-
-From 592a7e789128d92e7f5165b583558443e82c88fd Mon Sep 17 00:00:00 2001
-From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
-Date: Tue, 28 Oct 2014 14:51:31 +0200
-Subject: [PATCH] mm: fix huge zero page accounting in smaps report
-
-As a small zero page, huge zero page should not be accounted in smaps
-report as normal page.
-
-For small pages we rely on vm_normal_page() to filter out zero page, but
-vm_normal_page() is not designed to handle pmds. We only get here due
-hackish cast pmd to pte in smaps_pte_range() -- pte and pmd format is
-not necessary compatible on each and every architecture.
-
-Let's add separate codepath to handle pmds. follow_trans_huge_pmd() will
-detect huge zero page for us.
-
-We would need pmd_dirty() helper to do this properly. The patch adds it
-to THP-enabled architectures which don't yet have one.
-
-Reported-by: Fengguang Wu <fengguang.wu@intel.com>
-Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
----
- arch/arm64/include/asm/pgtable.h         |   1 +
- arch/powerpc/include/asm/pgtable-ppc64.h |   1 +
- arch/sparc/include/asm/pgtable_64.h      |   7 +++
- arch/x86/include/asm/pgtable.h           |   5 ++
- fs/proc/task_mmu.c                       | 101 ++++++++++++++++++++-----------
- 5 files changed, 79 insertions(+), 36 deletions(-)
-
-diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
-index 41a43bf26492..df22314f57cf 100644
---- a/arch/arm64/include/asm/pgtable.h
-+++ b/arch/arm64/include/asm/pgtable.h
-@@ -279,6 +279,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,
- #endif /* CONFIG_HAVE_RCU_TABLE_FREE */
- #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
- 
-+#define pmd_dirty(pmd)		pte_dirty(pmd_pte(pmd))
- #define pmd_young(pmd)		pte_young(pmd_pte(pmd))
- #define pmd_wrprotect(pmd)	pte_pmd(pte_wrprotect(pmd_pte(pmd)))
- #define pmd_mksplitting(pmd)	pte_pmd(pte_mkspecial(pmd_pte(pmd)))
-diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h
-index ae153c40ab7c..9b4b1904efae 100644
---- a/arch/powerpc/include/asm/pgtable-ppc64.h
-+++ b/arch/powerpc/include/asm/pgtable-ppc64.h
-@@ -467,6 +467,7 @@ static inline pte_t *pmdp_ptep(pmd_t *pmd)
- }
- 
- #define pmd_pfn(pmd)		pte_pfn(pmd_pte(pmd))
-+#define pmd_dirty(pmd)		pte_dirty(pmd_pte(pmd))
- #define pmd_young(pmd)		pte_young(pmd_pte(pmd))
- #define pmd_mkold(pmd)		pte_pmd(pte_mkold(pmd_pte(pmd)))
- #define pmd_wrprotect(pmd)	pte_pmd(pte_wrprotect(pmd_pte(pmd)))
-diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h
-index bfeb626085ac..90af17ee6184 100644
---- a/arch/sparc/include/asm/pgtable_64.h
-+++ b/arch/sparc/include/asm/pgtable_64.h
-@@ -667,6 +667,13 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
- }
- 
- #ifdef CONFIG_TRANSPARENT_HUGEPAGE
-+static inline pmd_t pmd_dirty(pmd_t pmd)
-+{
-+	pte_t pte = __pte(pmd_val(pmd));
-+
-+	return pte_dirty(pte);
-+}
-+
- static inline unsigned long pmd_young(pmd_t pmd)
- {
- 	pte_t pte = __pte(pmd_val(pmd));
-diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
-index aa97a070f09f..081d6f45e006 100644
---- a/arch/x86/include/asm/pgtable.h
-+++ b/arch/x86/include/asm/pgtable.h
-@@ -99,6 +99,11 @@ static inline int pte_young(pte_t pte)
- 	return pte_flags(pte) & _PAGE_ACCESSED;
- }
- 
-+static inline int pmd_dirty(pmd_t pmd)
-+{
-+	return pmd_flags(pmd) & _PAGE_DIRTY;
-+}
-+
- static inline int pmd_young(pmd_t pmd)
- {
- 	return pmd_flags(pmd) & _PAGE_ACCESSED;
-diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
-index 4e0388cffe3d..2ab200d429be 100644
---- a/fs/proc/task_mmu.c
-+++ b/fs/proc/task_mmu.c
-@@ -447,58 +447,88 @@ struct mem_size_stats {
- 	u64 pss;
- };
- 
-+static void smaps_account(struct mem_size_stats *mss, struct page *page,
-+		unsigned long size, bool young, bool dirty)
-+{
-+	int mapcount;
-+
-+	if (PageAnon(page))
-+		mss->anonymous += size;
- 
--static void smaps_pte_entry(pte_t ptent, unsigned long addr,
--		unsigned long ptent_size, struct mm_walk *walk)
-+	mss->resident += size;
-+	/* Accumulate the size in pages that have been accessed. */
-+	if (young || PageReferenced(page))
-+		mss->referenced += size;
-+	mapcount = page_mapcount(page);
-+	if (mapcount >= 2) {
-+		if (dirty || PageDirty(page))
-+			mss->shared_dirty += size;
-+		else
-+			mss->shared_clean += size;
-+		mss->pss += (size << PSS_SHIFT) / mapcount;
-+	} else {
-+		if (dirty || PageDirty(page))
-+			mss->private_dirty += size;
-+		else
-+			mss->private_clean += size;
-+		mss->pss += (size << PSS_SHIFT);
-+	}
-+}
-+
-+
-+static void smaps_pte_entry(pte_t *pte, unsigned long addr,
-+		struct mm_walk *walk)
- {
- 	struct mem_size_stats *mss = walk->private;
- 	struct vm_area_struct *vma = mss->vma;
- 	pgoff_t pgoff = linear_page_index(vma, addr);
- 	struct page *page = NULL;
--	int mapcount;
- 
--	if (pte_present(ptent)) {
--		page = vm_normal_page(vma, addr, ptent);
--	} else if (is_swap_pte(ptent)) {
--		swp_entry_t swpent = pte_to_swp_entry(ptent);
-+	if (pte_present(*pte)) {
-+		page = vm_normal_page(vma, addr, *pte);
-+	} else if (is_swap_pte(*pte)) {
-+		swp_entry_t swpent = pte_to_swp_entry(*pte);
- 
- 		if (!non_swap_entry(swpent))
--			mss->swap += ptent_size;
-+			mss->swap += PAGE_SIZE;
- 		else if (is_migration_entry(swpent))
- 			page = migration_entry_to_page(swpent);
--	} else if (pte_file(ptent)) {
--		if (pte_to_pgoff(ptent) != pgoff)
--			mss->nonlinear += ptent_size;
-+	} else if (pte_file(*pte)) {
-+		if (pte_to_pgoff(*pte) != pgoff)
-+			mss->nonlinear += PAGE_SIZE;
- 	}
- 
- 	if (!page)
- 		return;
- 
--	if (PageAnon(page))
--		mss->anonymous += ptent_size;
--
- 	if (page->index != pgoff)
--		mss->nonlinear += ptent_size;
-+		mss->nonlinear += PAGE_SIZE;
- 
--	mss->resident += ptent_size;
--	/* Accumulate the size in pages that have been accessed. */
--	if (pte_young(ptent) || PageReferenced(page))
--		mss->referenced += ptent_size;
--	mapcount = page_mapcount(page);
--	if (mapcount >= 2) {
--		if (pte_dirty(ptent) || PageDirty(page))
--			mss->shared_dirty += ptent_size;
--		else
--			mss->shared_clean += ptent_size;
--		mss->pss += (ptent_size << PSS_SHIFT) / mapcount;
--	} else {
--		if (pte_dirty(ptent) || PageDirty(page))
--			mss->private_dirty += ptent_size;
--		else
--			mss->private_clean += ptent_size;
--		mss->pss += (ptent_size << PSS_SHIFT);
--	}
-+	smaps_account(mss, page, PAGE_SIZE, pte_young(*pte), pte_dirty(*pte));
-+}
-+
-+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-+static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
-+		struct mm_walk *walk)
-+{
-+	struct mem_size_stats *mss = walk->private;
-+	struct vm_area_struct *vma = mss->vma;
-+	struct page *page;
-+
-+	/* FOLL_DUMP will return -EFAULT on huge zero page */
-+	page = follow_trans_huge_pmd(vma, addr, pmd, FOLL_DUMP);
-+	if (IS_ERR_OR_NULL(page))
-+		return;
-+	mss->anonymous_thp += HPAGE_PMD_SIZE;
-+	smaps_account(mss, page, HPAGE_PMD_SIZE,
-+			pmd_young(*pmd), pmd_dirty(*pmd));
- }
-+#else
-+static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
-+		struct mm_walk *walk)
-+{
-+}
-+#endif
- 
- static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
- 			   struct mm_walk *walk)
-@@ -509,9 +539,8 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
- 	spinlock_t *ptl;
- 
- 	if (pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {
--		smaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk);
-+		smaps_pmd_entry(pmd, addr, walk);
- 		spin_unlock(ptl);
--		mss->anonymous_thp += HPAGE_PMD_SIZE;
- 		return 0;
- 	}
- 
-@@ -524,7 +553,7 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
- 	 */
- 	pte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);
- 	for (; addr != end; pte++, addr += PAGE_SIZE)
--		smaps_pte_entry(*pte, addr, PAGE_SIZE, walk);
-+		smaps_pte_entry(pte, addr, walk);
- 	pte_unmap_unlock(pte - 1, ptl);
- 	cond_resched();
- 	return 0;
--- 
- Kirill A. Shutemov
-
---
-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>
diff --git a/a/content_digest b/N1/content_digest
index f83e26c..0902bdf 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -82,248 +82,6 @@
  "with pmd to pte cast in smaps_pte_range(). Let's try to get rid of it\n"
  "instead.\n"
  "\n"
- "Could you test the patch below? I think it's a better fix.\n"
- "\n"
- "From 592a7e789128d92e7f5165b583558443e82c88fd Mon Sep 17 00:00:00 2001\n"
- "From: \"Kirill A. Shutemov\" <kirill.shutemov@linux.intel.com>\n"
- "Date: Tue, 28 Oct 2014 14:51:31 +0200\n"
- "Subject: [PATCH] mm: fix huge zero page accounting in smaps report\n"
- "\n"
- "As a small zero page, huge zero page should not be accounted in smaps\n"
- "report as normal page.\n"
- "\n"
- "For small pages we rely on vm_normal_page() to filter out zero page, but\n"
- "vm_normal_page() is not designed to handle pmds. We only get here due\n"
- "hackish cast pmd to pte in smaps_pte_range() -- pte and pmd format is\n"
- "not necessary compatible on each and every architecture.\n"
- "\n"
- "Let's add separate codepath to handle pmds. follow_trans_huge_pmd() will\n"
- "detect huge zero page for us.\n"
- "\n"
- "We would need pmd_dirty() helper to do this properly. The patch adds it\n"
- "to THP-enabled architectures which don't yet have one.\n"
- "\n"
- "Reported-by: Fengguang Wu <fengguang.wu@intel.com>\n"
- "Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>\n"
- "---\n"
- " arch/arm64/include/asm/pgtable.h         |   1 +\n"
- " arch/powerpc/include/asm/pgtable-ppc64.h |   1 +\n"
- " arch/sparc/include/asm/pgtable_64.h      |   7 +++\n"
- " arch/x86/include/asm/pgtable.h           |   5 ++\n"
- " fs/proc/task_mmu.c                       | 101 ++++++++++++++++++++-----------\n"
- " 5 files changed, 79 insertions(+), 36 deletions(-)\n"
- "\n"
- "diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h\n"
- "index 41a43bf26492..df22314f57cf 100644\n"
- "--- a/arch/arm64/include/asm/pgtable.h\n"
- "+++ b/arch/arm64/include/asm/pgtable.h\n"
- "@@ -279,6 +279,7 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,\n"
- " #endif /* CONFIG_HAVE_RCU_TABLE_FREE */\n"
- " #endif /* CONFIG_TRANSPARENT_HUGEPAGE */\n"
- " \n"
- "+#define pmd_dirty(pmd)\t\tpte_dirty(pmd_pte(pmd))\n"
- " #define pmd_young(pmd)\t\tpte_young(pmd_pte(pmd))\n"
- " #define pmd_wrprotect(pmd)\tpte_pmd(pte_wrprotect(pmd_pte(pmd)))\n"
- " #define pmd_mksplitting(pmd)\tpte_pmd(pte_mkspecial(pmd_pte(pmd)))\n"
- "diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h\n"
- "index ae153c40ab7c..9b4b1904efae 100644\n"
- "--- a/arch/powerpc/include/asm/pgtable-ppc64.h\n"
- "+++ b/arch/powerpc/include/asm/pgtable-ppc64.h\n"
- "@@ -467,6 +467,7 @@ static inline pte_t *pmdp_ptep(pmd_t *pmd)\n"
- " }\n"
- " \n"
- " #define pmd_pfn(pmd)\t\tpte_pfn(pmd_pte(pmd))\n"
- "+#define pmd_dirty(pmd)\t\tpte_dirty(pmd_pte(pmd))\n"
- " #define pmd_young(pmd)\t\tpte_young(pmd_pte(pmd))\n"
- " #define pmd_mkold(pmd)\t\tpte_pmd(pte_mkold(pmd_pte(pmd)))\n"
- " #define pmd_wrprotect(pmd)\tpte_pmd(pte_wrprotect(pmd_pte(pmd)))\n"
- "diff --git a/arch/sparc/include/asm/pgtable_64.h b/arch/sparc/include/asm/pgtable_64.h\n"
- "index bfeb626085ac..90af17ee6184 100644\n"
- "--- a/arch/sparc/include/asm/pgtable_64.h\n"
- "+++ b/arch/sparc/include/asm/pgtable_64.h\n"
- "@@ -667,6 +667,13 @@ static inline unsigned long pmd_pfn(pmd_t pmd)\n"
- " }\n"
- " \n"
- " #ifdef CONFIG_TRANSPARENT_HUGEPAGE\n"
- "+static inline pmd_t pmd_dirty(pmd_t pmd)\n"
- "+{\n"
- "+\tpte_t pte = __pte(pmd_val(pmd));\n"
- "+\n"
- "+\treturn pte_dirty(pte);\n"
- "+}\n"
- "+\n"
- " static inline unsigned long pmd_young(pmd_t pmd)\n"
- " {\n"
- " \tpte_t pte = __pte(pmd_val(pmd));\n"
- "diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h\n"
- "index aa97a070f09f..081d6f45e006 100644\n"
- "--- a/arch/x86/include/asm/pgtable.h\n"
- "+++ b/arch/x86/include/asm/pgtable.h\n"
- "@@ -99,6 +99,11 @@ static inline int pte_young(pte_t pte)\n"
- " \treturn pte_flags(pte) & _PAGE_ACCESSED;\n"
- " }\n"
- " \n"
- "+static inline int pmd_dirty(pmd_t pmd)\n"
- "+{\n"
- "+\treturn pmd_flags(pmd) & _PAGE_DIRTY;\n"
- "+}\n"
- "+\n"
- " static inline int pmd_young(pmd_t pmd)\n"
- " {\n"
- " \treturn pmd_flags(pmd) & _PAGE_ACCESSED;\n"
- "diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c\n"
- "index 4e0388cffe3d..2ab200d429be 100644\n"
- "--- a/fs/proc/task_mmu.c\n"
- "+++ b/fs/proc/task_mmu.c\n"
- "@@ -447,58 +447,88 @@ struct mem_size_stats {\n"
- " \tu64 pss;\n"
- " };\n"
- " \n"
- "+static void smaps_account(struct mem_size_stats *mss, struct page *page,\n"
- "+\t\tunsigned long size, bool young, bool dirty)\n"
- "+{\n"
- "+\tint mapcount;\n"
- "+\n"
- "+\tif (PageAnon(page))\n"
- "+\t\tmss->anonymous += size;\n"
- " \n"
- "-static void smaps_pte_entry(pte_t ptent, unsigned long addr,\n"
- "-\t\tunsigned long ptent_size, struct mm_walk *walk)\n"
- "+\tmss->resident += size;\n"
- "+\t/* Accumulate the size in pages that have been accessed. */\n"
- "+\tif (young || PageReferenced(page))\n"
- "+\t\tmss->referenced += size;\n"
- "+\tmapcount = page_mapcount(page);\n"
- "+\tif (mapcount >= 2) {\n"
- "+\t\tif (dirty || PageDirty(page))\n"
- "+\t\t\tmss->shared_dirty += size;\n"
- "+\t\telse\n"
- "+\t\t\tmss->shared_clean += size;\n"
- "+\t\tmss->pss += (size << PSS_SHIFT) / mapcount;\n"
- "+\t} else {\n"
- "+\t\tif (dirty || PageDirty(page))\n"
- "+\t\t\tmss->private_dirty += size;\n"
- "+\t\telse\n"
- "+\t\t\tmss->private_clean += size;\n"
- "+\t\tmss->pss += (size << PSS_SHIFT);\n"
- "+\t}\n"
- "+}\n"
- "+\n"
- "+\n"
- "+static void smaps_pte_entry(pte_t *pte, unsigned long addr,\n"
- "+\t\tstruct mm_walk *walk)\n"
- " {\n"
- " \tstruct mem_size_stats *mss = walk->private;\n"
- " \tstruct vm_area_struct *vma = mss->vma;\n"
- " \tpgoff_t pgoff = linear_page_index(vma, addr);\n"
- " \tstruct page *page = NULL;\n"
- "-\tint mapcount;\n"
- " \n"
- "-\tif (pte_present(ptent)) {\n"
- "-\t\tpage = vm_normal_page(vma, addr, ptent);\n"
- "-\t} else if (is_swap_pte(ptent)) {\n"
- "-\t\tswp_entry_t swpent = pte_to_swp_entry(ptent);\n"
- "+\tif (pte_present(*pte)) {\n"
- "+\t\tpage = vm_normal_page(vma, addr, *pte);\n"
- "+\t} else if (is_swap_pte(*pte)) {\n"
- "+\t\tswp_entry_t swpent = pte_to_swp_entry(*pte);\n"
- " \n"
- " \t\tif (!non_swap_entry(swpent))\n"
- "-\t\t\tmss->swap += ptent_size;\n"
- "+\t\t\tmss->swap += PAGE_SIZE;\n"
- " \t\telse if (is_migration_entry(swpent))\n"
- " \t\t\tpage = migration_entry_to_page(swpent);\n"
- "-\t} else if (pte_file(ptent)) {\n"
- "-\t\tif (pte_to_pgoff(ptent) != pgoff)\n"
- "-\t\t\tmss->nonlinear += ptent_size;\n"
- "+\t} else if (pte_file(*pte)) {\n"
- "+\t\tif (pte_to_pgoff(*pte) != pgoff)\n"
- "+\t\t\tmss->nonlinear += PAGE_SIZE;\n"
- " \t}\n"
- " \n"
- " \tif (!page)\n"
- " \t\treturn;\n"
- " \n"
- "-\tif (PageAnon(page))\n"
- "-\t\tmss->anonymous += ptent_size;\n"
- "-\n"
- " \tif (page->index != pgoff)\n"
- "-\t\tmss->nonlinear += ptent_size;\n"
- "+\t\tmss->nonlinear += PAGE_SIZE;\n"
- " \n"
- "-\tmss->resident += ptent_size;\n"
- "-\t/* Accumulate the size in pages that have been accessed. */\n"
- "-\tif (pte_young(ptent) || PageReferenced(page))\n"
- "-\t\tmss->referenced += ptent_size;\n"
- "-\tmapcount = page_mapcount(page);\n"
- "-\tif (mapcount >= 2) {\n"
- "-\t\tif (pte_dirty(ptent) || PageDirty(page))\n"
- "-\t\t\tmss->shared_dirty += ptent_size;\n"
- "-\t\telse\n"
- "-\t\t\tmss->shared_clean += ptent_size;\n"
- "-\t\tmss->pss += (ptent_size << PSS_SHIFT) / mapcount;\n"
- "-\t} else {\n"
- "-\t\tif (pte_dirty(ptent) || PageDirty(page))\n"
- "-\t\t\tmss->private_dirty += ptent_size;\n"
- "-\t\telse\n"
- "-\t\t\tmss->private_clean += ptent_size;\n"
- "-\t\tmss->pss += (ptent_size << PSS_SHIFT);\n"
- "-\t}\n"
- "+\tsmaps_account(mss, page, PAGE_SIZE, pte_young(*pte), pte_dirty(*pte));\n"
- "+}\n"
- "+\n"
- "+#ifdef CONFIG_TRANSPARENT_HUGEPAGE\n"
- "+static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,\n"
- "+\t\tstruct mm_walk *walk)\n"
- "+{\n"
- "+\tstruct mem_size_stats *mss = walk->private;\n"
- "+\tstruct vm_area_struct *vma = mss->vma;\n"
- "+\tstruct page *page;\n"
- "+\n"
- "+\t/* FOLL_DUMP will return -EFAULT on huge zero page */\n"
- "+\tpage = follow_trans_huge_pmd(vma, addr, pmd, FOLL_DUMP);\n"
- "+\tif (IS_ERR_OR_NULL(page))\n"
- "+\t\treturn;\n"
- "+\tmss->anonymous_thp += HPAGE_PMD_SIZE;\n"
- "+\tsmaps_account(mss, page, HPAGE_PMD_SIZE,\n"
- "+\t\t\tpmd_young(*pmd), pmd_dirty(*pmd));\n"
- " }\n"
- "+#else\n"
- "+static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,\n"
- "+\t\tstruct mm_walk *walk)\n"
- "+{\n"
- "+}\n"
- "+#endif\n"
- " \n"
- " static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,\n"
- " \t\t\t   struct mm_walk *walk)\n"
- "@@ -509,9 +539,8 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,\n"
- " \tspinlock_t *ptl;\n"
- " \n"
- " \tif (pmd_trans_huge_lock(pmd, vma, &ptl) == 1) {\n"
- "-\t\tsmaps_pte_entry(*(pte_t *)pmd, addr, HPAGE_PMD_SIZE, walk);\n"
- "+\t\tsmaps_pmd_entry(pmd, addr, walk);\n"
- " \t\tspin_unlock(ptl);\n"
- "-\t\tmss->anonymous_thp += HPAGE_PMD_SIZE;\n"
- " \t\treturn 0;\n"
- " \t}\n"
- " \n"
- "@@ -524,7 +553,7 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,\n"
- " \t */\n"
- " \tpte = pte_offset_map_lock(vma->vm_mm, pmd, addr, &ptl);\n"
- " \tfor (; addr != end; pte++, addr += PAGE_SIZE)\n"
- "-\t\tsmaps_pte_entry(*pte, addr, PAGE_SIZE, walk);\n"
- "+\t\tsmaps_pte_entry(pte, addr, walk);\n"
- " \tpte_unmap_unlock(pte - 1, ptl);\n"
- " \tcond_resched();\n"
- " \treturn 0;\n"
- "-- \n"
- " Kirill A. Shutemov\n"
- "\n"
- "--\n"
- "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n"
- "the body to majordomo@kvack.org.  For more info on Linux MM,\n"
- "see: http://www.linux-mm.org/ .\n"
- "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>"
+ Could you test the patch below? I think it's a better fix.
 
-201b7f415d8f65c514af0eb58ea7a220a568d515b5493d5a379dd6d94c0e57cb
+07e85b7cec51e7ca4ac0b00d7819d1491b8fea37d4ab628bec738e272307c6d3

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.