From: Mika Penttilä <[email protected]>

Add calls to lazy_mmu_mode_enable() and lazy_mmu_mode_disable()
while doing migration.

Cc: David Hildenbrand <[email protected]>
Cc: Jason Gunthorpe <[email protected]>
Cc: Leon Romanovsky <[email protected]>
Cc: Alistair Popple <[email protected]>
Cc: Balbir Singh <[email protected]>
Cc: Zi Yan <[email protected]>
Cc: Matthew Brost <[email protected]>
Suggested-by: Alistair Popple <[email protected]>
Signed-off-by: Mika Penttilä <[email protected]>
---
 mm/hmm.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/mm/hmm.c b/mm/hmm.c
index a1459bd34c04..a67a23e54551 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -371,6 +371,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, 
unsigned long addr,
                /* Report error for everything else */
 
                if (hmm_vma_walk->ptelocked) {
+                       lazy_mmu_mode_disable();
                        pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
                        hmm_vma_walk->ptelocked = false;
                } else {
@@ -394,6 +395,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, 
unsigned long addr,
            !is_zero_pfn(pte_pfn(pte))) {
                if (hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0)) {
                        if (hmm_vma_walk->ptelocked) {
+                               lazy_mmu_mode_disable();
                                pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
                                hmm_vma_walk->ptelocked = false;
                        } else {
@@ -413,6 +415,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, 
unsigned long addr,
 
 fault:
        if (hmm_vma_walk->ptelocked) {
+               lazy_mmu_mode_disable();
                pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
                hmm_vma_walk->ptelocked = false;
        } else {
@@ -510,6 +513,7 @@ static int migrate_vma_split_folio(struct folio *folio,
        if (folio != fault_folio)
                folio_get(folio);
 
+       lazy_mmu_mode_disable();
        pte_unmap_unlock(ptep, hmm_vma_walk->ptl);
        hmm_vma_walk->ptelocked = false;
 
@@ -1135,8 +1139,10 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
 
        if (minfo) {
                ptep = pte_offset_map_lock(mm, pmdp, addr, &hmm_vma_walk->ptl);
-               if (ptep)
+               if (ptep) {
+                       lazy_mmu_mode_enable();
                        hmm_vma_walk->ptelocked = true;
+               }
        } else {
                ptep = pte_offset_map(pmdp, addr);
        }
@@ -1178,6 +1184,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp,
                flush_tlb_range(walk->vma, start, addr);
 
        if (hmm_vma_walk->ptelocked) {
+               lazy_mmu_mode_disable();
                pte_unmap_unlock(ptep - 1, hmm_vma_walk->ptl);
                hmm_vma_walk->ptelocked = false;
        } else {
-- 
2.55.0

Reply via email to