|
@@ -446,15 +446,6 @@ static int queue_pages_pmd(pmd_t *pmd, spinlock_t *ptl, unsigned long addr,
|
|
__split_huge_pmd(walk->vma, pmd, addr, false, NULL);
|
|
__split_huge_pmd(walk->vma, pmd, addr, false, NULL);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
- if (!thp_migration_supported()) {
|
|
|
|
- get_page(page);
|
|
|
|
- spin_unlock(ptl);
|
|
|
|
- lock_page(page);
|
|
|
|
- ret = split_huge_page(page);
|
|
|
|
- unlock_page(page);
|
|
|
|
- put_page(page);
|
|
|
|
- goto out;
|
|
|
|
- }
|
|
|
|
if (!queue_pages_required(page, qp)) {
|
|
if (!queue_pages_required(page, qp)) {
|
|
ret = 1;
|
|
ret = 1;
|
|
goto unlock;
|
|
goto unlock;
|
|
@@ -495,7 +486,7 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr,
|
|
|
|
|
|
if (pmd_trans_unstable(pmd))
|
|
if (pmd_trans_unstable(pmd))
|
|
return 0;
|
|
return 0;
|
|
-retry:
|
|
|
|
|
|
+
|
|
pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
|
|
pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
|
|
for (; addr != end; pte++, addr += PAGE_SIZE) {
|
|
for (; addr != end; pte++, addr += PAGE_SIZE) {
|
|
if (!pte_present(*pte))
|
|
if (!pte_present(*pte))
|
|
@@ -511,22 +502,6 @@ retry:
|
|
continue;
|
|
continue;
|
|
if (!queue_pages_required(page, qp))
|
|
if (!queue_pages_required(page, qp))
|
|
continue;
|
|
continue;
|
|
- if (PageTransCompound(page) && !thp_migration_supported()) {
|
|
|
|
- get_page(page);
|
|
|
|
- pte_unmap_unlock(pte, ptl);
|
|
|
|
- lock_page(page);
|
|
|
|
- ret = split_huge_page(page);
|
|
|
|
- unlock_page(page);
|
|
|
|
- put_page(page);
|
|
|
|
- /* Failed to split -- skip. */
|
|
|
|
- if (ret) {
|
|
|
|
- pte = pte_offset_map_lock(walk->mm, pmd,
|
|
|
|
- addr, &ptl);
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- goto retry;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
migrate_page_add(page, qp->pagelist, flags);
|
|
migrate_page_add(page, qp->pagelist, flags);
|
|
}
|
|
}
|
|
pte_unmap_unlock(pte - 1, ptl);
|
|
pte_unmap_unlock(pte - 1, ptl);
|
|
@@ -948,7 +923,7 @@ struct page *alloc_new_node_page(struct page *page, unsigned long node)
|
|
if (PageHuge(page))
|
|
if (PageHuge(page))
|
|
return alloc_huge_page_node(page_hstate(compound_head(page)),
|
|
return alloc_huge_page_node(page_hstate(compound_head(page)),
|
|
node);
|
|
node);
|
|
- else if (thp_migration_supported() && PageTransHuge(page)) {
|
|
|
|
|
|
+ else if (PageTransHuge(page)) {
|
|
struct page *thp;
|
|
struct page *thp;
|
|
|
|
|
|
thp = alloc_pages_node(node,
|
|
thp = alloc_pages_node(node,
|
|
@@ -1124,7 +1099,7 @@ static struct page *new_page(struct page *page, unsigned long start)
|
|
if (PageHuge(page)) {
|
|
if (PageHuge(page)) {
|
|
return alloc_huge_page_vma(page_hstate(compound_head(page)),
|
|
return alloc_huge_page_vma(page_hstate(compound_head(page)),
|
|
vma, address);
|
|
vma, address);
|
|
- } else if (thp_migration_supported() && PageTransHuge(page)) {
|
|
|
|
|
|
+ } else if (PageTransHuge(page)) {
|
|
struct page *thp;
|
|
struct page *thp;
|
|
|
|
|
|
thp = alloc_hugepage_vma(GFP_TRANSHUGE, vma, address,
|
|
thp = alloc_hugepage_vma(GFP_TRANSHUGE, vma, address,
|