From nobody Sun Feb 8 01:21:23 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 66AB5217705 for ; Fri, 31 Oct 2025 17:48:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932926; cv=none; b=P0a2YEtqDCGMTatkyCjxSXOxwVqqHUZgxVCBmUV1HzBB2NBnC00jwcLV7eiA/BbQIjTZ1hKfayRPHr05zmdBeXBIQu4UnasETOjgSfFFyVGPEws6wbAw84GkMmA+GQw8GQeQjvba3ruqAlYtL5KQvTYreFWg6qt+3t5p/01H7cg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932926; c=relaxed/simple; bh=ynE32cVhIxc0WLGtktnzUD/OUTR5RW1yAe38UEyx9e4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=u289JBj68VNT9SsMhCat1RQL1saQbftb1rlTJAN04nXvjWkIY1DfCemNi94TwCWChE/fGBoBOQMi59TXJBr5yGX5OZGojSnH6qzrj0FohS2GROzRIe6GPzK21j6u2qu52mrsg5fOwfIxIEVfAClr96PPmK8g+QSI0zVfssT4x2U= 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=P8J4fe5y; arc=none smtp.client-ip=209.85.214.178 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="P8J4fe5y" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-29555415c5fso130515ad.1 for ; Fri, 31 Oct 2025 10:48:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761932923; x=1762537723; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ICLN39FJdVD/075eTRkrmHvRsCawcGixIB7gQzMC3KY=; b=P8J4fe5y1VECTxaWv85Wb1pI03DDO8JWVwWfdRE06j2K8jwl6stWzQIxIMWeor+G8W k4iNmgmAJp6LQhufi8dIOiSdIuqGFXajrDdFORGVp/BQyL/4kpb7QdXVIrol3kOmHSMq 5vKBaI0kReMYqo9Zze1cJDLD4a0WqtRbOx8DX8pgycaKppLG4zOlioESzEppaK5PiFAT GmXzjHximqdMXeJ8QIvgMpQNZ7rem8thrCjX2F3uxnVKtuhjovu2HbDVPb/ppoYPPF0+ +Tl236l15f+/Wp2tuaxPt6jUsCvpH6JLQMYuMvpUIVqANvyX5jpOQkcBwp/eSRcOpMiP GYqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761932923; x=1762537723; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ICLN39FJdVD/075eTRkrmHvRsCawcGixIB7gQzMC3KY=; b=OsTHH2nnDUm/f3Q/u1W0S7lnGiEda7UPe+7w5/6V6cOU05HHqQ7wrAjlwnBi5OIPxT hW652AKvQmtDdBHf65LV5huO5NZMjQT12BcZvDLTwrRk9D9GxaZvV3KS0V//j9UqS+Jc ZsRNIC1qd6GzLgry/2ctKXl+eXSmN0cavIVdIDI9OeQai8ubkHS9U0epoS9KHQ/YIjm+ QgjtpQGop+jJ7BZ7/CE9UG/OoBwHHLrP/pVOpBY0lTwTmXGKWB0DNq7G9tPAwg43GHXO 9CxvA20iaLqxvHOCYVF865A0vH0KFw6hkzVudZX3yC9pV+S4xia65kPejARP1uc41xGN qvVA== X-Forwarded-Encrypted: i=1; AJvYcCU4/LOb6hmbh/3ihAAHuqoDgYdh31ffULpgyUbOMaCqd6zkXBrFX/bHSNl5lok8pVm7S2TuKzC1X8NTYs0=@vger.kernel.org X-Gm-Message-State: AOJu0YzqqIktsGwksxx9MXQWBAfrxqYAmslj5tBlre1MYUNzH2ADPWRu U9AlZS2fKas/H2U/UICXkkb52Dh8z2zZNFdJW81+snPGN3ZyZfD1tKnA X-Gm-Gg: ASbGncvtIO0ip0sdTbsYGdiyILnTZz2VgiZVu7J3xRKrBHom3brWI/+xikBJXCmj1Hd 7cWwRtl4giX2j8tQGiG0jDhosJQWwzTXJqhGKZ4D8bbmpZfxADe9JpRNOaIGrB+S4UY9OPpAWvu +9KcdySLdIqhA8Ax4Z+33RBzmJcUpMBAg3fChkRhI9Qdf2Rimx8d1Us45AY9q5jhqgVGdqSTToF Y43RCy/SYttKSE5+IKZ2p4nvvvSbPbgSdzc3KqUzAbKYVZzCMntEwbtJEuFQYKM0FyV07p6WCWV MVOzEjU2Gv825PA2yE6sCedNyQIU9D2qEV4Ro74cNtAS5eJdzfcIQuwebBcoNOzblAaseTk6K0P v117203jIXELa+cF1hlpODKEDj7/rZojGVvDVF0QeJy5DCgis6dqNwr16xQXIPem0ETtQQNvkTh hc2vRuRQgYv/0J+QsiF++eti+7 X-Google-Smtp-Source: AGHT+IFLP8ni/MiCCDGUKUMnRDX4e3jWK/OtkBZosJW9tmtouHuYrj2fu9vWtsB0S6HQVfeXxnga7w== X-Received: by 2002:a17:902:e5cc:b0:280:fe18:847b with SMTP id d9443c01a7336-2951a4dfc29mr68076395ad.33.1761932923531; Fri, 31 Oct 2025 10:48:43 -0700 (PDT) Received: from weg-ThinkPad-P16v-Gen-2.. ([177.73.136.69]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29526871693sm30113185ad.20.2025.10.31.10.48.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Oct 2025 10:48:43 -0700 (PDT) From: Pedro Demarchi Gomes To: David Hildenbrand , Andrew Morton Cc: Xu Xin , Chengming Zhou , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Pedro Demarchi Gomes Subject: [PATCH v2 1/3] Revert "mm/ksm: convert break_ksm() from walk_page_range_vma() to folio_walk" Date: Fri, 31 Oct 2025 14:46:23 -0300 Message-ID: <20251031174625.127417-2-pedrodemargomes@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251031174625.127417-1-pedrodemargomes@gmail.com> References: <20251031174625.127417-1-pedrodemargomes@gmail.com> 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" This reverts commit e317a8d8b4f600fc7ec9725e26417030ee594f52 and changes function break_ksm_pmd_entry() to use folios. This reverts break_ksm() to use walk_page_range_vma() instead of folio_walk_start(). This will make it easier to later modify break_ksm() to perform a proper range walk. Suggested-by: David Hildenbrand Signed-off-by: Pedro Demarchi Gomes Acked-by: David Hildenbrand (Red Hat) --- mm/ksm.c | 63 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 4f672f4f2140..922d2936e206 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -607,6 +607,47 @@ static inline bool ksm_test_exit(struct mm_struct *mm) return atomic_read(&mm->mm_users) =3D=3D 0; } =20 +static int break_ksm_pmd_entry(pmd_t *pmd, unsigned long addr, unsigned lo= ng next, + struct mm_walk *walk) +{ + struct folio *folio =3D NULL; + spinlock_t *ptl; + pte_t *pte; + pte_t ptent; + int ret; + + pte =3D pte_offset_map_lock(walk->mm, pmd, addr, &ptl); + if (!pte) + return 0; + ptent =3D ptep_get(pte); + if (pte_present(ptent)) { + folio =3D vm_normal_folio(walk->vma, addr, ptent); + } else if (!pte_none(ptent)) { + swp_entry_t entry =3D pte_to_swp_entry(ptent); + + /* + * As KSM pages remain KSM pages until freed, no need to wait + * here for migration to end. + */ + if (is_migration_entry(entry)) + folio =3D pfn_swap_entry_folio(entry); + } + /* return 1 if the page is an normal ksm page or KSM-placed zero page */ + ret =3D (folio && folio_test_ksm(folio)) || is_ksm_zero_pte(ptent); + pte_unmap_unlock(pte, ptl); + return ret; +} + +static const struct mm_walk_ops break_ksm_ops =3D { + .pmd_entry =3D break_ksm_pmd_entry, + .walk_lock =3D PGWALK_RDLOCK, +}; + +static const struct mm_walk_ops break_ksm_lock_vma_ops =3D { + .pmd_entry =3D break_ksm_pmd_entry, + .walk_lock =3D PGWALK_WRLOCK, +}; + /* * We use break_ksm to break COW on a ksm page by triggering unsharing, * such that the ksm page will get replaced by an exclusive anonymous page. @@ -623,26 +664,16 @@ static inline bool ksm_test_exit(struct mm_struct *mm) static int break_ksm(struct vm_area_struct *vma, unsigned long addr, bool = lock_vma) { vm_fault_t ret =3D 0; - - if (lock_vma) - vma_start_write(vma); + const struct mm_walk_ops *ops =3D lock_vma ? + &break_ksm_lock_vma_ops : &break_ksm_ops; =20 do { - bool ksm_page =3D false; - struct folio_walk fw; - struct folio *folio; + int ksm_page; =20 cond_resched(); - folio =3D folio_walk_start(&fw, vma, addr, - FW_MIGRATION | FW_ZEROPAGE); - if (folio) { - /* Small folio implies FW_LEVEL_PTE. */ - if (!folio_test_large(folio) && - (folio_test_ksm(folio) || is_ksm_zero_pte(fw.pte))) - ksm_page =3D true; - folio_walk_end(&fw, vma); - } - + ksm_page =3D walk_page_range_vma(vma, addr, addr + 1, ops, NULL); + if (WARN_ON_ONCE(ksm_page < 0)) + return ksm_page; if (!ksm_page) return 0; ret =3D handle_mm_fault(vma, addr, --=20 2.43.0 From nobody Sun Feb 8 01:21:23 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 E40AC2D2381 for ; Fri, 31 Oct 2025 17:48:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932931; cv=none; b=Lcm/1+8VwECxJKoWnBs/6I7VEfnx4soXKIFYaZhaEilT1VN33HBkMztmSNpW+pGemHf9/A2eNINMfwcR0y7h/zHsihFxzSmMkwL8qwSflJmEZLiV1sV+EP+myxCaQADnYu44AWDXTEWuBTaifOgSp6QlzyMjCR2kIcGvuECml2M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932931; c=relaxed/simple; bh=fMTeQUScwfPBnCERwqet3M8fXXrksvZoCfqleFsEHLE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Rup0GU48xxRXbbxa9B1o+SuJBLtROf+T+8j2tKUzbRzTyJ0XDtFbgCFeioDF7ggFKoD2u1Nf77KzFYtqyx7wX7qhtgfKVGEGO3F1ivA6Mcczb2Wld3279L3nTxQvbM68RYB2I3ep93TuM7pMreczhhMg/AQDvnfU1p0CzFL6qZU= 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=JiZsNcKt; arc=none smtp.client-ip=209.85.214.180 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="JiZsNcKt" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-294cc96d187so33547985ad.3 for ; Fri, 31 Oct 2025 10:48:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761932928; x=1762537728; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=suj6Dur0K6qgOtTWDhgGJ8k45c2o5OzoxZ5K0IrFENE=; b=JiZsNcKt8NPp/RrufRSvLxDl2LmE91ckCojUGz2co4udPxUEnVR8NIa38kQ954+6GE azgj71pma1uloqjz3WMUvU2HeoDQnfHjTi5s2Vm+V2xrvxVLX209dIlT1KpM15RKQ2Hv 8Jy0q+ejFmNZjGP9KnlCkQLuSlSp0T7gQxq1brYQdjGV+sN/LDZfWP8619rudFcelk17 KzKqcfpgnC2lOLehD1YlVR+5sFA5IuMRRx4W3uwGm4HuBge5dFIOS8XCxs3BpXsGR9Dn 6DdumfdhSSlV3rss0U9gmssnHT+6oYqhC1HaNRn8NUB8C9VJM5UKeCgdY3kIRKr7SDLN Huww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761932928; x=1762537728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=suj6Dur0K6qgOtTWDhgGJ8k45c2o5OzoxZ5K0IrFENE=; b=AXP8ZXVvjBBv25VxkB21NT20PwZ0wPucoLtfZGBchESZnPYLgoLxj8CHrDw0xnygZe dD01co9GXxJJF7EdI+s2DYUeTrXxsIAgskXzrYtg8V05W863SkfRo+V8vIREUsDzAnpo 7R4/sCa2oY0SMYwCtYOwBbGdNP8MCws12J8dlzF8Jf7stVSCvson1ZgQcLKE6umawpVG sFjQSPRsTnPjJGhxin4fOMQIcQT19AZhpAX4/FAUFZf2mGyydtuyfodLbo1/8ii4maXh tdSMCkGsput6z74lbkWITpXvRGvZyLUiZID3ePNZghrNZuMTkzt4By05Pui77Mu/B/9L XhCw== X-Forwarded-Encrypted: i=1; AJvYcCUHeP0CUoDu7FqziyvmWQtG2diGOimKXKtNi9Rg6YW6qvrJ9/FI5YeN8DdEBRyWidSdBu8TMq9lgorJ/2M=@vger.kernel.org X-Gm-Message-State: AOJu0Yx27N4Gb00WokQL5r78x6wY7vwlfyMxmkbXoANB+DHJU9jdTpqt 2kKICPYnKfB81kX3YJYM+s2+kbE0I56J+AuBJy2WISK5tGT0UooATtjf X-Gm-Gg: ASbGncsUpesD7rXdm7LkNSrim61Ik+qM/1j/Ay34Nwd6NsI8ghbsLrFxeGF3qJMUUQ7 9BpRs5toc1jV/b5vlHjzISKf5oZ2zD1Fa9lt5oK+0wumlAbN1+wd5fiHpBeY5SgvbSX9WG8qJYY KG39FhLaEc7Li1kV91SiJAbVYlRCEzJ2+UDU+Rht4WOhROEXXA8TE+1KZ3wfWewc/OGxNZKwPwc p5DIzhp7o+F54jNdmCVISIBE2m2P3rKDSXuJKDB/lFu5LR+ROYGfJR2U19pLzO26v3UCiXfc9A0 f7IkNwDuRI6deg7TZWZHSKIqMhFdP7HCGvPN8P12HaD9pCg0Ek0w0W+wPvmO+dxNTybpK26YFvn WlquwRZadakGHVIPW/O+RtLlQaxKuOHGUbrgmmZIr6BeWSb3oz5u2W2Yai2mCFHH1clhcr5793k nczGcJ/K8pu7yKpg/RfhjV/x7C X-Google-Smtp-Source: AGHT+IEJ5Souq5YXwjodyLW6kaFFMxjoA2rgMiNGNGLghFOxvhist2DSCElTCEeTgxQTMrfnKIBxkg== X-Received: by 2002:a17:903:32cd:b0:295:30d4:23c2 with SMTP id d9443c01a7336-29530d4476amr27224805ad.50.1761932928285; Fri, 31 Oct 2025 10:48:48 -0700 (PDT) Received: from weg-ThinkPad-P16v-Gen-2.. ([177.73.136.69]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29526871693sm30113185ad.20.2025.10.31.10.48.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Oct 2025 10:48:48 -0700 (PDT) From: Pedro Demarchi Gomes To: David Hildenbrand , Andrew Morton Cc: Xu Xin , Chengming Zhou , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Pedro Demarchi Gomes Subject: [PATCH v2 2/3] ksm: perform a range-walk in break_ksm Date: Fri, 31 Oct 2025 14:46:24 -0300 Message-ID: <20251031174625.127417-3-pedrodemargomes@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251031174625.127417-1-pedrodemargomes@gmail.com> References: <20251031174625.127417-1-pedrodemargomes@gmail.com> 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" Make break_ksm() receive an address range and change break_ksm_pmd_entry() to perform a range-walk and return the address of the first ksm page found. This change allows break_ksm() to skip unmapped regions instead of iterating every page address. When unmerging large sparse VMAs, this significantly reduces runtime. In a benchmark unmerging a 32 TiB sparse virtual address space where only one page was populated, the runtime dropped from 9 minutes to less then 5 seconds. Suggested-by: David Hildenbrand Signed-off-by: Pedro Demarchi Gomes Acked-by: David Hildenbrand (Red Hat) --- mm/ksm.c | 88 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 922d2936e206..64d66699133d 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -607,35 +607,55 @@ static inline bool ksm_test_exit(struct mm_struct *mm) return atomic_read(&mm->mm_users) =3D=3D 0; } =20 -static int break_ksm_pmd_entry(pmd_t *pmd, unsigned long addr, unsigned lo= ng next, +struct break_ksm_arg { + unsigned long addr; +}; + +static int break_ksm_pmd_entry(pmd_t *pmdp, unsigned long addr, unsigned l= ong end, struct mm_walk *walk) { - struct folio *folio =3D NULL; + unsigned long *found_addr =3D (unsigned long *) walk->private; + struct mm_struct *mm =3D walk->mm; + pte_t *start_ptep, *ptep; spinlock_t *ptl; - pte_t *pte; - pte_t ptent; - int ret; + int found =3D 0; =20 - pte =3D pte_offset_map_lock(walk->mm, pmd, addr, &ptl); - if (!pte) + if (ksm_test_exit(walk->mm)) return 0; - ptent =3D ptep_get(pte); - if (pte_present(ptent)) { - folio =3D vm_normal_folio(walk->vma, addr, ptent); - } else if (!pte_none(ptent)) { - swp_entry_t entry =3D pte_to_swp_entry(ptent); =20 - /* - * As KSM pages remain KSM pages until freed, no need to wait - * here for migration to end. - */ - if (is_migration_entry(entry)) - folio =3D pfn_swap_entry_folio(entry); + if (signal_pending(current)) + return -ERESTARTSYS; + + start_ptep =3D pte_offset_map_lock(mm, pmdp, addr, &ptl); + if (!start_ptep) + return 0; + + for (ptep =3D start_ptep; addr < end; ptep++, addr +=3D PAGE_SIZE) { + pte_t pte =3D ptep_get(ptep); + struct folio *folio =3D NULL; + + if (pte_present(pte)) { + folio =3D vm_normal_folio(walk->vma, addr, pte); + } else if (!pte_none(pte)) { + swp_entry_t entry =3D pte_to_swp_entry(pte); + + /* + * As KSM pages remain KSM pages until freed, no need to wait + * here for migration to end. + */ + if (is_migration_entry(entry)) + folio =3D pfn_swap_entry_folio(entry); + } + /* return 1 if the page is an normal ksm page or KSM-placed zero page */ + found =3D (folio && folio_test_ksm(folio)) || is_ksm_zero_pte(pte); + if (found) { + *found_addr =3D addr; + goto out_unlock; + } } - /* return 1 if the page is an normal ksm page or KSM-placed zero page */ - ret =3D (folio && folio_test_ksm(folio)) || is_ksm_zero_pte(ptent); - pte_unmap_unlock(pte, ptl); - return ret; +out_unlock: + pte_unmap_unlock(ptep, ptl); + return found; } =20 static const struct mm_walk_ops break_ksm_ops =3D { @@ -661,7 +681,8 @@ static const struct mm_walk_ops break_ksm_lock_vma_ops = =3D { * of the process that owns 'vma'. We also do not want to enforce * protection keys here anyway. */ -static int break_ksm(struct vm_area_struct *vma, unsigned long addr, bool = lock_vma) +static int break_ksm(struct vm_area_struct *vma, unsigned long addr, + unsigned long end, bool lock_vma) { vm_fault_t ret =3D 0; const struct mm_walk_ops *ops =3D lock_vma ? @@ -671,11 +692,9 @@ static int break_ksm(struct vm_area_struct *vma, unsig= ned long addr, bool lock_v int ksm_page; =20 cond_resched(); - ksm_page =3D walk_page_range_vma(vma, addr, addr + 1, ops, NULL); - if (WARN_ON_ONCE(ksm_page < 0)) + ksm_page =3D walk_page_range_vma(vma, addr, end, ops, &addr); + if (ksm_page <=3D 0) return ksm_page; - if (!ksm_page) - return 0; ret =3D handle_mm_fault(vma, addr, FAULT_FLAG_UNSHARE | FAULT_FLAG_REMOTE, NULL); @@ -761,7 +780,7 @@ static void break_cow(struct ksm_rmap_item *rmap_item) mmap_read_lock(mm); vma =3D find_mergeable_vma(mm, addr); if (vma) - break_ksm(vma, addr, false); + break_ksm(vma, addr, addr + PAGE_SIZE, false); mmap_read_unlock(mm); } =20 @@ -1072,18 +1091,7 @@ static void remove_trailing_rmap_items(struct ksm_rm= ap_item **rmap_list) static int unmerge_ksm_pages(struct vm_area_struct *vma, unsigned long start, unsigned long end, bool lock_vma) { - unsigned long addr; - int err =3D 0; - - for (addr =3D start; addr < end && !err; addr +=3D PAGE_SIZE) { - if (ksm_test_exit(vma->vm_mm)) - break; - if (signal_pending(current)) - err =3D -ERESTARTSYS; - else - err =3D break_ksm(vma, addr, lock_vma); - } - return err; + return break_ksm(vma, start, end, lock_vma); } =20 static inline --=20 2.43.0 From nobody Sun Feb 8 01:21:23 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (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 6E3CA309EF6 for ; Fri, 31 Oct 2025 17:48:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932938; cv=none; b=Rt+d+PEPfk2F1AcEuJxKH4vrHlDv/iDVGdxngy6YHvXocYDbNHoB+cQ/3MOwF2qmm9BFlvE8u9UUGgE3IKVJOg8OkD9UpVAENy03l71SlRkILpIZVxzdy7L+aF64PHaeYrr52FdkltMLepJULTC6DlbUldiGGhAgxEX3HzDKkCI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1761932938; c=relaxed/simple; bh=8SXtQpPzzR/08szjDRCeR5eiZXk0L/vWm4qKLnT09G4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NIm04hdcbNcjgyTEd7ATvnsK88bWrD35P/uXKAXpJ68ZpYc64u2SVvVmJ+6dc2DTr1Ufhi+Rvjw/3+p3fIVzXgrSnYnBvLcmgTszMK9jq+wBJRed8CfA6sTnwtRUH2kyCri8I8gsi9z/m6Qpx8YE4Rs6C2ulE9Jug++V/p4bUc8= 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=TRAmexoY; arc=none smtp.client-ip=209.85.215.175 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="TRAmexoY" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-b556284db11so2071200a12.0 for ; Fri, 31 Oct 2025 10:48:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1761932936; x=1762537736; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PUPskgZ2IwxfUAiutZm0xbNgmm0EpWQfATFCqCIntuE=; b=TRAmexoY2yAMZDFwq2O2wSQVHw6V7ZmzXFDfIimckUomQn18n41uKyM+l0IiA5ww7i NlVYpAbTy0LYeOphbjiB9IbJAkKXX/d9zyaKKFO5hw87/MjXemkprQs97FeUrbN9qu37 I4UIjtjCYAJLds6BB/FjvLXxwjJHGvsN3FUbiyXTbNcUr8ps6l5kDb/gYnxgBZ0myiHQ p/4x75gzYG3dLWwUznWYbsAymGq1NqQv0lK+b/XsvpU5L/an/Lvlv2v55NA5HB97ntzj Cz2pKHTl5L3n1GQ9dkuX7L1llwJwX2Uljt+Kh5V+Cvzz6b6TN4Z2ym18TMMNYC8uhw54 4jxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1761932936; x=1762537736; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=PUPskgZ2IwxfUAiutZm0xbNgmm0EpWQfATFCqCIntuE=; b=fJ2yfGWdi53omL1FS1TYcRMDt+K5T//kJIWJdp6LT2Chg7kLEwybqbVbzPoMPs0b6/ YeWYx0n8QkX9RVu25QAe+m1Q60QfROwRtCxxA4wQlSwM9pfHyK1dOWRYqdTRqYQfT6Zo g+sovZ1+fMTd11xfkTDgUZMjdlR8ef3O9yXrwuZkpavjcFK41gKk7fjJl7atDldEaC/O ulnz6MjqjSUcZSlR4web9xPmt275Wg6YABDRWTdI/WdYNxdEd1SwHrwmnOM3DZ/n2Hzg Nkc+CD1dDjsjSC3Dacxs8dMSGIYQY1Uk8dTfbQtkN51P3/eTFR8XELUmYb+tFgIkcFy3 BCcg== X-Forwarded-Encrypted: i=1; AJvYcCUQHl7NQIXHSiIgwaGQMo0Pc/ZXdLkTAmVKgWb2svcFJ2vZUVmHVu8+E2yUjTU93hx+GRRHUBNNkHglOfk=@vger.kernel.org X-Gm-Message-State: AOJu0Yxo8FiGi3/UOQP3WtGEgLCmgGHVZv1nK+F74rvTvevWVjI0uYs6 AGM1PCB/h7+NL2xPHdcnWdwR9Hchte+V/UMNkdKH5Eb9kPzuI6ia44di X-Gm-Gg: ASbGncubxzSHW0Uf/mSEx/TurEZ9ksAQMTLeaq6K4sf0Z1ypsWzyNUqYCJkxIyXddVi fFkWJNu0+R9rR9XXZinc2rvzyyKe/oQ93C7HA0XDF7tDUq/qdrBbVQpK66pcpkY49GDWhWR7rH9 +JXM37s/JoZtKkQVs7HzdWgzYa9fJMCGj4CIarXyH0Q43XsO0+FQe77JM4ABi2fJ386XV27Ng2V vSFABFi5acQEuTL+dkKCJQ6Ab1DIEyfU9ddM4xDFA4mBTfLv5RdRrRjSX+fotcj5nhsZUHjhZYH G6wdL9hjuTNs0oKJRPywElR5xzyx4dGOtxHc2ltgeEBTYPYcP81Isonw/mHltdAL3Lk/agGZYyE nzE32Kj2HDhi53Dq4ugcTeLdh6M9vTKdJtpPd078+XbbwLltt6/dW5yttLPN9WS+P07KY/uozrM N1VwvRxsZePlfik5QcuZYYehMP X-Google-Smtp-Source: AGHT+IFhSYtCMU4JzYA6EJXN00Jwg3bj+x1htmVLhTklDNpuQrO6NhH17BJNDWBo1Bau8BMQrknvKg== X-Received: by 2002:a17:903:11c3:b0:290:c5e5:4d90 with SMTP id d9443c01a7336-2951a524561mr52125235ad.42.1761932935457; Fri, 31 Oct 2025 10:48:55 -0700 (PDT) Received: from weg-ThinkPad-P16v-Gen-2.. ([177.73.136.69]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29526871693sm30113185ad.20.2025.10.31.10.48.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Oct 2025 10:48:55 -0700 (PDT) From: Pedro Demarchi Gomes To: David Hildenbrand , Andrew Morton Cc: Xu Xin , Chengming Zhou , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Pedro Demarchi Gomes Subject: [PATCH v2 3/3] ksm: replace function unmerge_ksm_pages with break_ksm Date: Fri, 31 Oct 2025 14:46:25 -0300 Message-ID: <20251031174625.127417-4-pedrodemargomes@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251031174625.127417-1-pedrodemargomes@gmail.com> References: <20251031174625.127417-1-pedrodemargomes@gmail.com> 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" Function unmerge_ksm_pages() is unnecessary since now break_ksm() walks an address range. So replace it with break_ksm(). Suggested-by: David Hildenbrand Signed-off-by: Pedro Demarchi Gomes Acked-by: David Hildenbrand (Red Hat) --- mm/ksm.c | 40 ++++++++++++++++------------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 64d66699133d..7cd19a6ce45f 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -669,6 +669,18 @@ static const struct mm_walk_ops break_ksm_lock_vma_ops= =3D { }; =20 /* + * Though it's very tempting to unmerge rmap_items from stable tree rather + * than check every pte of a given vma, the locking doesn't quite work for + * that - an rmap_item is assigned to the stable tree after inserting ksm + * page and upping mmap_lock. Nor does it fit with the way we skip dup'ing + * rmap_items from parent to child at fork time (so as not to waste time + * if exit comes before the next scan reaches it). + * + * Similarly, although we'd like to remove rmap_items (so updating counts + * and freeing memory) when unmerging an area, it's easier to leave that + * to the next pass of ksmd - consider, for example, how ksmd might be + * in cmp_and_merge_page on one of the rmap_items we would be removing. + * * We use break_ksm to break COW on a ksm page by triggering unsharing, * such that the ksm page will get replaced by an exclusive anonymous page. * @@ -1075,25 +1087,6 @@ static void remove_trailing_rmap_items(struct ksm_rm= ap_item **rmap_list) } } =20 -/* - * Though it's very tempting to unmerge rmap_items from stable tree rather - * than check every pte of a given vma, the locking doesn't quite work for - * that - an rmap_item is assigned to the stable tree after inserting ksm - * page and upping mmap_lock. Nor does it fit with the way we skip dup'ing - * rmap_items from parent to child at fork time (so as not to waste time - * if exit comes before the next scan reaches it). - * - * Similarly, although we'd like to remove rmap_items (so updating counts - * and freeing memory) when unmerging an area, it's easier to leave that - * to the next pass of ksmd - consider, for example, how ksmd might be - * in cmp_and_merge_page on one of the rmap_items we would be removing. - */ -static int unmerge_ksm_pages(struct vm_area_struct *vma, - unsigned long start, unsigned long end, bool lock_vma) -{ - return break_ksm(vma, start, end, lock_vma); -} - static inline struct ksm_stable_node *folio_stable_node(const struct folio *folio) { @@ -1231,8 +1224,7 @@ static int unmerge_and_remove_all_rmap_items(void) for_each_vma(vmi, vma) { if (!(vma->vm_flags & VM_MERGEABLE) || !vma->anon_vma) continue; - err =3D unmerge_ksm_pages(vma, - vma->vm_start, vma->vm_end, false); + err =3D break_ksm(vma, vma->vm_start, vma->vm_end, false); if (err) goto error; } @@ -2859,7 +2851,7 @@ static int __ksm_del_vma(struct vm_area_struct *vma) return 0; =20 if (vma->anon_vma) { - err =3D unmerge_ksm_pages(vma, vma->vm_start, vma->vm_end, true); + err =3D break_ksm(vma, vma->vm_start, vma->vm_end, true); if (err) return err; } @@ -3011,7 +3003,7 @@ int ksm_madvise(struct vm_area_struct *vma, unsigned = long start, return 0; /* just ignore the advice */ =20 if (vma->anon_vma) { - err =3D unmerge_ksm_pages(vma, start, end, true); + err =3D break_ksm(vma, start, end, true); if (err) return err; } @@ -3393,7 +3385,7 @@ static int ksm_memory_callback(struct notifier_block = *self, * Prevent ksm_do_scan(), unmerge_and_remove_all_rmap_items() * and remove_all_stable_nodes() while memory is going offline: * it is unsafe for them to touch the stable tree at this time. - * But unmerge_ksm_pages(), rmap lookups and other entry points + * But break_ksm(), rmap lookups and other entry points * which do not need the ksm_thread_mutex are all safe. */ mutex_lock(&ksm_thread_mutex); --=20 2.43.0