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.