From nobody Sun Apr 5 18:17:06 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 16E013164DF for ; Mon, 23 Feb 2026 16:42:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771864928; cv=none; b=GdEOPp5rCaiz3TWpt9RZn2bEISvALj4VV1T70DsEadiqFkZ9dXrGM+R2e+c02Fm2a0D67wZhW6FvCVNKaijd2bxlFx1WXOEFtDts5jCFo6GbH4tAvvMYqfjHw9bNFIdY8upC1jcYeoG6+QY9ylk9XFfagK9zKyM39amAPF2B/m8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771864928; c=relaxed/simple; bh=AmIef53ET5UNsIt0ynl/BhGBHCMTtv/CuWlgjEBgi58=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=ZsQFE/bzb2k86n8MSsDw/Y7yN4duYfOYI1focdOUhsqEgxiZrrMege88fOjAVHhEiN8cpGk2EWH+BFAW/jz/UH2w8rWBESPSEXoRSqNxmZoT9DireAYQGlwy98vqz9x85gZfTLsWK+2uJOYmbeA+kaL3prmKYovPfpUeDWT4CRQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NLHfNXig; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NLHfNXig" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 27663C116C6; Mon, 23 Feb 2026 16:42:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1771864927; bh=AmIef53ET5UNsIt0ynl/BhGBHCMTtv/CuWlgjEBgi58=; h=From:To:Cc:Subject:Date:From; b=NLHfNXigO+VeoRtLpSAQ4qS+vR0aga2R6gXWVYEYm71fWRfYJ6+kFaVXFNxXgm8Bs jd6Zr1ijCryiiOHfMqUyvHBufHtarhbpO8/lzm3khYezPELSvyPgHD6RB6EKHKA1+g wF20HGvWYSHusCkffngqv4zhr7HkB2yJlZWsDTuT4tWyMMKKP+KVV+bnrNro1gDC2U 56ze33Z+CL7qaEYENwGJTZ9lNy4HU2CoksBjHQmFbqyN3cfEXbKqzZpGVrAOVXPca2 qKLRoK4J0p6OibyHk0FUksWphP9jfILomVlP+o6cIMonKCAhji3ofK6Iu9CRQ3SUlc 5O0NDXxWwDi6Q== From: "David Hildenbrand (Arm)" To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, "David Hildenbrand (Arm)" , Andrew Morton , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Rik van Riel , Harry Yoo , Jann Horn Subject: [PATCH v1] mm: centralize+fix comments about compound_mapcount() in new sync_with_folio_pmd_zap() Date: Mon, 23 Feb 2026 17:39:20 +0100 Message-ID: <20260223163920.287720-1-david@kernel.org> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We still mention compound_mapcount() in two comments. Instead of simply referring to the folio mapcount in both places, let's factor out the odd-looking PTL sync into sync_with_folio_pmd_zap(), and add centralized documentation why this is required. Cc: Andrew Morton Cc: Lorenzo Stoakes Cc: "Liam R. Howlett" Cc: Vlastimil Babka Cc: Mike Rapoport Cc: Suren Baghdasaryan Cc: Michal Hocko Cc: Rik van Riel Cc: Harry Yoo Cc: Jann Horn Signed-off-by: David Hildenbrand (Arm) --- mm/internal.h | 19 +++++++++++++++++++ mm/memory.c | 8 +------- mm/page_vma_mapped.c | 11 ++--------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/mm/internal.h b/mm/internal.h index cb0af847d7d9..e0ef192b0be3 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -516,6 +516,25 @@ void free_pgtables(struct mmu_gather *tlb, struct unma= p_desc *desc); =20 void pmd_install(struct mm_struct *mm, pmd_t *pmd, pgtable_t *pte); =20 +/** + * sync_with_folio_pmd_zap - sync with concurrent zapping of a folio PMD + * @mm: The mm_struct. + * @pmdp: Pointer to the pmd that was found to be pmd_none(). + * + * When we stumble over a pmd_none() without holding the PTL while unmappi= ng a + * folio that could have been mapped at that PMD, it could be that concurr= ent + * zapping of the PMD is not complete yet. While the PMD might be pmd_none= () + * already, the folio might still appear to be mapped (folio_mapped()). + * + * Wait for concurrent zapping to complete by grabbing the PTL. + */ +static inline void sync_with_folio_pmd_zap(struct mm_struct *mm, pmd_t *pm= dp) +{ + spinlock_t *ptl =3D pmd_lock(mm, pmdp); + + spin_unlock(ptl); +} + struct zap_details; void unmap_page_range(struct mmu_gather *tlb, struct vm_area_struct *vma, diff --git a/mm/memory.c b/mm/memory.c index 876bf73959c6..c87d796050ba 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2006,13 +2006,7 @@ static inline unsigned long zap_pmd_range(struct mmu= _gather *tlb, } else if (details && details->single_folio && folio_test_pmd_mappable(details->single_folio) && next - addr =3D=3D HPAGE_PMD_SIZE && pmd_none(*pmd)) { - spinlock_t *ptl =3D pmd_lock(tlb->mm, pmd); - /* - * Take and drop THP pmd lock so that we cannot return - * prematurely, while zap_huge_pmd() has cleared *pmd, - * but not yet decremented compound_mapcount(). - */ - spin_unlock(ptl); + sync_with_folio_pmd_zap(tlb->mm, pmd); } if (pmd_none(*pmd)) { addr =3D next; diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c index b38a1d00c971..a4d52fdb3056 100644 --- a/mm/page_vma_mapped.c +++ b/mm/page_vma_mapped.c @@ -269,11 +269,6 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk = *pvmw) spin_unlock(pvmw->ptl); pvmw->ptl =3D NULL; } else if (!pmd_present(pmde)) { - /* - * If PVMW_SYNC, take and drop THP pmd lock so that we - * cannot return prematurely, while zap_huge_pmd() has - * cleared *pmd but not decremented compound_mapcount(). - */ const softleaf_t entry =3D softleaf_from_pmd(pmde); =20 if (softleaf_is_device_private(entry)) { @@ -284,11 +279,9 @@ bool page_vma_mapped_walk(struct page_vma_mapped_walk = *pvmw) if ((pvmw->flags & PVMW_SYNC) && thp_vma_suitable_order(vma, pvmw->address, PMD_ORDER) && - (pvmw->nr_pages >=3D HPAGE_PMD_NR)) { - spinlock_t *ptl =3D pmd_lock(mm, pvmw->pmd); + (pvmw->nr_pages >=3D HPAGE_PMD_NR)) + sync_with_folio_pmd_zap(mm, pvmw->pmd); =20 - spin_unlock(ptl); - } step_forward(pvmw, PMD_SIZE); continue; } --=20 2.43.0