Messages in this thread Patch in this message | | | From | Guanjun He <> | Subject | [PATCH][mm] adjust the logic of checking THP | Date | Wed, 2 Nov 2011 14:34:30 +0800 |
| |
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
| |