lkml.org 
[lkml]   [2011]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH][mm] adjust the logic of checking THP
Date

Acturally, pmd_trans_huge(orig_pmd) only checks the _PAGE_PSE bits,
it's a pmd entry bits, only mark a size, not a flag;As one can easily
create the same pmd entry bits for some special use,then the check
will get confused.And this patch is to adjust the logic to use the flag,
it can perfectly avoid this potential issuse,and basically no impact
to the current code.


Signed-off-by: Guanjun He <heguanbo@gmail.com>
---
mm/memory.c | 28 +++++++++++++++-------------
1 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/mm/memory.c b/mm/memory.c
index a56e3ba..a76b17f 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3465,20 +3465,22 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma,
pmd = pmd_alloc(mm, pud, address);
if (!pmd)
return VM_FAULT_OOM;
- if (pmd_none(*pmd) && transparent_hugepage_enabled(vma)) {
- if (!vma->vm_ops)
- return do_huge_pmd_anonymous_page(mm, vma, address,
- pmd, flags);
- } else {
- pmd_t orig_pmd = *pmd;
- barrier();
- if (pmd_trans_huge(orig_pmd)) {
- if (flags & FAULT_FLAG_WRITE &&
- !pmd_write(orig_pmd) &&
- !pmd_trans_splitting(orig_pmd))
- return do_huge_pmd_wp_page(mm, vma, address,
- pmd, orig_pmd);
+ if (transparent_hugepage_enabled(vma)) {
+ if (pmd_none(*pmd)) {
+ if (!vma->vm_ops)
+ return do_huge_pmd_anonymous_page(mm, vma, address,
+ pmd, flags);
+ } else {
+ pmd_t orig_pmd = *pmd;
+ barrier();
+ if (pmd_trans_huge(orig_pmd)) {
+ if (flags & FAULT_FLAG_WRITE &&
+ !pmd_write(orig_pmd) &&
+ !pmd_trans_splitting(orig_pmd))
+ return do_huge_pmd_wp_page(mm, vma, address,
+ pmd, orig_pmd);
return 0;
+ }
}
}

--
1.7.7


\
 
 \ /
  Last update: 2011-11-02 07:37    [W:0.057 / U:1.296 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site