From nobody Thu Oct 2 14:19:57 2025 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (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 C99C03002A3; Mon, 15 Sep 2025 15:04:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948678; cv=none; b=qv2fnVtb3+hzTqEHeFw29DnGwImx+Hzu9N46DoX4kDAxTfNWGXaSFflH6eA/V83tpBMVUxyMTe1VEheEa2IUAAzxHoydYFWsWugT86UYqgvQZLkVl+JfpcGXuR0ffNj4wwHHE4VQVvlBZI9/pSvm9UrqwqfTJZltCQYBeIw0o9w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948678; c=relaxed/simple; bh=xvnqzI4YPheYiNJKhNordMfeNl5gOJV4He0BexXkeVo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=avrERplfcmMpw5nLmAOfSJ0/L7DTr9iQ5ZsyO7SBTkt5E7Nl9VhbArFz7+LQaO1h1cq6rsXyFeeNWcqCLl+akq4U4sySP6ueacl+iWXmCO30wQt2IDxXlOQkBAmplQeJ2pTn6nDyalRjHfEYmjo3kU6XSdsIOgi686RCRljIWLQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=P4KvE/Pj; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="P4KvE/Pj" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58FELwsp024260; Mon, 15 Sep 2025 15:03:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=qmdNsGBOZCkUMkcwK u0VTm354ODoqN+DZWqUieU9Sjg=; b=P4KvE/PjXmQhcYMQ/92z+lJ+SPbkepgsg qQVTQRDaPi+IJVTj+XWVi49alUNqJkVI5SBgbR3Luvg/kB+IIYkEvXDcA7DUYel0 mOPa6ZMXRydjjxukpQpz1NzSlEUr87jTGsb+LzznOFHjxZV1e/nq+t9y1LSPwZvE 2BX4NGWKJ0A42v5O6yuVJ1do+QTMjKYllajtJy80TsHxZd4moxt8eaMOgeE66NJa HWVZZROJR+AsgxijjHOCPcG2cJzJyCy8zRw+jBtD7WBAemJbgMx/MNeCQSyWj+pM XOk81pQq5pOSZqN9G50nd8U9PP0xUsQxZZEm//DC6x3wj00XXeIaQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496avnkbfe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:23 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 58FEq3EU014559; Mon, 15 Sep 2025 15:03:23 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496avnkbf5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:22 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58FBalnG022328; Mon, 15 Sep 2025 15:03:20 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 495kxpf11f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:20 +0000 Received: from smtpav05.fra02v.mail.ibm.com (smtpav05.fra02v.mail.ibm.com [10.20.54.104]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58FF3GSJ31785440 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 15 Sep 2025 15:03:16 GMT Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A7E922004B; Mon, 15 Sep 2025 15:03:16 +0000 (GMT) Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF91B20040; Mon, 15 Sep 2025 15:03:13 +0000 (GMT) Received: from li-218185cc-29b5-11b2-a85c-9a1300ae2e6e.in.ibm.com (unknown [9.109.215.183]) by smtpav05.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 15 Sep 2025 15:03:13 +0000 (GMT) From: Donet Tom To: Andrew Morton , David Hildenbrand Cc: Ritesh Harjani , Xu Xin , Chengming Zhou , Wei Yang , Aboorva Devarajan , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Giorgi Tchankvetadze , Donet Tom , stable@vger.kernel.org Subject: [PATCH v2 1/3] mm/ksm: Fix incorrect KSM counter handling in mm_struct during fork Date: Mon, 15 Sep 2025 20:33:04 +0530 Message-ID: <4044e7623953d9f4c240d0308cf0b2fe769ee553.1757946863.git.donettom@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: References: 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 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: -V2HJDoKY9xomFcL3raGfCvo050dAgzB X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTE1MDAyOCBTYWx0ZWRfX/rzsfviO1d4H x7GrWJ8Mgk29wL51Ja/QDFwGSYeT2UMO8mDUHrVq3g1uDW9k25Kh76YPgVs+ejYuAJ2/D/Uxgfc wF/2VXG+sF7URzatS/dGVrOZPS5f+5ogJ5N0d7I119X/0pKBbXm9EMlmyb9lSCJU329Hrdz3dMe pdRONcod6ss1TUFV/ciSbM6Bn31fKTFOBIYez+Idr6EcnEItn4IhYJsNZnY7VGllfUcIW1zih1M yUqBPIq7Qw+QjAJYgUQLoQ4s9hA7pleiqwJ5x76u8ZuZFi4Xze7kAf2Go94vUYkTw+b45zOKHxG WPFwc1LoehS/7C9BBcPQBkzU7rIBbQyuQEzvCDpKwoxbMcZTLqV7EtS62lzlkwyt0f0lXXUw7LR cB8VQkB4 X-Authority-Analysis: v=2.4 cv=HecUTjE8 c=1 sm=1 tr=0 ts=68c82abb cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=yJojWOMRYYMA:10 a=VwQbUJbxAAAA:8 a=VnNF1IyMAAAA:8 a=rGnqKr3d-3nbiQ24QTYA:9 X-Proofpoint-GUID: Swr6_VKceyeMYbvkO6k7QhlnGOpy66FD X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-15_05,2025-09-12_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 adultscore=0 spamscore=0 priorityscore=1501 suspectscore=0 malwarescore=0 bulkscore=0 impostorscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509150028 Content-Type: text/plain; charset="utf-8" Currently, the KSM-related counters in `mm_struct`, such as `ksm_merging_pages`, `ksm_rmap_items`, and `ksm_zero_pages`, are inherited by the child process during fork. This results in inconsistent accounting. When a process uses KSM, identical pages are merged and an rmap item is created for each merged page. The `ksm_merging_pages` and `ksm_rmap_items` counters are updated accordingly. However, after a fork, these counters are copied to the child while the corresponding rmap items are not. As a result, when the child later triggers an unmerge, there are no rmap items present in the child, so the counters remain stale, leading to incorrect accounting. A similar issue exists with `ksm_zero_pages`, which maintains both a global counter and a per-process counter. During fork, the per-process counter is inherited by the child, but the global counter is not incremented. Since the child also references zero pages, the global counter should be updated as well. Otherwise, during zero-page unmerge, both the global and per-process counters are decremented, causing the global counter to become inconsistent. To fix this, ksm_merging_pages and ksm_rmap_items are reset to 0 during fork, and the global ksm_zero_pages counter is updated with the per-process ksm_zero_pages value inherited by the child. This ensures that KSM statistics remain accurate and reflect the activity of each process correctly. Fixes: 7609385337a4 ("ksm: count ksm merging pages for each process") Fixes: cb4df4cae4f2 ("ksm: count allocated ksm rmap_items for each process") Fixes: e2942062e01d ("ksm: count all zero pages placed by KSM") cc: stable@vger.kernel.org # v6.6 Signed-off-by: Donet Tom Acked-by: David Hildenbrand Reviewed-by: Chengming Zhou --- include/linux/ksm.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/include/linux/ksm.h b/include/linux/ksm.h index 22e67ca7cba3..067538fc4d58 100644 --- a/include/linux/ksm.h +++ b/include/linux/ksm.h @@ -56,8 +56,14 @@ static inline long mm_ksm_zero_pages(struct mm_struct *m= m) static inline void ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) { /* Adding mm to ksm is best effort on fork. */ - if (mm_flags_test(MMF_VM_MERGEABLE, oldmm)) + if (mm_flags_test(MMF_VM_MERGEABLE, oldmm)) { + long nr_ksm_zero_pages =3D atomic_long_read(&mm->ksm_zero_pages); + + mm->ksm_merging_pages =3D 0; + mm->ksm_rmap_items =3D 0; + atomic_long_add(nr_ksm_zero_pages, &ksm_zero_pages); __ksm_enter(mm); + } } =20 static inline int ksm_execve(struct mm_struct *mm) --=20 2.51.0 From nobody Thu Oct 2 14:19:57 2025 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (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 9E1432EF660 for ; Mon, 15 Sep 2025 15:04:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948677; cv=none; b=eikCNkhhLIfTtxN2Z9BfAUA7ecHSRVBFJn2vfq5qgb8/jgU8SgqoNT6t7g8Rq980Gb3WdVHwpsg1k6Hvk/fQ2tnooImAATh5KevQ5t/iOfr0L3khAPEcmJe2qX8L/GhEi5K7bH//7oPjzv6UjIAU7JMEDChF/FumhlC4+zFAWuk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948677; c=relaxed/simple; bh=AZ7b2JeJTAqtynIeaDLZVyjhP/pXsPwUc/fqJQVYrIg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XOm9Dlw42F1GYxjWIo5th995IAh/HibMO8rXgW0diflyrorRirFdehvDlYteXj3oNvXWyNZoZD2Q2qY9yaedJ2jxtwbskdeg76YexGi/vI7IgAMg1WVY0TEgCAfc40cayzlecIq5OUBb7hFy+2kR9C9gueL+KVBO0dQ8c7TnjWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=VjQcyFpo; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="VjQcyFpo" Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58F9b9TH018951; Mon, 15 Sep 2025 15:03:28 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=Mw9l3ATox05SMSrOa VD6dql5/r3vydDIVDHsMiAYBH0=; b=VjQcyFpoA1Ov14qYqNziq/EnNCZ6O3cbR TdIKtbvqH0w180I0vqhxd7QgbpHnN6Lo58oNPCK2mRnce7VStmEMt7Ehh1m4oYr2 /GZtcrWVI6LzcYr+nVehpSpEYTdAJEetQA5gEii705h/uv3YUq1deX7H0oCMvMGl JKzH0LX50OWJxwEqleXlr+m6lX0YLpJTSIi1RJyHSWn0Zlb0BByXlx6HjKcC65Fq Ok5A+0v2NUvVpL4zOnJOW2fNwLy8UPOooZR1LG5bxVkPjYU9N7ie0XdHjjtzpoV9 yVg6dOCxfZ5Gv9oBtFbfhlxc+rWUpvfgXNNoVTqjBhouDdjnRUy/w== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496gat1pyy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:28 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 58FF0UUB032168; Mon, 15 Sep 2025 15:03:27 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496gat1pyf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:27 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58FBWauU027276; Mon, 15 Sep 2025 15:03:25 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 495memxxr7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:24 +0000 Received: from smtpav05.fra02v.mail.ibm.com (smtpav05.fra02v.mail.ibm.com [10.20.54.104]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58FF3Kim51052992 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 15 Sep 2025 15:03:20 GMT Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C08CD20043; Mon, 15 Sep 2025 15:03:20 +0000 (GMT) Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 01F6720040; Mon, 15 Sep 2025 15:03:18 +0000 (GMT) Received: from li-218185cc-29b5-11b2-a85c-9a1300ae2e6e.in.ibm.com (unknown [9.109.215.183]) by smtpav05.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 15 Sep 2025 15:03:17 +0000 (GMT) From: Donet Tom To: Andrew Morton , David Hildenbrand Cc: Ritesh Harjani , Xu Xin , Chengming Zhou , Wei Yang , Aboorva Devarajan , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Giorgi Tchankvetadze , Donet Tom Subject: [PATCH v2 2/3] selftests/mm: Added fork inheritance test for ksm_merging_pages counter Date: Mon, 15 Sep 2025 20:33:05 +0530 Message-ID: X-Mailer: git-send-email 2.51.0 In-Reply-To: References: 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 X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=BKWzrEQG c=1 sm=1 tr=0 ts=68c82ac0 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=yJojWOMRYYMA:10 a=VnNF1IyMAAAA:8 a=kDUdi5sUuU8vu5WplE8A:9 X-Proofpoint-GUID: j3U2VRkqQn4XzAtJobpMyJIcM65S50IL X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTE1MDA4NiBTYWx0ZWRfX+owsqfDsyOJT wra/dfkNFMg0Aty67SOAVFn9WPu+ZedniDZ1oBpVSg2IO4QeaJMdd1d8CABWjTR8imZ7wyY3FNY kcDXuTvCPt7L3gvm8I079Djz4yVUEKvkTbb+Egj2wXAX6UzpJi7CuWy64jl9eLjD7RcQl8KgF0l G9gLpuM1x4xYLKWKxbfSYOdKBOw5QXqoy6Ot/oy1RURKb9a/XoI3WwlivENzn8kd1Va+wVH/+qH x5oTE/kfbFC/KThIl7iGI1heWEj7V4tBBCTRzWJFxvrYexNIW3Gu1NkowN97kE3HNURwuYdpupl 7tO2/IHhEy1CafLDNgUIlB0oPznV6OBo2rlvuO1lREtdh+4fKWDUqn2Cmiq4wxjuBqW8CXHH2VH XBCQKQj4 X-Proofpoint-ORIG-GUID: UVh9NO6MTXzI6hFy_IMba7QcotMBbCPF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-15_05,2025-09-12_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 malwarescore=0 priorityscore=1501 adultscore=0 suspectscore=0 impostorscore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509150086 Content-Type: text/plain; charset="utf-8" Added a new selftest to verify whether the `ksm_merging_pages` counter in `mm_struct` is not inherited by a child process after fork. This helps ensure correctness of KSM accounting across process creation. Signed-off-by: Donet Tom Acked-by: David Hildenbrand --- .../selftests/mm/ksm_functional_tests.c | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/test= ing/selftests/mm/ksm_functional_tests.c index 712f43c87736..645cefba2126 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -602,6 +602,45 @@ static void test_prot_none(void) munmap(map, size); } =20 +static void test_fork_ksm_merging_page_count(void) +{ + const unsigned int size =3D 2 * MiB; + char *map; + pid_t child_pid; + int status; + + ksft_print_msg("[RUN] %s\n", __func__); + + map =3D mmap_and_merge_range(0xcf, size, PROT_READ | PROT_WRITE, KSM_MERG= E_MADVISE); + if (map =3D=3D MAP_FAILED) + return; + + child_pid =3D fork(); + if (!child_pid) { + init_global_file_handles(); + exit(ksm_get_self_merging_pages()); + } else if (child_pid < 0) { + ksft_test_result_fail("fork() failed\n"); + return; + } + + if (waitpid(child_pid, &status, 0) < 0) { + ksft_test_result_fail("waitpid() failed\n"); + return; + } + + status =3D WEXITSTATUS(status); + if (status) { + ksft_test_result_fail("ksm_merging_page in child: %d\n", status); + return; + } + + ksft_test_result_pass("ksm_merging_pages is not inherited after fork\n"); + + ksm_stop(); + munmap(map, size); +} + static void init_global_file_handles(void) { mem_fd =3D open("/proc/self/mem", O_RDWR); @@ -620,7 +659,7 @@ static void init_global_file_handles(void) =20 int main(int argc, char **argv) { - unsigned int tests =3D 8; + unsigned int tests =3D 9; int err; =20 if (argc > 1 && !strcmp(argv[1], FORK_EXEC_CHILD_PRG_NAME)) { @@ -652,6 +691,7 @@ int main(int argc, char **argv) test_prctl_fork(); test_prctl_fork_exec(); test_prctl_unmerge(); + test_fork_ksm_merging_page_count(); =20 err =3D ksft_get_fail_cnt(); if (err) --=20 2.51.0 From nobody Thu Oct 2 14:19:57 2025 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (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 4018532CF6C for ; Mon, 15 Sep 2025 15:04:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948679; cv=none; b=OvgnDq4tSRb2oC1FtiAmLifS5WdckB6oQ1vx9Zeg54khFtR0I6kHKkdp9rb5K3sh3GiV8F7AF/FKn2kTyWs3SlMP0dibKDbWGTgUq0AHBjVdwf2gVKdPenDYeoALBE0f/qlvbN0E64dSzw8raPpE2gQ3PwzftcnhFAfwKLxOkBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757948679; c=relaxed/simple; bh=vzbUEIw2iUn2B4Ydfrx8OSuU4DUygCaImhIiVKOVNa4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=af1JMM+1fgGNjMY1aqRKRfr/zPaanWUthpqIubAJxZyMQM2lY+m/D1YIIi6h5h0jYyP+tA1wr7seTTK17iRBnatnjvhbHW6hE1L/qEoT9xSEeceeQ8xHhPts3B12PIqP2DSSb60lyYY9qqjHAmIa5J8RXGcZUh0oSxPPsMkF0RM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=UW0QNoai; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="UW0QNoai" Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 58F9OwQu018078; Mon, 15 Sep 2025 15:03:30 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=gjwWWY9wvYaNKY8EA A5KtNvgSNU+KKcZ8lUbtsSE45U=; b=UW0QNoaiPu8PZn8HDb8Zq2028URKtOZIq IjrLxDxa2AW7gTsIAxuVm+JggSRMg5dANDJcnR69NVkIUSWuZvVCBFCyoLtVSjiz azMEZzMai+Ie6nawEpB6CEpM3wDgnqgcXEXAubRpengn5r9qXB+BzRwQMZaTfCZa 4lelEt2ytcvqwUhIYNplG8A5+Jzp5d8uMtlibjWNVS8FGGD7ZfmxqNkgEN3Jk27h 8fLkPerTN4ilKu+DmZMlXYqk0bvl5Z8AHoUURZfMW+TP3AB2yo7RavfqTmfoFqmF KJT3ZE5O+IjmUb15oUXrHGv6Zz9bR5uZ5PHzOapYuxceIhiW5NDjw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496g531rdd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:29 +0000 (GMT) Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 58FEnJdb002136; Mon, 15 Sep 2025 15:03:29 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 496g531rdc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:29 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 58FCQYO5008988; Mon, 15 Sep 2025 15:03:28 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 495nn36pm0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 15 Sep 2025 15:03:28 +0000 Received: from smtpav05.fra02v.mail.ibm.com (smtpav05.fra02v.mail.ibm.com [10.20.54.104]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 58FF3O1r42533242 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 15 Sep 2025 15:03:25 GMT Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D841E20043; Mon, 15 Sep 2025 15:03:24 +0000 (GMT) Received: from smtpav05.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0371A20040; Mon, 15 Sep 2025 15:03:22 +0000 (GMT) Received: from li-218185cc-29b5-11b2-a85c-9a1300ae2e6e.in.ibm.com (unknown [9.109.215.183]) by smtpav05.fra02v.mail.ibm.com (Postfix) with ESMTP; Mon, 15 Sep 2025 15:03:21 +0000 (GMT) From: Donet Tom To: Andrew Morton , David Hildenbrand Cc: Ritesh Harjani , Xu Xin , Chengming Zhou , Wei Yang , Aboorva Devarajan , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Giorgi Tchankvetadze , Donet Tom Subject: [PATCH v2 3/3] selftests/mm: Added fork test to verify global ksm_zero_pages counter behavior Date: Mon, 15 Sep 2025 20:33:06 +0530 Message-ID: <5910cb6bfc7c43b169b679a0108667a56d7ebdb8.1757946863.git.donettom@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: References: 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 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ZXyxwX1ucZr2gUZwipFy9t7yA4Xbn7EM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwOTE1MDA4NiBTYWx0ZWRfX4G5L7Xf8orpF YrFigQN0bXgzJCxVV7kr3vYqAtOCkAMRmoN1Dyi/zv3wNRrgmP3trUgqVDAf1zqGeNwlwGLpkeu sW7I7G29lLsmw4sCAE+SacaAQw5FN41DCLe6/zO5GVY+0EZMl1hc2jgbrwm3PV9ALJd17QMz7a2 nGZ8RIX37iwnTfBMlbh2jMXIYTkAJT3tgL7jv54g4UB6KHeMDNFzsQhn8L3fPb0p1qyssitq1BE GV+Sf000ZYaLxcJjk/DaWmUM+Rch/YFTFkCzcx570hdk+4vHdrYCEJhyiBlPhP0v/MvY/U9+Rhs ppXe7x+TxswxlYPGVBCL9gyXgJk1oXg9fqp57LO+1sP6Ca5RF9t+2MN6JtyjJHmcM2Zg0MiJWBg l4WfQjmd X-Proofpoint-ORIG-GUID: KlHLGoZtd7BO7u8AJEiCdnV-7phG6b92 X-Authority-Analysis: v=2.4 cv=UJ7dHDfy c=1 sm=1 tr=0 ts=68c82ac1 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=yJojWOMRYYMA:10 a=VnNF1IyMAAAA:8 a=2YreOkuNpnKIDl0BDdwA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-09-15_05,2025-09-12_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 bulkscore=0 impostorscore=0 spamscore=0 priorityscore=1501 clxscore=1015 suspectscore=0 phishscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2509150086 Content-Type: text/plain; charset="utf-8" Added a selftest to verify the behavior of the global KSM zero-page counter during fork. When a process forks, the per-process zero-page counter is inherited by the child, and the global counter should be updated with this inherited value. This test ensures that the global counter is correctly updated after fork. Signed-off-by: Donet Tom --- .../selftests/mm/ksm_functional_tests.c | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/test= ing/selftests/mm/ksm_functional_tests.c index 645cefba2126..f23597ac8066 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -602,6 +602,77 @@ static void test_prot_none(void) munmap(map, size); } =20 +long ksm_get_global_ksm_zero_pages(void) +{ + int global_ksm_zero_pages_fd; + char buf[10]; + ssize_t ret; + + global_ksm_zero_pages_fd =3D open("/sys/kernel/mm/ksm/ksm_zero_pages", + O_RDONLY); + if (global_ksm_zero_pages_fd < 0) + return -errno; + + ret =3D pread(global_ksm_zero_pages_fd, buf, sizeof(buf) - 1, 0); + close(global_ksm_zero_pages_fd); + if (ret <=3D 0) + return -errno; + buf[ret] =3D 0; + + return strtol(buf, NULL, 10); +} + +static void test_fork_global_ksm_zero_pages_count(void) +{ + const unsigned int size =3D 2 * MiB; + char *map; + pid_t child_pid; + int status; + long g_zpages_before =3D 0, g_zpages_after =3D 0; + + ksft_print_msg("[RUN] %s\n", __func__); + + /* Unmerge all pages before test */ + if (ksm_stop() < 0) { + ksft_test_result_fail("KSM unmerging failed\n"); + return; + } + /* Get the global zero page count before test */ + g_zpages_before =3D ksm_get_global_ksm_zero_pages(); + /* Let KSM deduplicate zero pages. */ + map =3D mmap_and_merge_range(0x00, size, PROT_READ | PROT_WRITE, KSM_MERG= E_MADVISE); + if (map =3D=3D MAP_FAILED) + return; + + child_pid =3D fork(); + if (!child_pid) { + exit(ksm_stop()); + } else if (child_pid < 0) { + ksft_test_result_fail("fork() failed\n"); + return; + } + if (waitpid(child_pid, &status, 0) < 0) { + ksft_test_result_fail("waitpid() failed\n"); + return; + } + status =3D WEXITSTATUS(status); + if (status < 0) { + ksft_test_result_fail("KSM unmerging failed in child\n"); + return; + } + + /* Verify global zero-page count remains unchanged */ + g_zpages_after =3D ksm_get_global_ksm_zero_pages(); + if (g_zpages_before !=3D g_zpages_after) { + ksft_test_result_fail("Incorrect global ksm zero page count after fork\n= "); + return; + } + + ksft_test_result_pass("Global ksm zero page count is correct after fork\n= "); + ksm_stop(); + munmap(map, size); +} + static void test_fork_ksm_merging_page_count(void) { const unsigned int size =3D 2 * MiB; @@ -659,7 +730,7 @@ static void init_global_file_handles(void) =20 int main(int argc, char **argv) { - unsigned int tests =3D 9; + unsigned int tests =3D 10; int err; =20 if (argc > 1 && !strcmp(argv[1], FORK_EXEC_CHILD_PRG_NAME)) { @@ -692,6 +763,7 @@ int main(int argc, char **argv) test_prctl_fork_exec(); test_prctl_unmerge(); test_fork_ksm_merging_page_count(); + test_fork_global_ksm_zero_pages_count(); =20 err =3D ksft_get_fail_cnt(); if (err) --=20 2.51.0