From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B58CC7EE2A for ; Mon, 30 Jun 2025 04:48:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D1D9A6B009B; Mon, 30 Jun 2025 00:48:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CCE3F6B009D; Mon, 30 Jun 2025 00:48:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C0BCF6B009E; Mon, 30 Jun 2025 00:48:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id AD9DC6B009B for ; Mon, 30 Jun 2025 00:48:49 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 5EC9D1A0399 for ; Mon, 30 Jun 2025 04:48:49 +0000 (UTC) X-FDA: 83610836778.20.5A64E9C Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by imf14.hostedemail.com (Postfix) with ESMTP id 5D9D2100004 for ; Mon, 30 Jun 2025 04:48:47 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf14.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@arm.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751258928; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:references; bh=YwehwLzaA7gg89oKoSxpwkeVF9b75oANJiGoh5PNpdg=; b=LOrCC3hy4k8Ve+mqt2htaAmjnMYNE1uB3IaPuNSeThrMHUR+8VNzMjrq+mpLYJ/4AhDI/d VXHU7Koxtvr/mV0UpIESzHWA46CopMKcCDUWUs8F8aAllxwyTecrn8ikMFgbA0CCExUNLj UYNAjJuoTk/38HqLQ0QlVWrkee3N0yQ= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751258928; a=rsa-sha256; cv=none; b=agjV+Di+c+ZlOFBm/3iDnNtkgrE0gCObJg4sQwkDtO8IkkBOkbdKQ8g6rm6anDKpaDog+1 gjj3tVFNw89b3tpKpxk1MCI+GR84/U13Kr+NI/6wVBkaGwLp9H09b30s1sNrONa56vE2g5 wmiINQ972ErnSFxjj/hvmF0PvbmvGGg= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=arm.com; spf=pass (imf14.hostedemail.com: domain of dev.jain@arm.com designates 217.140.110.172 as permitted sender) smtp.mailfrom=dev.jain@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 475181F60; Sun, 29 Jun 2025 21:48:30 -0700 (PDT) Received: from MacBook-Pro.blr.arm.com (MacBook-Pro.blr.arm.com [10.164.18.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5D2093F58B; Sun, 29 Jun 2025 21:48:42 -0700 (PDT) From: Dev Jain To: akpm@linux-foundation.org, david@redhat.com Cc: ziy@nvidia.com, baolin.wang@linux.alibaba.com, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, npache@redhat.com, ryan.roberts@arm.com, baohua@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Dev Jain Subject: [PATCH] khugepaged: Reduce race probability between migration and khugepaged Date: Mon, 30 Jun 2025 10:18:37 +0530 Message-Id: <20250630044837.4675-1-dev.jain@arm.com> X-Mailer: git-send-email 2.39.3 (Apple Git-146) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: hfe9cf83hxwnwg8sizyr1xwn1sfc7y5o X-Rspamd-Queue-Id: 5D9D2100004 X-Rspam-User: X-Rspamd-Server: rspam07 X-HE-Tag: 1751258927-311234 X-HE-Meta: U2FsdGVkX1/E5IIwNfnTcEYjzRUtQVMRqFKDYtBAoWHvWj104AjH1sIIhf69zRuRzmAVTuDIJUdgIhdksxi4fixutGIsRUoJW0eDpErkmgj5zrr6zu7UZsGieFzP/tUaDNAZlGvmKi+O82jWqvzPmJACwJahihHnTtkCL8Nq7ZnMcizkHRN/RJw1msEUbmQX3TvjWUckX8Bsy9UbznEY8Yiv/5IhQK3GunINGj8fkiXOvZcA2ZENY1aUiHUQ0TjujT6Umq0uPmO2YRtdy1CL4E2JksWjET5vzafrZjIdm7tsIACBI89AVZY8yup6VfM2FFWzp0EggWzdfr28zDuercfcLkVvo3Xb1abbbrHsrNwmqk+W4pa3dAig6jDDwLCoSk5RUl21vDD0F/rC2x5tqc2rmTIVixBfJXHC5+X7jwnQExZHJANIjRij8QwX4GG6Rn88V0OM4uRXN5dN03q8aqZDjTLbdXFl2VA9Q+2wGpzobSjvpDeTyxFjQX8GNtibyMRo7NuiM7pdsGFioF40w+rn/STAlH4ylUaskcWYVD2ms6yJmFS9Q6kfB/WoAiNnUxoyeoGxj/N+uahlnYqSvEzLu9b1zd+H1ynVj+JoviLaeHYgIB9Vq9b40xWIneO8IxKtfdJ/kzydXQYMy2VSgRFXJD48++xVWyGM+q2czzoTGSGwkRs0/UHbJEWV3JLs1aDWnSgV26hJj6fHwKNSQ2OhJnIbPvLaaHxovQtZmstoV2ZurYiclVT54D52Spc//+LrZsHGYEo/IOZhsO5RU1SuG4HC704csCZqtqmYp44yswBaCjO40eBhgwtKKH+h7E4wVm0fHAzx7K7zs2zMd908LlmfWoJKsbthlAzEhilDcAR4kDHcUTUXX/gvUIXSXhUg+NjJ8dVPPpDt6jUNRqdoTk5xXMiVkwweBT3QzL7uxOXKcFGjJ0vw/dfV29aFFygMhoqmnnL5TN85bkP VxiGtRE5 ISBlPdJ1rYzm2/MLhkVnCNfuiCns1dUUvi8/XiTeFJti7ZTdS5DkmuyM/OmbqSKDGowdyi5YdC6Tq5Xrnf1TbU9HYd/zVDr+Fd4g7CMSK3/x3Xgv2RSHAjzSFVH1anXVSIv9hakR4PQHdeh/GSHF8ZGQrhXeFWWZgiK2whuoYeen2rocoR9+qBxL4QLfp3rpk5nf95bvmnVp2UPngQB4qDIjFOw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Suppose a folio is under migration, and khugepaged is also trying to collapse it. collapse_pte_mapped_thp() will retrieve the folio from the page cache via filemap_lock_folio(), thus taking a reference on the folio and sleeping on the folio lock, since the lock is held by the migration path. Migration will then fail in __folio_migrate_mapping -> folio_ref_freeze. Reduce the probability of such a race happening (leading to migration failure) by bailing out if we detect a PMD is marked with a migration entry. This fixes the migration-shared-anon-thp testcase failure on Apple M3. Note that, this is not a "fix" since it only reduces the chance of interference of khugepaged with migration, wherein both the kernel functionalities are deemed "best-effort". Signed-off-by: Dev Jain --- This patch was part of https://lore.kernel.org/all/20250625055806.82645-1-dev.jain@arm.com/ but I have sent it separately on suggestion of Lorenzo, and also because I plan to send the first two patches after David Hildenbrand's folio_pte_batch series gets merged. mm/khugepaged.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 1aa7ca67c756..99977bb9bf6a 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -31,6 +31,7 @@ enum scan_result { SCAN_FAIL, SCAN_SUCCEED, SCAN_PMD_NULL, + SCAN_PMD_MIGRATION, SCAN_PMD_NONE, SCAN_PMD_MAPPED, SCAN_EXCEED_NONE_PTE, @@ -941,6 +942,8 @@ static inline int check_pmd_state(pmd_t *pmd) if (pmd_none(pmde)) return SCAN_PMD_NONE; + if (is_pmd_migration_entry(pmde)) + return SCAN_PMD_MIGRATION; if (!pmd_present(pmde)) return SCAN_PMD_NULL; if (pmd_trans_huge(pmde)) @@ -1502,9 +1505,12 @@ int collapse_pte_mapped_thp(struct mm_struct *mm, unsigned long addr, !range_in_vma(vma, haddr, haddr + HPAGE_PMD_SIZE)) return SCAN_VMA_CHECK; - /* Fast check before locking page if already PMD-mapped */ + /* + * Fast check before locking folio if already PMD-mapped, or if the + * folio is under migration + */ result = find_pmd_or_thp_or_none(mm, haddr, &pmd); - if (result == SCAN_PMD_MAPPED) + if (result == SCAN_PMD_MAPPED || result == SCAN_PMD_MIGRATION) return result; /* @@ -2716,6 +2722,7 @@ static int madvise_collapse_errno(enum scan_result r) case SCAN_PAGE_LRU: case SCAN_DEL_PAGE_LRU: case SCAN_PAGE_FILLED: + case SCAN_PMD_MIGRATION: return -EAGAIN; /* * Other: Trying again likely not to succeed / error intrinsic to @@ -2802,6 +2809,7 @@ int madvise_collapse(struct vm_area_struct *vma, unsigned long start, goto handle_result; /* Whitelisted set of results where continuing OK */ case SCAN_PMD_NULL: + case SCAN_PMD_MIGRATION: case SCAN_PTE_NON_PRESENT: case SCAN_PTE_UFFD_WP: case SCAN_PAGE_RO: -- 2.30.2