diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 1e2bff40d014..ca2b6c8919c9 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2052,6 +2052,7 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr, try_to_unmap(folio, TTU_IGNORE_MLOCK | TTU_BATCH_FLUSH); + xas_reset(&xas); xas_lock_irq(&xas); VM_BUG_ON_FOLIO(folio != xa_load(xas.xa, index), folio); @@ -2154,9 +2155,9 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr, int nr_none_check = 0; i_mmap_lock_read(mapping); + xas_set(&xas, start); xas_lock_irq(&xas); - xas_set(&xas, start); for (index = start; index < end; index++) { if (!xas_next(&xas)) { xas_store(&xas, XA_RETRY_ENTRY); @@ -2206,6 +2207,7 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr, goto rollback; } } else { + xas_reset(&xas); xas_lock_irq(&xas); } @@ -2266,6 +2268,7 @@ static enum scan_result collapse_file(struct mm_struct *mm, unsigned long addr, rollback: /* Something went wrong: roll back page cache changes */ if (nr_none) { + xas_reset(&xas); xas_lock_irq(&xas); mapping->nrpages -= nr_none; xas_unlock_irq(&xas);