diff for duplicates of <20150609105831.GA20336@node.dhcp.inet.fi> diff --git a/a/1.txt b/N1/1.txt index f9e6b5a..d8f77b5 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -26,3 +26,256 @@ On Wed, Jun 03, 2015 at 08:05:58PM +0300, Kirill A. Shutemov wrote: > + return true; Oops. 'false' should be here. Updated patch is below. + +>From f0a84566f1a3d2545a3e557f93a668ecba0c842d Mon Sep 17 00:00:00 2001 +From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> +Date: Fri, 20 Mar 2015 12:24:55 +0200 +Subject: [PATCH] mm: differentiate page_mapped() from page_mapcount() for + compound pages + +Let's define page_mapped() to be true for compound pages if any +sub-pages of the compound page is mapped (with PMD or PTE). + +On other hand page_mapcount() return mapcount for this particular small +page. + +This will make cases like page_get_anon_vma() behave correctly once we +allow huge pages to be mapped with PTE. + +Most users outside core-mm should use page_mapcount() instead of +page_mapped(). + +Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> +Tested-by: Sasha Levin <sasha.levin@oracle.com> +--- + arch/arc/mm/cache_arc700.c | 4 ++-- + arch/arm/mm/flush.c | 2 +- + arch/mips/mm/c-r4k.c | 3 ++- + arch/mips/mm/cache.c | 2 +- + arch/mips/mm/init.c | 6 +++--- + arch/sh/mm/cache-sh4.c | 2 +- + arch/sh/mm/cache.c | 8 ++++---- + arch/xtensa/mm/tlb.c | 2 +- + fs/proc/page.c | 4 ++-- + include/linux/mm.h | 15 +++++++++++++-- + mm/filemap.c | 2 +- + 11 files changed, 31 insertions(+), 19 deletions(-) + +diff --git a/arch/arc/mm/cache_arc700.c b/arch/arc/mm/cache_arc700.c +index 8c3a3e02ba92..1baa4d23314b 100644 +--- a/arch/arc/mm/cache_arc700.c ++++ b/arch/arc/mm/cache_arc700.c +@@ -490,7 +490,7 @@ void flush_dcache_page(struct page *page) + */ + if (!mapping_mapped(mapping)) { + clear_bit(PG_dc_clean, &page->flags); +- } else if (page_mapped(page)) { ++ } else if (page_mapcount(page)) { + + /* kernel reading from page with U-mapping */ + void *paddr = page_address(page); +@@ -675,7 +675,7 @@ void copy_user_highpage(struct page *to, struct page *from, + * Note that while @u_vaddr refers to DST page's userspace vaddr, it is + * equally valid for SRC page as well + */ +- if (page_mapped(from) && addr_not_cache_congruent(kfrom, u_vaddr)) { ++ if (page_mapcount(from) && addr_not_cache_congruent(kfrom, u_vaddr)) { + __flush_dcache_page(kfrom, u_vaddr); + clean_src_k_mappings = 1; + } +diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c +index 77f229302032..4da544aa25ef 100644 +--- a/arch/arm/mm/flush.c ++++ b/arch/arm/mm/flush.c +@@ -315,7 +315,7 @@ void flush_dcache_page(struct page *page) + mapping = page_mapping(page); + + if (!cache_ops_need_broadcast() && +- mapping && !page_mapped(page)) ++ mapping && !page_mapcount(page)) + clear_bit(PG_dcache_clean, &page->flags); + else { + __flush_dcache_page(mapping, page); +diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c +index 3f8059602765..b28bf185ef77 100644 +--- a/arch/mips/mm/c-r4k.c ++++ b/arch/mips/mm/c-r4k.c +@@ -578,7 +578,8 @@ static inline void local_r4k_flush_cache_page(void *args) + * another ASID than the current one. + */ + map_coherent = (cpu_has_dc_aliases && +- page_mapped(page) && !Page_dcache_dirty(page)); ++ page_mapcount(page) && ++ !Page_dcache_dirty(page)); + if (map_coherent) + vaddr = kmap_coherent(page, addr); + else +diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c +index 7e3ea7766822..e695b28dc32c 100644 +--- a/arch/mips/mm/cache.c ++++ b/arch/mips/mm/cache.c +@@ -106,7 +106,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr) + unsigned long addr = (unsigned long) page_address(page); + + if (pages_do_alias(addr, vmaddr)) { +- if (page_mapped(page) && !Page_dcache_dirty(page)) { ++ if (page_mapcount(page) && !Page_dcache_dirty(page)) { + void *kaddr; + + kaddr = kmap_coherent(page, vmaddr); +diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c +index 448cde372af0..2c8e44aa536e 100644 +--- a/arch/mips/mm/init.c ++++ b/arch/mips/mm/init.c +@@ -156,7 +156,7 @@ void copy_user_highpage(struct page *to, struct page *from, + + vto = kmap_atomic(to); + if (cpu_has_dc_aliases && +- page_mapped(from) && !Page_dcache_dirty(from)) { ++ page_mapcount(from) && !Page_dcache_dirty(from)) { + vfrom = kmap_coherent(from, vaddr); + copy_page(vto, vfrom); + kunmap_coherent(); +@@ -178,7 +178,7 @@ void copy_to_user_page(struct vm_area_struct *vma, + unsigned long len) + { + if (cpu_has_dc_aliases && +- page_mapped(page) && !Page_dcache_dirty(page)) { ++ page_mapcount(page) && !Page_dcache_dirty(page)) { + void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(vto, src, len); + kunmap_coherent(); +@@ -196,7 +196,7 @@ void copy_from_user_page(struct vm_area_struct *vma, + unsigned long len) + { + if (cpu_has_dc_aliases && +- page_mapped(page) && !Page_dcache_dirty(page)) { ++ page_mapcount(page) && !Page_dcache_dirty(page)) { + void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(dst, vfrom, len); + kunmap_coherent(); +diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c +index 51d8f7f31d1d..58aaa4f33b81 100644 +--- a/arch/sh/mm/cache-sh4.c ++++ b/arch/sh/mm/cache-sh4.c +@@ -241,7 +241,7 @@ static void sh4_flush_cache_page(void *args) + */ + map_coherent = (current_cpu_data.dcache.n_aliases && + test_bit(PG_dcache_clean, &page->flags) && +- page_mapped(page)); ++ page_mapcount(page)); + if (map_coherent) + vaddr = kmap_coherent(page, address); + else +diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c +index f770e3992620..e58cfbf45150 100644 +--- a/arch/sh/mm/cache.c ++++ b/arch/sh/mm/cache.c +@@ -59,7 +59,7 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page, + unsigned long vaddr, void *dst, const void *src, + unsigned long len) + { +- if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && ++ if (boot_cpu_data.dcache.n_aliases && page_mapcount(page) && + test_bit(PG_dcache_clean, &page->flags)) { + void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(vto, src, len); +@@ -78,7 +78,7 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page, + unsigned long vaddr, void *dst, const void *src, + unsigned long len) + { +- if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && ++ if (boot_cpu_data.dcache.n_aliases && page_mapcount(page) && + test_bit(PG_dcache_clean, &page->flags)) { + void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK); + memcpy(dst, vfrom, len); +@@ -97,7 +97,7 @@ void copy_user_highpage(struct page *to, struct page *from, + + vto = kmap_atomic(to); + +- if (boot_cpu_data.dcache.n_aliases && page_mapped(from) && ++ if (boot_cpu_data.dcache.n_aliases && page_mapcount(from) && + test_bit(PG_dcache_clean, &from->flags)) { + vfrom = kmap_coherent(from, vaddr); + copy_page(vto, vfrom); +@@ -153,7 +153,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr) + unsigned long addr = (unsigned long) page_address(page); + + if (pages_do_alias(addr, vmaddr)) { +- if (boot_cpu_data.dcache.n_aliases && page_mapped(page) && ++ if (boot_cpu_data.dcache.n_aliases && page_mapcount(page) && + test_bit(PG_dcache_clean, &page->flags)) { + void *kaddr; + +diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c +index 5ece856c5725..35c822286bbe 100644 +--- a/arch/xtensa/mm/tlb.c ++++ b/arch/xtensa/mm/tlb.c +@@ -245,7 +245,7 @@ static int check_tlb_entry(unsigned w, unsigned e, bool dtlb) + page_mapcount(p)); + if (!page_count(p)) + rc |= TLB_INSANE; +- else if (page_mapped(p)) ++ else if (page_mapcount(p)) + rc |= TLB_SUSPICIOUS; + } else { + rc |= TLB_INSANE; +diff --git a/fs/proc/page.c b/fs/proc/page.c +index 7eee2d8b97d9..e99c059339f6 100644 +--- a/fs/proc/page.c ++++ b/fs/proc/page.c +@@ -97,9 +97,9 @@ u64 stable_page_flags(struct page *page) + * pseudo flags for the well known (anonymous) memory mapped pages + * + * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the +- * simple test in page_mapped() is not enough. ++ * simple test in page_mapcount() is not enough. + */ +- if (!PageSlab(page) && page_mapped(page)) ++ if (!PageSlab(page) && page_mapcount(page)) + u |= 1 << KPF_MMAP; + if (PageAnon(page)) + u |= 1 << KPF_ANON; +diff --git a/include/linux/mm.h b/include/linux/mm.h +index 22cd540104ec..8cd6ee853eee 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -917,10 +917,21 @@ static inline pgoff_t page_file_index(struct page *page) + + /* + * Return true if this page is mapped into pagetables. ++ * For compound page it returns true if any subpage of compound page is mapped. + */ +-static inline int page_mapped(struct page *page) ++static inline bool page_mapped(struct page *page) + { +- return atomic_read(&(page)->_mapcount) + compound_mapcount(page) >= 0; ++ int i; ++ if (likely(!PageCompound(page))) ++ return atomic_read(&page->_mapcount) >= 0; ++ page = compound_head(page); ++ if (compound_mapcount(page)) ++ return true; ++ for (i = 0; i < hpage_nr_pages(page); i++) { ++ if (atomic_read(&page[i]._mapcount) >= 0) ++ return true; ++ } ++ return false; + } + + /* +diff --git a/mm/filemap.c b/mm/filemap.c +index fb0ba54c3ac5..c5a40dd4f846 100644 +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -202,7 +202,7 @@ void __delete_from_page_cache(struct page *page, void *shadow) + __dec_zone_page_state(page, NR_FILE_PAGES); + if (PageSwapBacked(page)) + __dec_zone_page_state(page, NR_SHMEM); +- BUG_ON(page_mapped(page)); ++ VM_BUG_ON_PAGE(page_mapped(page), page); + + /* + * At this point page must be either written or cleaned by truncate. +-- + Kirill A. Shutemov diff --git a/a/content_digest b/N1/content_digest index 17c1154..349318c 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -50,6 +50,259 @@ "> +\t}\n" "> +\treturn true;\n" "\n" - Oops. 'false' should be here. Updated patch is below. + "Oops. 'false' should be here. Updated patch is below.\n" + "\n" + ">From f0a84566f1a3d2545a3e557f93a668ecba0c842d Mon Sep 17 00:00:00 2001\n" + "From: \"Kirill A. Shutemov\" <kirill.shutemov@linux.intel.com>\n" + "Date: Fri, 20 Mar 2015 12:24:55 +0200\n" + "Subject: [PATCH] mm: differentiate page_mapped() from page_mapcount() for\n" + " compound pages\n" + "\n" + "Let's define page_mapped() to be true for compound pages if any\n" + "sub-pages of the compound page is mapped (with PMD or PTE).\n" + "\n" + "On other hand page_mapcount() return mapcount for this particular small\n" + "page.\n" + "\n" + "This will make cases like page_get_anon_vma() behave correctly once we\n" + "allow huge pages to be mapped with PTE.\n" + "\n" + "Most users outside core-mm should use page_mapcount() instead of\n" + "page_mapped().\n" + "\n" + "Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>\n" + "Tested-by: Sasha Levin <sasha.levin@oracle.com>\n" + "---\n" + " arch/arc/mm/cache_arc700.c | 4 ++--\n" + " arch/arm/mm/flush.c | 2 +-\n" + " arch/mips/mm/c-r4k.c | 3 ++-\n" + " arch/mips/mm/cache.c | 2 +-\n" + " arch/mips/mm/init.c | 6 +++---\n" + " arch/sh/mm/cache-sh4.c | 2 +-\n" + " arch/sh/mm/cache.c | 8 ++++----\n" + " arch/xtensa/mm/tlb.c | 2 +-\n" + " fs/proc/page.c | 4 ++--\n" + " include/linux/mm.h | 15 +++++++++++++--\n" + " mm/filemap.c | 2 +-\n" + " 11 files changed, 31 insertions(+), 19 deletions(-)\n" + "\n" + "diff --git a/arch/arc/mm/cache_arc700.c b/arch/arc/mm/cache_arc700.c\n" + "index 8c3a3e02ba92..1baa4d23314b 100644\n" + "--- a/arch/arc/mm/cache_arc700.c\n" + "+++ b/arch/arc/mm/cache_arc700.c\n" + "@@ -490,7 +490,7 @@ void flush_dcache_page(struct page *page)\n" + " \t */\n" + " \tif (!mapping_mapped(mapping)) {\n" + " \t\tclear_bit(PG_dc_clean, &page->flags);\n" + "-\t} else if (page_mapped(page)) {\n" + "+\t} else if (page_mapcount(page)) {\n" + " \n" + " \t\t/* kernel reading from page with U-mapping */\n" + " \t\tvoid *paddr = page_address(page);\n" + "@@ -675,7 +675,7 @@ void copy_user_highpage(struct page *to, struct page *from,\n" + " \t * Note that while @u_vaddr refers to DST page's userspace vaddr, it is\n" + " \t * equally valid for SRC page as well\n" + " \t */\n" + "-\tif (page_mapped(from) && addr_not_cache_congruent(kfrom, u_vaddr)) {\n" + "+\tif (page_mapcount(from) && addr_not_cache_congruent(kfrom, u_vaddr)) {\n" + " \t\t__flush_dcache_page(kfrom, u_vaddr);\n" + " \t\tclean_src_k_mappings = 1;\n" + " \t}\n" + "diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c\n" + "index 77f229302032..4da544aa25ef 100644\n" + "--- a/arch/arm/mm/flush.c\n" + "+++ b/arch/arm/mm/flush.c\n" + "@@ -315,7 +315,7 @@ void flush_dcache_page(struct page *page)\n" + " \tmapping = page_mapping(page);\n" + " \n" + " \tif (!cache_ops_need_broadcast() &&\n" + "-\t mapping && !page_mapped(page))\n" + "+\t mapping && !page_mapcount(page))\n" + " \t\tclear_bit(PG_dcache_clean, &page->flags);\n" + " \telse {\n" + " \t\t__flush_dcache_page(mapping, page);\n" + "diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c\n" + "index 3f8059602765..b28bf185ef77 100644\n" + "--- a/arch/mips/mm/c-r4k.c\n" + "+++ b/arch/mips/mm/c-r4k.c\n" + "@@ -578,7 +578,8 @@ static inline void local_r4k_flush_cache_page(void *args)\n" + " \t\t * another ASID than the current one.\n" + " \t\t */\n" + " \t\tmap_coherent = (cpu_has_dc_aliases &&\n" + "-\t\t\t\tpage_mapped(page) && !Page_dcache_dirty(page));\n" + "+\t\t\t\tpage_mapcount(page) &&\n" + "+\t\t\t\t!Page_dcache_dirty(page));\n" + " \t\tif (map_coherent)\n" + " \t\t\tvaddr = kmap_coherent(page, addr);\n" + " \t\telse\n" + "diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c\n" + "index 7e3ea7766822..e695b28dc32c 100644\n" + "--- a/arch/mips/mm/cache.c\n" + "+++ b/arch/mips/mm/cache.c\n" + "@@ -106,7 +106,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)\n" + " \tunsigned long addr = (unsigned long) page_address(page);\n" + " \n" + " \tif (pages_do_alias(addr, vmaddr)) {\n" + "-\t\tif (page_mapped(page) && !Page_dcache_dirty(page)) {\n" + "+\t\tif (page_mapcount(page) && !Page_dcache_dirty(page)) {\n" + " \t\t\tvoid *kaddr;\n" + " \n" + " \t\t\tkaddr = kmap_coherent(page, vmaddr);\n" + "diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c\n" + "index 448cde372af0..2c8e44aa536e 100644\n" + "--- a/arch/mips/mm/init.c\n" + "+++ b/arch/mips/mm/init.c\n" + "@@ -156,7 +156,7 @@ void copy_user_highpage(struct page *to, struct page *from,\n" + " \n" + " \tvto = kmap_atomic(to);\n" + " \tif (cpu_has_dc_aliases &&\n" + "-\t page_mapped(from) && !Page_dcache_dirty(from)) {\n" + "+\t page_mapcount(from) && !Page_dcache_dirty(from)) {\n" + " \t\tvfrom = kmap_coherent(from, vaddr);\n" + " \t\tcopy_page(vto, vfrom);\n" + " \t\tkunmap_coherent();\n" + "@@ -178,7 +178,7 @@ void copy_to_user_page(struct vm_area_struct *vma,\n" + " \tunsigned long len)\n" + " {\n" + " \tif (cpu_has_dc_aliases &&\n" + "-\t page_mapped(page) && !Page_dcache_dirty(page)) {\n" + "+\t page_mapcount(page) && !Page_dcache_dirty(page)) {\n" + " \t\tvoid *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);\n" + " \t\tmemcpy(vto, src, len);\n" + " \t\tkunmap_coherent();\n" + "@@ -196,7 +196,7 @@ void copy_from_user_page(struct vm_area_struct *vma,\n" + " \tunsigned long len)\n" + " {\n" + " \tif (cpu_has_dc_aliases &&\n" + "-\t page_mapped(page) && !Page_dcache_dirty(page)) {\n" + "+\t page_mapcount(page) && !Page_dcache_dirty(page)) {\n" + " \t\tvoid *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);\n" + " \t\tmemcpy(dst, vfrom, len);\n" + " \t\tkunmap_coherent();\n" + "diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c\n" + "index 51d8f7f31d1d..58aaa4f33b81 100644\n" + "--- a/arch/sh/mm/cache-sh4.c\n" + "+++ b/arch/sh/mm/cache-sh4.c\n" + "@@ -241,7 +241,7 @@ static void sh4_flush_cache_page(void *args)\n" + " \t\t */\n" + " \t\tmap_coherent = (current_cpu_data.dcache.n_aliases &&\n" + " \t\t\ttest_bit(PG_dcache_clean, &page->flags) &&\n" + "-\t\t\tpage_mapped(page));\n" + "+\t\t\tpage_mapcount(page));\n" + " \t\tif (map_coherent)\n" + " \t\t\tvaddr = kmap_coherent(page, address);\n" + " \t\telse\n" + "diff --git a/arch/sh/mm/cache.c b/arch/sh/mm/cache.c\n" + "index f770e3992620..e58cfbf45150 100644\n" + "--- a/arch/sh/mm/cache.c\n" + "+++ b/arch/sh/mm/cache.c\n" + "@@ -59,7 +59,7 @@ void copy_to_user_page(struct vm_area_struct *vma, struct page *page,\n" + " \t\t unsigned long vaddr, void *dst, const void *src,\n" + " \t\t unsigned long len)\n" + " {\n" + "-\tif (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&\n" + "+\tif (boot_cpu_data.dcache.n_aliases && page_mapcount(page) &&\n" + " \t test_bit(PG_dcache_clean, &page->flags)) {\n" + " \t\tvoid *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);\n" + " \t\tmemcpy(vto, src, len);\n" + "@@ -78,7 +78,7 @@ void copy_from_user_page(struct vm_area_struct *vma, struct page *page,\n" + " \t\t\t unsigned long vaddr, void *dst, const void *src,\n" + " \t\t\t unsigned long len)\n" + " {\n" + "-\tif (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&\n" + "+\tif (boot_cpu_data.dcache.n_aliases && page_mapcount(page) &&\n" + " \t test_bit(PG_dcache_clean, &page->flags)) {\n" + " \t\tvoid *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);\n" + " \t\tmemcpy(dst, vfrom, len);\n" + "@@ -97,7 +97,7 @@ void copy_user_highpage(struct page *to, struct page *from,\n" + " \n" + " \tvto = kmap_atomic(to);\n" + " \n" + "-\tif (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&\n" + "+\tif (boot_cpu_data.dcache.n_aliases && page_mapcount(from) &&\n" + " \t test_bit(PG_dcache_clean, &from->flags)) {\n" + " \t\tvfrom = kmap_coherent(from, vaddr);\n" + " \t\tcopy_page(vto, vfrom);\n" + "@@ -153,7 +153,7 @@ void __flush_anon_page(struct page *page, unsigned long vmaddr)\n" + " \tunsigned long addr = (unsigned long) page_address(page);\n" + " \n" + " \tif (pages_do_alias(addr, vmaddr)) {\n" + "-\t\tif (boot_cpu_data.dcache.n_aliases && page_mapped(page) &&\n" + "+\t\tif (boot_cpu_data.dcache.n_aliases && page_mapcount(page) &&\n" + " \t\t test_bit(PG_dcache_clean, &page->flags)) {\n" + " \t\t\tvoid *kaddr;\n" + " \n" + "diff --git a/arch/xtensa/mm/tlb.c b/arch/xtensa/mm/tlb.c\n" + "index 5ece856c5725..35c822286bbe 100644\n" + "--- a/arch/xtensa/mm/tlb.c\n" + "+++ b/arch/xtensa/mm/tlb.c\n" + "@@ -245,7 +245,7 @@ static int check_tlb_entry(unsigned w, unsigned e, bool dtlb)\n" + " \t\t\t\t\t\tpage_mapcount(p));\n" + " \t\t\t\tif (!page_count(p))\n" + " \t\t\t\t\trc |= TLB_INSANE;\n" + "-\t\t\t\telse if (page_mapped(p))\n" + "+\t\t\t\telse if (page_mapcount(p))\n" + " \t\t\t\t\trc |= TLB_SUSPICIOUS;\n" + " \t\t\t} else {\n" + " \t\t\t\trc |= TLB_INSANE;\n" + "diff --git a/fs/proc/page.c b/fs/proc/page.c\n" + "index 7eee2d8b97d9..e99c059339f6 100644\n" + "--- a/fs/proc/page.c\n" + "+++ b/fs/proc/page.c\n" + "@@ -97,9 +97,9 @@ u64 stable_page_flags(struct page *page)\n" + " \t * pseudo flags for the well known (anonymous) memory mapped pages\n" + " \t *\n" + " \t * Note that page->_mapcount is overloaded in SLOB/SLUB/SLQB, so the\n" + "-\t * simple test in page_mapped() is not enough.\n" + "+\t * simple test in page_mapcount() is not enough.\n" + " \t */\n" + "-\tif (!PageSlab(page) && page_mapped(page))\n" + "+\tif (!PageSlab(page) && page_mapcount(page))\n" + " \t\tu |= 1 << KPF_MMAP;\n" + " \tif (PageAnon(page))\n" + " \t\tu |= 1 << KPF_ANON;\n" + "diff --git a/include/linux/mm.h b/include/linux/mm.h\n" + "index 22cd540104ec..8cd6ee853eee 100644\n" + "--- a/include/linux/mm.h\n" + "+++ b/include/linux/mm.h\n" + "@@ -917,10 +917,21 @@ static inline pgoff_t page_file_index(struct page *page)\n" + " \n" + " /*\n" + " * Return true if this page is mapped into pagetables.\n" + "+ * For compound page it returns true if any subpage of compound page is mapped.\n" + " */\n" + "-static inline int page_mapped(struct page *page)\n" + "+static inline bool page_mapped(struct page *page)\n" + " {\n" + "-\treturn atomic_read(&(page)->_mapcount) + compound_mapcount(page) >= 0;\n" + "+\tint i;\n" + "+\tif (likely(!PageCompound(page)))\n" + "+\t\treturn atomic_read(&page->_mapcount) >= 0;\n" + "+\tpage = compound_head(page);\n" + "+\tif (compound_mapcount(page))\n" + "+\t\treturn true;\n" + "+\tfor (i = 0; i < hpage_nr_pages(page); i++) {\n" + "+\t\tif (atomic_read(&page[i]._mapcount) >= 0)\n" + "+\t\t\treturn true;\n" + "+\t}\n" + "+\treturn false;\n" + " }\n" + " \n" + " /*\n" + "diff --git a/mm/filemap.c b/mm/filemap.c\n" + "index fb0ba54c3ac5..c5a40dd4f846 100644\n" + "--- a/mm/filemap.c\n" + "+++ b/mm/filemap.c\n" + "@@ -202,7 +202,7 @@ void __delete_from_page_cache(struct page *page, void *shadow)\n" + " \t\t__dec_zone_page_state(page, NR_FILE_PAGES);\n" + " \tif (PageSwapBacked(page))\n" + " \t\t__dec_zone_page_state(page, NR_SHMEM);\n" + "-\tBUG_ON(page_mapped(page));\n" + "+\tVM_BUG_ON_PAGE(page_mapped(page), page);\n" + " \n" + " \t/*\n" + " \t * At this point page must be either written or cleaned by truncate.\n" + "-- \n" + Kirill A. Shutemov -a3f6aea10189d91c5f3c9f7c5f72524dd84cbe35b0b376bef72185203a74a8c7 +5fcc5a88f99a3eeabaf53b21abed4744f0842c139b127886fae991cb7343d19e
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.