From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B920837BE8D for ; Wed, 19 Aug 2026 11:24:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787138670; cv=none; b=QV7yB3dwAuZx7tkNfxqTlNeFwQ4+6vhtP/tiRoL4mM+g6Qwct3YCVqZKqzxXGZ2nJuJvWnctCiQaxuH8Jry1L2RKrfM7Ip/WDx+y+xAiUgEz7t7JbT6VtfMrELBSQASWeN0UVrFYeMP7bSIyN+4TjXue6DvFKfGquScUK6tWvi8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787138670; c=relaxed/simple; bh=0XsmEEkDtUzSOFxgh3dh0ChDg+YntQUZuoZXadmJDtU=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=RJGQ5Bb+mjFTFrmHYlfKnSwuA6TFujv56UNWpwUyk8mJ6TAiukG4cO23cJVVKnLz3vY+C3eGIEDVqrlnMscpP3VhoDaXHm9BDDRiratMRh9ohp9KxDvvzOp5chiJiQLJOVDYOABHqU1EkhlWLCmfpS3JJipWMsHVc9zxSlEWLv8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=jBYSRZER; arc=none smtp.client-ip=209.85.128.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="jBYSRZER" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4954f5e8020so5074785e9.2 for ; Wed, 19 Aug 2026 04:24:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1787138667; x=1787743467; darn=vger.kernel.org; h=in-reply-to:content-disposition:content-type:mime-version :references:message-id:subject:cc:to:from:date:from:to:cc:subject :date:message-id:reply-to:content-type; bh=F3NgZBE9hRs9qXlD6E6LALHZpzbe9DU4fqAWKNGx43k=; b=jBYSRZERMpvSBDiu6cvf/mybKmRXUP9N5rA1XfkLm9Vp4nci1mENt7O147ofJTYVC5 g7aeY/rhOHVIk11D5Xx7xRDgAHuWgz56YcYG/tkrHBEgwsbYC7I/vdbCIkO1pxHE+RaS 9hie5KP3MlZtoTV5UPM896QOe0XDvfBnKA+CCyKBhVcDkhi2HQIYqN4pqONQPiRdl3Qg TxJBILl76PzUsPZ2BERJauROAV/7XB01co12HlNowYGb4EG6/cEIPUba9P9s0LN4pw97 gik4cScXlf6wUZ0oBf8fdbFkvMSUbS5/bjUsbn0DyLq0wlbBEhiJVSBRGmk1Fj97fY9c coZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787138667; x=1787743467; h=in-reply-to:content-disposition:content-type:mime-version :references:message-id:subject:cc:to:from:date:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=F3NgZBE9hRs9qXlD6E6LALHZpzbe9DU4fqAWKNGx43k=; b=FrmkRAP5nqG1N972nzOhDNKy3IuCJIpeHvwuHMTWmCD4Kcx0sea85oBtiPfjo3cjJ6 ShBcvqzSfRARlEiCVqbLw0m05Sqct7VFoawo2O61HtPVRKjo1hy/K9zZav4/QZRxfVwc NSp0VNGUykE2+USg2eQy5NIJGsmKEJaxw90stYxYYGD+RtSVmmI2z8LW/cWKS9vTxMd4 H/ip7qRX+bao1/fyw3ejXUUMU+e19yfw9g5dgyk9i6bUXauym5f31EnjT1/+3uK7UCcS bSLcMnSTL8fLklHZGuoqYwbLprXjq7W7UEDTZdqZaGCX9fqE1wgCnFmV+MkSdUFE7Z5l VcCQ== X-Forwarded-Encrypted: i=1; AHgh+RpfsW+/3HTzlpoDUg0DtOzqMKHW4dYebIFuVsMS8JB8j5pMtDta1ipREU5T3Ccz/BW2eSyDtu0SWwOyYqQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywp7vlOOMvrvisJwXrjEyuU5Mq6Z9X0qnSKyanInStq1GdUp/Tk C9/OxiV4AFJlnU4dwPPUPfPReDMD2sE5qaM9d3uLqHdJXe+d1AHCmazL X-Gm-Gg: AR+sD13ls96IzWR3f+P0JhUFWtFOT3+mQaUyaBoxX+JCyajN+WA3I2M0EPQUM42eUPz KTF5XDI5nB7fhUQLkaS8Dm8gE83L9ozLrhOqar2jX80wnHfXnS9nQDue9jk7jtOJnniBww1PUxX zeUpJbcyYGM2HfkhkxB6zGztPsDMzKvJNeLLh8oSyFuJnG9o3gHHrLl1IYP5HodrN1rEkEHV3oL fI8F/X4z92jWk4rBXn+UHVuTryPtx3YU3iqrIOqxKFKmKn+ZDJC380+aY1mUAZy//6EOwHS04GE s1b9Yl5yYc5HFvBWUsLAqWnV77UX8qR4ypFCyu6QC/4CqlnaI2y4Y+vyGBQweaJaVNJmClmv78w KLoZwNOD1tG2qvYIlBr0p7r5ae8ZJuE6wEUvPOwzm5qH724Dca1+wSkAncWUMs7poCsl7719M7r myFwt14m4t2wY/omFGde4vAzR/fwwVfZkOUm7Zxqks/duc+43EJ02jnYllb+hjSTlgfobqbtjop 78ZwqM2xlVrDx07dBRkYS+nsAKjNt9v0GA5wH2iLkCrbgXyVjfjianHXxqVpCWx2PzKjxpE X-Received: by 2002:a05:600c:a05:b0:495:3da3:beb with SMTP id 5b1f17b1804b1-499aa1b6a02mr61478655e9.10.1787138666712; Wed, 19 Aug 2026 04:24:26 -0700 (PDT) Received: from localhost (pat-125-254.wlan.net.ed.ac.uk. [192.41.125.254]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482b1441753sm5668998f8f.5.2026.08.19.04.24.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 19 Aug 2026 04:24:25 -0700 (PDT) Date: Wed, 19 Aug 2026 12:24:19 +0100 From: Karim Manaouil To: Shivank Garg Cc: Andrew Morton , David Hildenbrand , Lorenzo Stoakes , Rik van Riel , "Liam R. Howlett" , Vlastimil Babka , Harry Yoo , Jann Horn , Lance Yang , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Zi Yan , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Frank van der Linden , Kinsey Ho , Wei Xu , Bharata B Rao , David Rientjes , Dev Jain , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 3/7] mm/migrate: split remove_migration_pte_hugetlb() out of remove_migration_pte() Message-ID: <20260819112419.n4fkhvbxxfhsyhun@wrangler> References: <20260813-migrate-rmap-batch-v2-0-3c5424c555c7@amd.com> <20260813-migrate-rmap-batch-v2-3-3c5424c555c7@amd.com> 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=us-ascii Content-Disposition: inline In-Reply-To: <20260813-migrate-rmap-batch-v2-3-3c5424c555c7@amd.com> Hi Shivank, On Thu, Aug 13, 2026 at 04:23:14AM +0000, Shivank Garg wrote: > remove_migration_pte() interleaves hugetlb handling with the regular > folio path. Move it into a dedicated callback selected by > remove_migration_ptes(), leaving the generic callback focused on regular > folios ahead of PTE batching. > > With hugetlb folios routed separately, simplify the PMD mapping check to > a one-time warning. > > Signed-off-by: Shivank Garg > --- > mm/migrate.c | 97 +++++++++++++++++++++++++++++++++++++++--------------------- > 1 file changed, 63 insertions(+), 34 deletions(-) > > diff --git a/mm/migrate.c b/mm/migrate.c > index a3362cc9ef66..ee1b8a55a2a4 100644 > --- a/mm/migrate.c > +++ b/mm/migrate.c > @@ -375,6 +375,57 @@ static pte_t migration_entry_to_pte(struct folio *folio, struct page *new, > return pte; > } > > +/* > + * Restore a potential migration pte to a working pte entry for hugetlb folios. > + */ > +#ifdef CONFIG_HUGETLB_PAGE > +static bool remove_migration_pte_hugetlb(struct folio *folio, > + struct vm_area_struct *vma, unsigned long addr, void *arg) > +{ > + struct rmap_walk_arg *rmap_walk_arg = arg; > + DEFINE_FOLIO_VMA_WALK(pvmw, rmap_walk_arg->folio, vma, addr, PVMW_SYNC | PVMW_MIGRATION); > + struct hstate *h = hstate_vma(vma); > + unsigned int shift = huge_page_shift(h); > + unsigned long psize = huge_page_size(h); > + struct page *new = folio_page(folio, 0); > + rmap_t rmap_flags = RMAP_NONE; > + pte_t old_pte, pte; > + softleaf_t entry; > + > + /* There is only a single mapping in a VMA. */ I don't think this comment is necessary. page_vma_mapped_walk() clearly explains what happens with HugeTLB entries. > + if (!page_vma_mapped_walk(&pvmw)) > + return true; > + > + old_pte = huge_ptep_get(vma->vm_mm, pvmw.address, pvmw.pte); > + entry = softleaf_from_pte(old_pte); > + folio_get(folio); > + pte = migration_entry_to_pte(folio, new, entry, old_pte, vma, &rmap_flags); > + pte = arch_make_huge_pte(pte, shift, vma->vm_flags); > + if (folio_test_anon(folio)) > + hugetlb_add_anon_rmap(folio, vma, pvmw.address, rmap_flags); > + else > + hugetlb_add_file_rmap(folio); > + set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte, psize); I know nothing in HugeTLB, but can't they be mapped as 4KiB entries? In which case we have to use while (page_vma_mapped_walk(&pvmw)) { ... } It seems like it's not the case from my little investigation, but I'll keep it here just to be sure. > + if (READ_ONCE(vma->vm_flags) & VM_LOCKED) > + mlock_drain_local(); > + > + trace_remove_migration_pte(pvmw.address, pte_val(pte), compound_order(new)); > + > + /* No need to invalidate - it was non-present before */ > + update_mmu_cache(vma, pvmw.address, pvmw.pte); > + page_vma_mapped_walk_done(&pvmw); > + > + return true; > +} > +#else > +static bool remove_migration_pte_hugetlb(struct folio *folio, > + struct vm_area_struct *vma, unsigned long addr, void *arg) > +{ > + return false; > +} > +#endif /* CONFIG_HUGETLB_PAGE */ > + > /* > * Restore a potential migration pte to a working pte entry > */ > @@ -395,20 +446,14 @@ static bool remove_migration_pte(struct folio *folio, > #ifdef CONFIG_ARCH_HAS_PMD_SOFTLEAVES > /* PMD-mapped THP migration entry */ > if (!pvmw.pte) { > - VM_BUG_ON_FOLIO(folio_test_hugetlb(folio) || > - !folio_test_pmd_mappable(folio), folio); > + VM_WARN_ON_ONCE_FOLIO(!folio_test_pmd_mappable(folio), folio); > remove_migration_pmd(&pvmw, folio); > continue; > } > #endif > - if (folio_test_hugetlb(folio)) > - old_pte = huge_ptep_get(vma->vm_mm, pvmw.address, > - pvmw.pte); > - else > - old_pte = ptep_get(pvmw.pte); > - > + old_pte = ptep_get(pvmw.pte); > entry = softleaf_from_pte(old_pte); > - if (folio_test_large(folio) && !folio_test_hugetlb(folio)) > + if (folio_test_large(folio)) > idx = softleaf_to_pfn(entry) - pvmw.pfn; > > if (rmap_walk_arg->map_unused_to_zeropage && > @@ -434,30 +479,12 @@ static bool remove_migration_pte(struct folio *folio, > pte = pte_swp_mkuffd(pte); > } > > -#ifdef CONFIG_HUGETLB_PAGE > - if (folio_test_hugetlb(folio)) { > - struct hstate *h = hstate_vma(vma); > - unsigned int shift = huge_page_shift(h); > - unsigned long psize = huge_page_size(h); > - > - pte = arch_make_huge_pte(pte, shift, vma->vm_flags); > - if (folio_test_anon(folio)) > - hugetlb_add_anon_rmap(folio, vma, pvmw.address, > - rmap_flags); > - else > - hugetlb_add_file_rmap(folio); > - set_huge_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte, > - psize); > - } else > -#endif > - { > - if (folio_test_anon(folio)) > - folio_add_anon_rmap_pte(folio, new, vma, > - pvmw.address, rmap_flags); > - else > - folio_add_file_rmap_pte(folio, new, vma); > - set_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte); > - } > + if (folio_test_anon(folio)) > + folio_add_anon_rmap_pte(folio, new, vma, > + pvmw.address, rmap_flags); > + else > + folio_add_file_rmap_pte(folio, new, vma); > + set_pte_at(vma->vm_mm, pvmw.address, pvmw.pte, pte); > if (READ_ONCE(vma->vm_flags) & VM_LOCKED) > mlock_drain_local(); > > @@ -484,7 +511,9 @@ void remove_migration_ptes(struct folio *src, struct folio *dst, > }; > > struct rmap_walk_control rwc = { > - .rmap_one = remove_migration_pte, > + .rmap_one = folio_test_hugetlb(src) ? > + remove_migration_pte_hugetlb : > + remove_migration_pte, > .arg = &rmap_walk_arg, > }; > > > -- > 2.43.0 > -- ~karim