From nobody Tue Dec 2 01:51:35 2025 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A1FB36E9CC for ; Thu, 20 Nov 2025 17:05:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763658328; cv=none; b=LmzAI6qE3L3++gDhD+SbwVxSC20/WIBI4XWM57hdL9Xt5ulryYAKzrBElLdoNZ5g4HF0ayqbln73mKlF2Wvdj/LtwxXE5i61TUrLig2gpYS6vurufK8D97HFzd6Qy0TsoqCY4NC9atpeu6v7mMyarX61AqwNLbNm7BRUU1atvyo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763658328; c=relaxed/simple; bh=0P+F2Tg0fn+MXjgxnMgiCiFpy4TcG5e/HDS82IiOpjI=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Content-Type; b=BJCa8kCM5B5C1zJoqPhx0b+JiOj8i+/2X7ypUg4SiqR8HYdEi1FjZbuUE3nXXLnbTy4fS0AoPXswVSzoV/0tPLZaF5q1pB5cEIS+uk9Y1rNyukzM2v0eORa3LXutoDgMl/zb9PE79VXyIykdHImXb3K/XXPXNrrHDoKaYHt9BBo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=JVBDHs8c; arc=none smtp.client-ip=198.175.65.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="JVBDHs8c" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1763658327; x=1795194327; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=0P+F2Tg0fn+MXjgxnMgiCiFpy4TcG5e/HDS82IiOpjI=; b=JVBDHs8coFTYxq8wiuyCHU4Jr7lyJYuonmE9NMVYM/IyP36ypBR66veI YfH82lFy7MFIUrYBIHlOeQtMOTtS7ryVM4CxVMH6VwEcB8+flWZLqRvin FkyQrHlp7dHhjKmtcxq44QzJJ/fK2jthGIYBsfkUz27n8QPU+PFZ3ABLi J7IXabkQp6frCn7JBIOPCISa7NB4yPCUeSlF/pieWRCC/dvEvsAEQnqYI n5FAI0L16pLMB7ouMlHmys0Wk6rOsFOovBtwRwfvHL4BR5gm7gHaHNSUY Azc2mYu8IhWhb7veAIeMF2eHAvJlqPO9t8O5iuxiQv1bM7r37HjuOc7Yk w==; X-CSE-ConnectionGUID: 3+Y+NTpoSACeJVbVVL4Vqw== X-CSE-MsgGUID: EM0q2WfoRbyWcZVTb766Fw== X-IronPort-AV: E=McAfee;i="6800,10657,11619"; a="77205136" X-IronPort-AV: E=Sophos;i="6.20,213,1758610800"; d="scan'208";a="77205136" Received: from orviesa010.jf.intel.com ([10.64.159.150]) by orvoesa104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Nov 2025 09:05:26 -0800 X-CSE-ConnectionGUID: d67znad0TziXigjrOBwcAQ== X-CSE-MsgGUID: SxjtGamwQXaoMQ8AZZezmg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.20,213,1758610800"; d="scan'208";a="190710630" Received: from lstrano-desk.jf.intel.com ([10.54.39.91]) by orviesa010-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Nov 2025 09:05:25 -0800 From: Matthew Brost To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-mm@kvack.org Cc: Andrew Morton , David Hildenbrand , Zi Yan , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Oscar Salvador , Lorenzo Stoakes , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lyude Paul , Danilo Krummrich , David Airlie , Simona Vetter , Ralph Campbell , =?UTF-8?q?Mika=20Penttil=C3=A4?= , Francois Dugast , Balbir Singh Subject: [PATCH] fixup: mm/migrate_device: handle partially mapped folios during Date: Thu, 20 Nov 2025 09:05:15 -0800 Message-Id: <20251120170515.46504-1-matthew.brost@intel.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Splitting a partially mapped folio caused a regression in the Intel Xe SVM test suite in the mremap section, resulting in the following stack trace: NFO: task kworker/u65:2:1642 blocked for more than 30 seconds. [ 212.624286] Tainted: G S W 6.18.0-rc6-xe+ #1719 [ 212.638288] Workqueue: xe_page_fault_work_queue xe_pagefault_queue_work = [xe] [ 212.638323] Call Trace: [ 212.638324] [ 212.638325] __schedule+0x4b0/0x990 [ 212.638330] schedule+0x22/0xd0 [ 212.638331] io_schedule+0x41/0x60 [ 212.638333] migration_entry_wait_on_locked+0x1d8/0x2d0 [ 212.638336] ? __pfx_wake_page_function+0x10/0x10 [ 212.638339] migration_entry_wait+0xd2/0xe0 [ 212.638341] hmm_vma_walk_pmd+0x7c9/0x8d0 [ 212.638343] walk_pgd_range+0x51d/0xa40 [ 212.638345] __walk_page_range+0x75/0x1e0 [ 212.638347] walk_page_range_mm+0x138/0x1f0 [ 212.638349] hmm_range_fault+0x59/0xa0 [ 212.638351] drm_gpusvm_get_pages+0x194/0x7b0 [drm_gpusvm_helper] [ 212.638354] drm_gpusvm_range_get_pages+0x2d/0x40 [drm_gpusvm_helper] [ 212.638355] __xe_svm_handle_pagefault+0x259/0x900 [xe] [ 212.638375] ? update_load_avg+0x7f/0x6c0 [ 212.638377] ? update_curr+0x13d/0x170 [ 212.638379] xe_svm_handle_pagefault+0x37/0x90 [xe] [ 212.638396] xe_pagefault_queue_work+0x2da/0x3c0 [xe] [ 212.638420] process_one_work+0x16e/0x2e0 [ 212.638422] worker_thread+0x284/0x410 [ 212.638423] ? __pfx_worker_thread+0x10/0x10 [ 212.638425] kthread+0xec/0x210 [ 212.638427] ? __pfx_kthread+0x10/0x10 [ 212.638428] ? __pfx_kthread+0x10/0x10 [ 212.638430] ret_from_fork+0xbd/0x100 [ 212.638433] ? __pfx_kthread+0x10/0x10 [ 212.638434] ret_from_fork_asm+0x1a/0x30 [ 212.638436] The issue appears to be that migration PTEs are not properly removed after a split. This change refactors the code to perform the split in a slightly different manner while retaining the original patch=E2=80=99s intent. With = this update, the Intel Xe SVM test suite fully passes. Cc: Andrew Morton Cc: David Hildenbrand Cc: Zi Yan Cc: Joshua Hahn Cc: Rakie Kim Cc: Byungchul Park Cc: Gregory Price Cc: Ying Huang Cc: Alistair Popple Cc: Oscar Salvador Cc: Lorenzo Stoakes Cc: Baolin Wang Cc: Liam R. Howlett Cc: Nico Pache Cc: Ryan Roberts Cc: Dev Jain Cc: Barry Song Cc: Lyude Paul Cc: Danilo Krummrich Cc: David Airlie Cc: Simona Vetter Cc: Ralph Campbell Cc: Mika Penttil=C3=A4 Cc: Francois Dugast Cc: Balbir Singh Signed-off-by: Matthew Brost --- This fixup should be squashed into the patch "mm/migrate_device: handle partially mapped folios during" in mm/mm-unstable I replaced the original patch with a local patch I authored a while back that solves the same problem but uses a different code structure. The failing test case=E2=80=94only available on an Xe driver=E2=80=94passes wit= h this patch. I can attempt to fix up the original patch within its structure if that=E2=80=99s preferred. --- mm/migrate_device.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/mm/migrate_device.c b/mm/migrate_device.c index fa42d2ebd024..69e88f4a2563 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -254,6 +254,7 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, spinlock_t *ptl; struct folio *fault_folio =3D migrate->fault_page ? page_folio(migrate->fault_page) : NULL; + struct folio *split_folio =3D NULL; pte_t *ptep; =20 again: @@ -266,10 +267,11 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, return 0; } =20 - ptep =3D pte_offset_map_lock(mm, pmdp, addr, &ptl); + ptep =3D pte_offset_map_lock(mm, pmdp, start, &ptl); if (!ptep) goto again; arch_enter_lazy_mmu_mode(); + ptep +=3D (addr - start) / PAGE_SIZE; =20 for (; addr < end; addr +=3D PAGE_SIZE, ptep++) { struct dev_pagemap *pgmap; @@ -347,22 +349,6 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, pgmap->owner !=3D migrate->pgmap_owner) goto next; } - folio =3D page ? page_folio(page) : NULL; - if (folio && folio_test_large(folio)) { - int ret; - - pte_unmap_unlock(ptep, ptl); - ret =3D migrate_vma_split_folio(folio, - migrate->fault_page); - - if (ret) { - ptep =3D pte_offset_map_lock(mm, pmdp, addr, &ptl); - goto next; - } - - addr =3D start; - goto again; - } mpfn =3D migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE; mpfn |=3D pte_write(pte) ? MIGRATE_PFN_WRITE : 0; } @@ -400,6 +386,11 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, bool anon_exclusive; pte_t swp_pte; =20 + if (folio_order(folio)) { + split_folio =3D folio; + goto split; + } + flush_cache_page(vma, addr, pte_pfn(pte)); anon_exclusive =3D folio_test_anon(folio) && PageAnonExclusive(page); @@ -478,8 +469,23 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, if (unmapped) flush_tlb_range(walk->vma, start, end); =20 +split: arch_leave_lazy_mmu_mode(); - pte_unmap_unlock(ptep - 1, ptl); + pte_unmap_unlock(ptep - 1 + !!split_folio, ptl); + + if (split_folio) { + int ret; + + ret =3D split_folio(split_folio); + if (fault_folio !=3D split_folio) + folio_unlock(split_folio); + folio_put(split_folio); + if (ret) + return migrate_vma_collect_skip(addr, end, walk); + + split_folio =3D NULL; + goto again; + } =20 return 0; } --=20 2.34.1