From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: benh@kernel.crashing.org, paulus@samba.org, dwg@au1.ibm.com
Cc: linuxppc-dev@lists.ozlabs.org,
"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Subject: [PATCH -V9 20/20] powerpc: split hugepage when using subpage protection
Date: Wed, 22 May 2013 22:27:52 +0530 [thread overview]
Message-ID: <1369241872-15700-21-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <1369241872-15700-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
We find all the overlapping vma and mark them such that we don't allocate
hugepage in that range. Also we split existing huge page so that the
normal page hash can be invalidated and new page faulted in with new
protection bits.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
arch/powerpc/mm/subpage-prot.c | 48 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/arch/powerpc/mm/subpage-prot.c b/arch/powerpc/mm/subpage-prot.c
index 7c415dd..aa74acb 100644
--- a/arch/powerpc/mm/subpage-prot.c
+++ b/arch/powerpc/mm/subpage-prot.c
@@ -130,6 +130,53 @@ static void subpage_prot_clear(unsigned long addr, unsigned long len)
up_write(&mm->mmap_sem);
}
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+static int subpage_walk_pmd_entry(pmd_t *pmd, unsigned long addr,
+ unsigned long end, struct mm_walk *walk)
+{
+ struct vm_area_struct *vma = walk->private;
+ split_huge_page_pmd(vma, addr, pmd);
+ return 0;
+}
+
+static void subpage_mark_vma_nohuge(struct mm_struct *mm, unsigned long addr,
+ unsigned long len)
+{
+ struct vm_area_struct *vma;
+ struct mm_walk subpage_proto_walk = {
+ .mm = mm,
+ .pmd_entry = subpage_walk_pmd_entry,
+ };
+
+ /*
+ * We don't try too hard, we just mark all the vma in that range
+ * VM_NOHUGEPAGE and split them.
+ */
+ vma = find_vma(mm, addr);
+ /*
+ * If the range is in unmapped range, just return
+ */
+ if (vma && ((addr + len) <= vma->vm_start))
+ return;
+
+ while (vma) {
+ if (vma->vm_start >= (addr + len))
+ break;
+ vma->vm_flags |= VM_NOHUGEPAGE;
+ subpage_proto_walk.private = vma;
+ walk_page_range(vma->vm_start, vma->vm_end,
+ &subpage_proto_walk);
+ vma = vma->vm_next;
+ }
+}
+#else
+static void subpage_mark_vma_nohuge(struct mm_struct *mm, unsigned long addr,
+ unsigned long len)
+{
+ return;
+}
+#endif
+
/*
* Copy in a subpage protection map for an address range.
* The map has 2 bits per 4k subpage, so 32 bits per 64k page.
@@ -168,6 +215,7 @@ long sys_subpage_prot(unsigned long addr, unsigned long len, u32 __user *map)
return -EFAULT;
down_write(&mm->mmap_sem);
+ subpage_mark_vma_nohuge(mm, addr, len);
for (limit = addr + len; addr < limit; addr = next) {
next = pmd_addr_end(addr, limit);
err = -ENOMEM;
--
1.8.1.2
prev parent reply other threads:[~2013-05-22 16:58 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-22 16:57 [PATCH -V9 00/20] THP support for PPC64 Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 01/20] mm/THP: Use pmd_populate to update the pmd with pgtable_t pointer Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 02/20] mm/THP: Use the right function when updating access flags Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 03/20] mm/THP: Add pmd args to pgtable deposit and withdraw APIs Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 04/20] mm/THP: withdraw the pgtable after pmdp related operations Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 05/20] mm/THP: Don't use HPAGE_SHIFT in transparent hugepage code Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 06/20] mm/THP: deposit the transpare huge pgtable before set_pmd Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 07/20] powerpc/THP: Double the PMD table size for THP Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 08/20] powerpc/THP: Implement transparent hugepages for ppc64 Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 09/20] powerpc: move find_linux_pte_or_hugepte and gup_hugepte to common code Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 10/20] powerpc: Update find_linux_pte_or_hugepte to handle transparent hugepages Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 11/20] powerpc: Replace find_linux_pte with find_linux_pte_or_hugepte Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 12/20] powerpc: Update gup_pmd_range to handle transparent hugepages Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 13/20] powerpc/THP: Add code to handle HPTE faults for hugepages Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 14/20] powerpc: Make linux pagetable walk safe with THP enabled Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 15/20] powerpc: Prevent gcc to re-read the pagetables Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 16/20] powerpc/THP: Enable THP on PPC64 Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 17/20] powerpc: Optimize hugepage invalidate Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 18/20] powerpc: disable assert_pte_locked for collapse_huge_page Aneesh Kumar K.V
2013-05-22 16:57 ` [PATCH -V9 19/20] powerpc: use smp_rmb when looking at deposisted pgtable to store hash index Aneesh Kumar K.V
2013-05-22 16:57 ` Aneesh Kumar K.V [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1369241872-15700-21-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
--to=aneesh.kumar@linux.vnet.ibm.com \
--cc=benh@kernel.crashing.org \
--cc=dwg@au1.ibm.com \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).