Thread (22 messages) 22 messages, 6 authors, 2012-10-30

Re: [PATCH] s390: Add pmd_mknotpresent()

From: Gerald Schaefer <hidden>
Date: 2012-10-29 14:01:06
Also in: lkml
Subsystem: memory management, memory management - thp (transparent huge page), the rest · Maintainers: Andrew Morton, David Hildenbrand, Lorenzo Stoakes, Linus Torvalds

On Sun, 28 Oct 2012 14:10:14 +0100
Ingo Molnar [off-list ref] wrote:
There's a related problem on s390: other THP implementations 
have pmd_mknotpresent() while s390 not, resulting in:

  mm/huge_memory.c:1543:2: error: implicit declaration of function 'pmd_mknotpresent'

The (untested!) patch below adds the s390 version of this 
method.

Gerald, Martin, did I get the S390 details right?
The upstream thp patches for s390 fixed that by adding pmdp_invalidate() and
replacing the pmd_mknotpresent() in mm/huge_memory.c, see git commit 46dcde73.
The pmdp_invalidate() is already included linux-next, so it should be ok to
just change mm/huge_memory.c similar to upstream:
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index f1c2679..842b6df 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1537,8 +1537,7 @@ static int __split_huge_page_map(struct page *page,
 	 * complete. The ptl also protects against concurrent faults due to
 	 * making the pmd not-present.
 	 */
-	set_pmd_at(mm, address, pmd, pmd_mknotpresent(*pmd));
-	flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
+	pmdp_invalidate(vma, address, pmd);
 	pmd_populate(mm, pmd, pgtable);
 	ret = 1;
With this, s390 does not need a pmd_mknotpresent(), and using
set_pmd_at(..., pmd_mknotpresent()) would be wrong on s390 anyway because
we need a flushing operation to change a valid pmd.

quoted hunk ↗ jump to hunk
Thanks,

	Ingo

Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index 098fc5a..b820ff1 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -1310,6 +1310,12 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
 	return pmd;
 }

+static inline pmd_t pmd_mknotpresent(pmd_t pmd)
+{
+	pmd_val(pmd) &= ~_SEGMENT_ENTRY_ORIGIN;
+	return pmd;
+}
+
 #define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
 static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
 					    unsigned long address, pmd_t *pmdp)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help