mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
Revert "mm: migrate: skip shared exec THP for NUMA balancing"
This reverts commitc77c5cbafe
. Since commitc77c5cbafe
("mm: migrate: skip shared exec THP for NUMA balancing"), the NUMA balancing would skip shared exec transhuge page. But this enhancement is not suitable for transhuge page. Because it's required that page_mapcount() must be 1 due to no migration pte dance is done here. On the other hand, the shared exec transhuge page will leave the migrate_misplaced_page() with pte entry untouched and page locked. Thus pagefault for NUMA will be triggered again and deadlock occurs when we start waiting for the page lock held by ourselves. Yang Shi said: "Thanks for catching this. By relooking the code I think the other important reason for removing this is migrate_misplaced_transhuge_page() actually can't see shared exec file THP at all since page_lock_anon_vma_read() is called before and if page is not anonymous page it will just restore the PMD without migrating anything. The pages for private mapped file vma may be anonymous pages due to COW but they can't be THP so it won't trigger THP numa fault at all. I think this is why no bug was reported. I overlooked this in the first place." Link: https://lkml.kernel.org/r/20210325131524.48181-6-linmiaohe@huawei.com Signed-off-by: Miaohe Lin <linmiaohe@huawei.com> Reviewed-by: Yang Shi <shy828301@gmail.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: David Hildenbrand <david@redhat.com> Cc: Jerome Glisse <jglisse@redhat.com> Cc: Rafael Aquini <aquini@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
843e1be108
commit
7ee820ee72
18
mm/migrate.c
18
mm/migrate.c
@ -2084,17 +2084,6 @@ bool pmd_trans_migrating(pmd_t pmd)
|
||||
return PageLocked(page);
|
||||
}
|
||||
|
||||
static inline bool is_shared_exec_page(struct vm_area_struct *vma,
|
||||
struct page *page)
|
||||
{
|
||||
if (page_mapcount(page) != 1 &&
|
||||
(page_is_file_lru(page) || vma_is_shmem(vma)) &&
|
||||
(vma->vm_flags & VM_EXEC))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to migrate a misplaced page to the specified destination
|
||||
* node. Caller is expected to have an elevated reference count on
|
||||
@ -2112,7 +2101,8 @@ int migrate_misplaced_page(struct page *page, struct vm_area_struct *vma,
|
||||
* Don't migrate file pages that are mapped in multiple processes
|
||||
* with execute permissions as they are probably shared libraries.
|
||||
*/
|
||||
if (is_shared_exec_page(vma, page))
|
||||
if (page_mapcount(page) != 1 && page_is_file_lru(page) &&
|
||||
(vma->vm_flags & VM_EXEC))
|
||||
goto out;
|
||||
|
||||
/*
|
||||
@ -2167,9 +2157,6 @@ int migrate_misplaced_transhuge_page(struct mm_struct *mm,
|
||||
int page_lru = page_is_file_lru(page);
|
||||
unsigned long start = address & HPAGE_PMD_MASK;
|
||||
|
||||
if (is_shared_exec_page(vma, page))
|
||||
goto out;
|
||||
|
||||
new_page = alloc_pages_node(node,
|
||||
(GFP_TRANSHUGE_LIGHT | __GFP_THISNODE),
|
||||
HPAGE_PMD_ORDER);
|
||||
@ -2281,7 +2268,6 @@ out_fail:
|
||||
|
||||
out_unlock:
|
||||
unlock_page(page);
|
||||
out:
|
||||
put_page(page);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user