All of lore.kernel.org
 help / color / mirror / Atom feed
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.