|
@@ -955,8 +955,10 @@ static ICE_noinline int unmap_and_move(new_page_t get_new_page,
|
|
|
}
|
|
|
|
|
|
rc = __unmap_and_move(page, newpage, force, mode);
|
|
|
- if (rc == MIGRATEPAGE_SUCCESS)
|
|
|
+ if (rc == MIGRATEPAGE_SUCCESS) {
|
|
|
put_new_page = NULL;
|
|
|
+ set_page_owner_migrate_reason(newpage, reason);
|
|
|
+ }
|
|
|
|
|
|
out:
|
|
|
if (rc != -EAGAIN) {
|
|
@@ -1021,7 +1023,7 @@ out:
|
|
|
static int unmap_and_move_huge_page(new_page_t get_new_page,
|
|
|
free_page_t put_new_page, unsigned long private,
|
|
|
struct page *hpage, int force,
|
|
|
- enum migrate_mode mode)
|
|
|
+ enum migrate_mode mode, int reason)
|
|
|
{
|
|
|
int rc = -EAGAIN;
|
|
|
int *result = NULL;
|
|
@@ -1079,6 +1081,7 @@ put_anon:
|
|
|
if (rc == MIGRATEPAGE_SUCCESS) {
|
|
|
hugetlb_cgroup_migrate(hpage, new_hpage);
|
|
|
put_new_page = NULL;
|
|
|
+ set_page_owner_migrate_reason(new_hpage, reason);
|
|
|
}
|
|
|
|
|
|
unlock_page(hpage);
|
|
@@ -1151,7 +1154,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page,
|
|
|
if (PageHuge(page))
|
|
|
rc = unmap_and_move_huge_page(get_new_page,
|
|
|
put_new_page, private, page,
|
|
|
- pass > 2, mode);
|
|
|
+ pass > 2, mode, reason);
|
|
|
else
|
|
|
rc = unmap_and_move(get_new_page, put_new_page,
|
|
|
private, page, pass > 2, mode,
|
|
@@ -1842,6 +1845,7 @@ fail_putback:
|
|
|
set_page_memcg(new_page, page_memcg(page));
|
|
|
set_page_memcg(page, NULL);
|
|
|
page_remove_rmap(page, true);
|
|
|
+ set_page_owner_migrate_reason(new_page, MR_NUMA_MISPLACED);
|
|
|
|
|
|
spin_unlock(ptl);
|
|
|
mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
|