From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BAFB13A5989 for ; Sat, 30 May 2026 10:52:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780138362; cv=none; b=DB7I4yEoK1/vp0OuI4O/PzPOFFZvaIDSZwjBG3pxBDrEq/KNqQVSWD4V+MeTaSkNqgzax013ZX+v2/y9/ZViJvv/qS2n9J6bY+c/uQQuGbxts+I30Zj0uTVbJBJVkmgo4hi4Nev6s++P1RSAzA5Pfems814aFNZGweyp4WAcd/M= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780138362; c=relaxed/simple; bh=IRB2iUSZlF+4B36zLYCZmG2byzCA3hjjSeX3L63NPFA=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=gLl/H45KXP3AHXsWtrFWraje+37VB8sWJlisA2I16L0cuD97ZRIC8dmIRdu4AaBe2wwPWfesewk13K05zYieiUDM/Zsh+bwu+wSy+7tanodBKI427a68ehU6+7r3AtAnqH40/Ar4EMIJCD6pJfg+qD9cQSmOJHOwzcRXQYfhSuo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=VvDm716X; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="VvDm716X" 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 E93831BF3; Sat, 30 May 2026 03:52:27 -0700 (PDT) Received: from [10.164.11.56] (unknown [10.164.11.56]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 171383F632; Sat, 30 May 2026 03:52:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1780138352; bh=IRB2iUSZlF+4B36zLYCZmG2byzCA3hjjSeX3L63NPFA=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=VvDm716X2oykls6h1dneSKEtDO5vhmJdYMc63tuRyg/bWbT054/MblDgciIBZBfUx SDFcQ8enxKlVsOgF7PM766TTXyaGDZXd1k+tVxohyDkYBvQwBfGEpJX3HU4xQT/S2k XqdEND8Srn/fwwq/sJIo1Q5RJ9aaoBcKIqO9ny+w= Message-ID: Date: Sat, 30 May 2026 16:22:21 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 06/13] mm: add PMD swap entry splitting support To: Usama Arif , Andrew Morton , david@kernel.org, chrisl@kernel.org, kasong@tencent.com, ljs@kernel.org, ziy@nvidia.com Cc: bhe@redhat.com, willy@infradead.org, youngjun.park@lge.com, hannes@cmpxchg.org, riel@surriel.com, shakeel.butt@linux.dev, alex@ghiti.fr, kas@kernel.org, baohua@kernel.org, baolin.wang@linux.alibaba.com, npache@redhat.com, Liam.Howlett@oracle.com, ryan.roberts@arm.com, Vlastimil Babka , lance.yang@linux.dev, linux-kernel@vger.kernel.org, nphamcs@gmail.com, shikemeng@huaweicloud.com, kernel-team@meta.com References: <20260427100553.2754667-1-usama.arif@linux.dev> <20260427100553.2754667-7-usama.arif@linux.dev> Content-Language: en-US From: Dev Jain In-Reply-To: <20260427100553.2754667-7-usama.arif@linux.dev> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 27/04/26 3:31 pm, Usama Arif wrote: > Add a swap branch in __split_huge_pmd_locked() that splits a PMD swap > entry into 512 PTE swap entries. Unlike migration splits, no folio > reference is needed because swap entries point to swap slots, not > pages. Each PTE inherits the correct sub-slot offset and preserves > soft_dirty, uffd_wp, and exclusive flags. > > This branch is reached from the explicit __split_huge_pmd() callers > that hit a non-present PMD: partial-range mprotect / munmap, the > wp_huge_pmd() PMD-COW fallback, and the swap-in / swapoff fallbacks > added in later patches when the cached folio is no longer PMD-sized. > page_vma_mapped_walk() does not iterate PMD swap entries, so > try_to_unmap_one() and try_to_migrate_one() do not reach this branch > and freeze=true cannot occur in this branch today. page and folio > are therefore left uninitialized in the swap branch; a > VM_WARN_ON_ONCE(freeze) catches any future caller that breaks this > invariant before the freeze path dereferences page_to_pfn(page + i) > or put_page(page). > > Signed-off-by: Usama Arif > --- > include/linux/leafops.h | 6 +++--- > mm/huge_memory.c | 27 ++++++++++++++++++++++++++- > 2 files changed, 29 insertions(+), 4 deletions(-) > > diff --git a/include/linux/leafops.h b/include/linux/leafops.h > index 79e04db45bfb..2c0dfce6d0f0 100644 > --- a/include/linux/leafops.h > +++ b/include/linux/leafops.h > @@ -657,9 +657,9 @@ static inline bool pmd_is_swap_entry(pmd_t pmd) > * pmd_is_valid_softleaf() - Is this PMD entry a valid softleaf entry? > * @pmd: PMD entry. > * > - * PMD leaf entries are valid only if they are device private or migration > - * entries. This function asserts that a PMD leaf entry is valid in this > - * respect. > + * PMD leaf entries are valid only if they are device private, migration, > + * or swap entries. This function asserts that a PMD leaf entry is valid > + * in this respect. > * The commentary change can go in the previous patch right? > * Returns: true if the PMD entry is a valid leaf entry, otherwise false. > */ > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index d82a19b5e276..9f67638e43c8 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -3201,6 +3201,12 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > folio_add_anon_rmap_ptes(folio, page, HPAGE_PMD_NR, > vma, haddr, rmap_flags); > } > + } else if (pmd_is_swap_entry(*pmd)) { > + VM_WARN_ON_ONCE(freeze); > + old_pmd = *pmd; > + soft_dirty = pmd_swp_soft_dirty(old_pmd); > + uffd_wp = pmd_swp_uffd_wp(old_pmd); > + anon_exclusive = pmd_swp_exclusive(old_pmd); > } else { > /* > * Up to this point the pmd is present and huge and userland has > @@ -3337,6 +3343,25 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > VM_WARN_ON(!pte_none(ptep_get(pte + i))); > set_pte_at(mm, addr, pte + i, entry); > } > + } else if (pmd_is_swap_entry(old_pmd)) { > + softleaf_t sl_entry = softleaf_from_pmd(old_pmd); > + pte_t swp_pte; > + swp_entry_t sub_entry; > + > + for (i = 0, addr = haddr; i < HPAGE_PMD_NR; > + i++, addr += PAGE_SIZE) { > + sub_entry = swp_entry(swp_type(sl_entry), > + swp_offset(sl_entry) + i); > + swp_pte = swp_entry_to_pte(sub_entry); > + if (soft_dirty) > + swp_pte = pte_swp_mksoft_dirty(swp_pte); > + if (uffd_wp) > + swp_pte = pte_swp_mkuffd_wp(swp_pte); > + if (anon_exclusive) > + swp_pte = pte_swp_mkexclusive(swp_pte); > + VM_WARN_ON(!pte_none(ptep_get(pte + i))); > + set_pte_at(mm, addr, pte + i, swp_pte); > + } > } else { > pte_t entry; > > @@ -3360,7 +3385,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd, > } > pte_unmap(pte); > > - if (!pmd_is_migration_entry(*pmd)) > + if (!pmd_is_migration_entry(*pmd) && !pmd_is_swap_entry(*pmd)) > folio_remove_rmap_pmd(folio, page, vma); > if (freeze) > put_page(page);