diff options
author | Bob Liu <lliubbo@gmail.com> | 2012-12-11 19:00:37 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-11 20:22:22 -0500 |
commit | 6219049ae1ce32b89236646cccaec2a5fc6c4fd2 (patch) | |
tree | 551e8b1d53b8d237678c96cb9b442c746609cfcd /mm/rmap.c | |
parent | 344aa35c27acdf70d3c67b5aa7cb6aa8585f80c1 (diff) |
mm: introduce mm_find_pmd()
Several place need to find the pmd by(mm_struct, address), so introduce a
function to simplify it.
[akpm@linux-foundation.org: fix warning]
Signed-off-by: Bob Liu <lliubbo@gmail.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Cc: Michal Hocko <mhocko@suse.cz>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Ni zhan Chen <nizhan.chen@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 48 |
1 files changed, 25 insertions, 23 deletions
@@ -562,6 +562,27 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | |||
562 | return address; | 562 | return address; |
563 | } | 563 | } |
564 | 564 | ||
565 | pmd_t *mm_find_pmd(struct mm_struct *mm, unsigned long address) | ||
566 | { | ||
567 | pgd_t *pgd; | ||
568 | pud_t *pud; | ||
569 | pmd_t *pmd = NULL; | ||
570 | |||
571 | pgd = pgd_offset(mm, address); | ||
572 | if (!pgd_present(*pgd)) | ||
573 | goto out; | ||
574 | |||
575 | pud = pud_offset(pgd, address); | ||
576 | if (!pud_present(*pud)) | ||
577 | goto out; | ||
578 | |||
579 | pmd = pmd_offset(pud, address); | ||
580 | if (!pmd_present(*pmd)) | ||
581 | pmd = NULL; | ||
582 | out: | ||
583 | return pmd; | ||
584 | } | ||
585 | |||
565 | /* | 586 | /* |
566 | * Check that @page is mapped at @address into @mm. | 587 | * Check that @page is mapped at @address into @mm. |
567 | * | 588 | * |
@@ -574,8 +595,6 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | |||
574 | pte_t *__page_check_address(struct page *page, struct mm_struct *mm, | 595 | pte_t *__page_check_address(struct page *page, struct mm_struct *mm, |
575 | unsigned long address, spinlock_t **ptlp, int sync) | 596 | unsigned long address, spinlock_t **ptlp, int sync) |
576 | { | 597 | { |
577 | pgd_t *pgd; | ||
578 | pud_t *pud; | ||
579 | pmd_t *pmd; | 598 | pmd_t *pmd; |
580 | pte_t *pte; | 599 | pte_t *pte; |
581 | spinlock_t *ptl; | 600 | spinlock_t *ptl; |
@@ -586,17 +605,10 @@ pte_t *__page_check_address(struct page *page, struct mm_struct *mm, | |||
586 | goto check; | 605 | goto check; |
587 | } | 606 | } |
588 | 607 | ||
589 | pgd = pgd_offset(mm, address); | 608 | pmd = mm_find_pmd(mm, address); |
590 | if (!pgd_present(*pgd)) | 609 | if (!pmd) |
591 | return NULL; | ||
592 | |||
593 | pud = pud_offset(pgd, address); | ||
594 | if (!pud_present(*pud)) | ||
595 | return NULL; | 610 | return NULL; |
596 | 611 | ||
597 | pmd = pmd_offset(pud, address); | ||
598 | if (!pmd_present(*pmd)) | ||
599 | return NULL; | ||
600 | if (pmd_trans_huge(*pmd)) | 612 | if (pmd_trans_huge(*pmd)) |
601 | return NULL; | 613 | return NULL; |
602 | 614 | ||
@@ -1345,8 +1357,6 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1345 | struct vm_area_struct *vma, struct page *check_page) | 1357 | struct vm_area_struct *vma, struct page *check_page) |
1346 | { | 1358 | { |
1347 | struct mm_struct *mm = vma->vm_mm; | 1359 | struct mm_struct *mm = vma->vm_mm; |
1348 | pgd_t *pgd; | ||
1349 | pud_t *pud; | ||
1350 | pmd_t *pmd; | 1360 | pmd_t *pmd; |
1351 | pte_t *pte; | 1361 | pte_t *pte; |
1352 | pte_t pteval; | 1362 | pte_t pteval; |
@@ -1366,16 +1376,8 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, | |||
1366 | if (end > vma->vm_end) | 1376 | if (end > vma->vm_end) |
1367 | end = vma->vm_end; | 1377 | end = vma->vm_end; |
1368 | 1378 | ||
1369 | pgd = pgd_offset(mm, address); | 1379 | pmd = mm_find_pmd(mm, address); |
1370 | if (!pgd_present(*pgd)) | 1380 | if (!pmd) |
1371 | return ret; | ||
1372 | |||
1373 | pud = pud_offset(pgd, address); | ||
1374 | if (!pud_present(*pud)) | ||
1375 | return ret; | ||
1376 | |||
1377 | pmd = pmd_offset(pud, address); | ||
1378 | if (!pmd_present(*pmd)) | ||
1379 | return ret; | 1381 | return ret; |
1380 | 1382 | ||
1381 | mmun_start = address; | 1383 | mmun_start = address; |