Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked fromtorvalds/linux

Commit248db92

Browse files
kiryltorvalds
authored andcommitted
migrate_pages: try to split pages on queuing
We are not able to migrate THPs. It means it's not enough to split onlyPMD on migration -- we need to split compound page under it too.Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>Acked-by: Jerome Marchand <jmarchan@redhat.com>Cc: Sasha Levin <sasha.levin@oracle.com>Cc: Vlastimil Babka <vbabka@suse.cz>Cc: Andrea Arcangeli <aarcange@redhat.com>Cc: Hugh Dickins <hughd@google.com>Cc: Dave Hansen <dave.hansen@intel.com>Cc: Mel Gorman <mgorman@suse.de>Cc: Rik van Riel <riel@redhat.com>Cc: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>Cc: Steve Capper <steve.capper@linaro.org>Cc: Johannes Weiner <hannes@cmpxchg.org>Cc: Michal Hocko <mhocko@suse.cz>Cc: Christoph Lameter <cl@linux.com>Cc: David Rientjes <rientjes@google.com>Signed-off-by: Andrew Morton <akpm@linux-foundation.org>Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parente9b61f1 commit248db92

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

‎mm/mempolicy.c‎

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -489,14 +489,33 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
489489
structpage*page;
490490
structqueue_pages*qp=walk->private;
491491
unsigned longflags=qp->flags;
492-
intnid;
492+
intnid,ret;
493493
pte_t*pte;
494494
spinlock_t*ptl;
495495

496-
split_huge_pmd(vma,pmd,addr);
497-
if (pmd_trans_unstable(pmd))
498-
return0;
496+
if (pmd_trans_huge(*pmd)) {
497+
ptl=pmd_lock(walk->mm,pmd);
498+
if (pmd_trans_huge(*pmd)) {
499+
page=pmd_page(*pmd);
500+
if (is_huge_zero_page(page)) {
501+
spin_unlock(ptl);
502+
split_huge_pmd(vma,pmd,addr);
503+
}else {
504+
get_page(page);
505+
spin_unlock(ptl);
506+
lock_page(page);
507+
ret=split_huge_page(page);
508+
unlock_page(page);
509+
put_page(page);
510+
if (ret)
511+
return0;
512+
}
513+
}else {
514+
spin_unlock(ptl);
515+
}
516+
}
499517

518+
retry:
500519
pte=pte_offset_map_lock(walk->mm,pmd,addr,&ptl);
501520
for (;addr!=end;pte++,addr+=PAGE_SIZE) {
502521
if (!pte_present(*pte))
@@ -513,6 +532,21 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
513532
nid=page_to_nid(page);
514533
if (node_isset(nid,*qp->nmask)== !!(flags&MPOL_MF_INVERT))
515534
continue;
535+
if (PageTail(page)&&PageAnon(page)) {
536+
get_page(page);
537+
pte_unmap_unlock(pte,ptl);
538+
lock_page(page);
539+
ret=split_huge_page(page);
540+
unlock_page(page);
541+
put_page(page);
542+
/* Failed to split -- skip. */
543+
if (ret) {
544+
pte=pte_offset_map_lock(walk->mm,pmd,
545+
addr,&ptl);
546+
continue;
547+
}
548+
gotoretry;
549+
}
516550

517551
if (flags& (MPOL_MF_MOVE |MPOL_MF_MOVE_ALL))
518552
migrate_page_add(page,qp->pagelist,flags);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp