From patchwork Tue Apr 8 09:29:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14042502 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D327C369A1 for ; Tue, 8 Apr 2025 09:29:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D75426B002D; Tue, 8 Apr 2025 05:29:51 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id D4AD86B002E; Tue, 8 Apr 2025 05:29:51 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B2A106B002F; Tue, 8 Apr 2025 05:29:51 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 8F83D6B002D for ; Tue, 8 Apr 2025 05:29:51 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 01E1658BF6 for ; Tue, 8 Apr 2025 09:29:52 +0000 (UTC) X-FDA: 83310354666.07.7EAD1E3 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf23.hostedemail.com (Postfix) with ESMTP id A92F6140005 for ; Tue, 8 Apr 2025 09:29:49 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=TzBdMgLB; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=sVdaHYN9; spf=pass (imf23.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104589; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=d+uXZYtT7o1SVExMTK1hm54h6SgNkV1DbNSIzYI3ToU=; b=6MyhnHzUbq7YcmIHA1Dk8tdSHRaojxhkra+D3C7HAx4i1NKKkUmY5TFeLdv4sAP17mZ2Tk 0wDOH+A/kXG3pIuK68++bKxJ0njGBloXkTvk3Dwm0oKicoCeg2dJf4WaNLHJBBdW+H5L7X IAKKDa99vY6PFQPJ1D7kXeQaRjejgvk= ARC-Authentication-Results: i=2; imf23.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=TzBdMgLB; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=sVdaHYN9; spf=pass (imf23.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1744104589; a=rsa-sha256; cv=pass; b=EhBLm8OuiiCY8yqd/SaJdZ7+HL05jf7lcYOY/ju7VuR+Ip7SwlL/aH3ynYpT/irP3mz4Uk k0NNyeZGX3kVntPRpDTIddc+BznG7nGGe0jTyNqBetITHB6G9kqT0wPWInD8l2egAnjox1 6XU/mdikV2vPA77vD2N17wSYf4RMc5Y= Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5381uwPQ015387; Tue, 8 Apr 2025 09:29:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=d+uXZYtT7o1SVExMTK1hm54h6SgNkV1DbNSIzYI3ToU=; b= TzBdMgLBaw3fgYQczYlEQtbrWR+tCro1AoMe8W4G/vh8asWFEjZeHCQxUNkzl+iU U9UmhUNb6cT/b2QbOu07me+Lcs6t2ZNMyI3572xZrBOOMCLq4EoZj3b1EeMPtcGd Mn4PoKm6LU4sZxpsX1NWpdiN9PbYTAxj+oeUr0bUaYs1cBApj6rEM2JlLEgMTNEE PPLbVlZfZl4I4gGi4eK0PKmvkauhJeS835TYYAFHzowF1CnFAxMrpC8qHL+eOsMc 9wcP1eCH+7VM3b7e+vhh5/SIhYpgvWTX+i/qyhXKGkpvyrRxabAvVxGYvaJm+OpI UpylxGRYt0NwGVHtsIP3Cw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45tua2vcje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:45 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 5388CqjU001275; Tue, 8 Apr 2025 09:29:44 GMT Received: from outbound.mail.protection.outlook.com (mail-westcentralusazlp17010004.outbound.protection.outlook.com [40.93.6.4]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45tty915gb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:43 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b2LCvtYHc/V21BPQOtnWj7BvBpZ5DtrtQbicEGn7dQA5rtDQETXXtvSJuEMuTJ2W31zB8XTD96VJUjs/z8ZVrfLvjXCvh73Mn+lZkvPgt8ECao9M77jEgYDVMpPFKhT5wgu1+kfs7Cl29VQYMeQiQ52Yg+o+KdjhitaBscZD/klx4R7i9YiM/63X/xiqBrzYEGHLqajRss84lNurQyqOFZK7WJXXvNL+bt25jzOos/KryfNGzXklV5b7ULFjCyrOIVH7XGboy+EIoFrkZ56KFKEIXh3N/qNtqiI/O7q1Fm1mGjcvQURkhW7+DnB59aHX6KghSNYWFmm0ceQtky2s5A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=d+uXZYtT7o1SVExMTK1hm54h6SgNkV1DbNSIzYI3ToU=; b=OnIA9Fl0RpXvGTp8mu7gOMq97JFvIBZMdsGa0vyuHuSXfaS44pG0tTzGvuDdeXpKWzsbgqtYIReN6bptNUTJV3d/yEtgjyJbGukKFYWzB3sOkoRzZ1tmGs3II2Aacgo5lS+DyMREi/F9m0Jdb9FclU0QidDNPNQ0lxd560+hY39wjkkf97v2a0w+qHizQcxSexf9/R/uOhbGg8mUCZdN9Osk1LQECROvUlme7W0BvIc6x4CgA1Yym/V/1fmhhnzTlPBFQpKz9YNxH8l9fyU00vn89sXLl2pkLQXReQm+LFId1rxBoDMCB4G5rcojG9Jy3fIC3Qfjf5x9z6UriuDVkg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=d+uXZYtT7o1SVExMTK1hm54h6SgNkV1DbNSIzYI3ToU=; b=sVdaHYN9aq8lX1BatUZDgxYW9wvwViYXehM8G7S/n+aeIF40aciQauBXjm5fuQNIqfnVV4KpxsCh6mTkeILouTSvXcIiNlAW4ALTRmANXSjrZsVIwwnSL84O4oc2622YvNJdFiRsCuK3BYywbOhwjq672S/xGTgwTYNNqqRugvM= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY8PR10MB7244.namprd10.prod.outlook.com (2603:10b6:930:6c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Tue, 8 Apr 2025 09:29:42 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8606.033; Tue, 8 Apr 2025 09:29:41 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , Wei Yang , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] mm/vma: fix incorrectly disallowed anonymous VMA merges Date: Tue, 8 Apr 2025 10:29:31 +0100 Message-ID: <18c756fc9eaf7ad082a710c91133b8346f8cd9a8.1744104124.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0044.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ac::23) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY8PR10MB7244:EE_ X-MS-Office365-Filtering-Correlation-Id: 0c1a6dfd-bc4a-4e47-3e0e-08dd767fe423 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016; X-Microsoft-Antispam-Message-Info: 7wpmGvxQW2AlaCqLU0hOJLfvqrhXxd2Dvs0BN4PR98Hja3f2Y3ks/POBTMzT4fYOg1yPO3nnQmECd2bqbyaq4Es0DR0weoNPD3LQQ/zU9UY5/nsYx9KOjwwjgJqgQZvBuPqI9Cf6C+tJm5mM8liyHC+XaKhleKQU+tmEUJtlErJXyT6CcjjL8XBa6VaPr6tFr8Xw9D6j1E+10wkj84yepnUi3b2k+lyhJ0KXQ3NkqkTnse+e+AKC03WPDLFge52MN+C4afXy53pwgnhk1ddmKW5k6GQIiHqerl7gdSRDBFSjDZpCrjLj+fQuvsDILsMBI4AOOhOpi92Q9kdEqpC5BUcj9UFgCyjLdRM2tgfgGb8oKNJ5Ec7+yyWXfLMQ+ftjJNo2Q10FATX68AvRNanPZRN3VZhUQmKFUXPKdj1MzxS6d2JrlIQQijBhFxDxoAYpayG+QwbEdVeCtv0/0om/jAR6hkl+A16VPXdmFuLPThJ9GOFh2ebn42QA9UAikORrlHUWSyXqDFkVSv04A/3s3zfLKV6kD5UgfVH3JTVIZQxY721iCsS8ZI5dKt+62NThrI0bxwIvwrPXXMkd3XRgxMYfrlvV8Y12OxOTJrdm+hyBXFI2Z014HZ0C0wYmauS4DIL76+mGwpS/xq+hB9kRFWppVtzA8X8ISI+WnPWjrVhkgnPdbvD/toFkpTXXD25vGvoLhkEIQmX1sVp/xRVPtN97dt0FFmX2tho5E3EjbgC6mHNez0R6lM19Lq5CxIdrtfQdEqccKhFuqX74QHbdXd7wvYS+GJKY6CKp543yMQT01TYw68m4bjgsVNgJgyCCShguBM2S/QEEZX+uaUdSXwRgpTk4fd/tTjifFTiPFNkoFasW96E/TNEAy0FdIVMMm4tyuA1FpoiDRET9WEovm74Emv0MphpvYD5b1HEgUDXXLTemdYYholCe2UCsDU5ws3ziM2IcBrAyp/KXZUPZCV7H6iIbXZeNA2O0wTR4yrS6J9b8TVXRmajdphNubfDj95fMLYYm5zxLm7I7in7La4fmLL0ujIkZYO5jtbbgcJQmJUH2t5LA9qxuhe5dBsebZwe1MaTAeO1FHKrxeHeEnCjiKuvCOoOAjKs0m0F7CE9K6G2C/p9bEHWPywphPYQHQxrQfOjYhG7gNXIhWKtYtk0LsuqgjMZ80DWGBTMXwBQsg7DFR7QsRTQSfNz/pqFHlFNI+nzGCBJ6J1YAS2gEEIk4gPmxc87uiz7FruERJ99jW1W7bnOKOOz65xSwKDvccKbBIQI8hCViw9eJc84KiQvIjbG8OR6MnutX/XA7tuJ+jbMlAC6SVQ2/gudtw6ISFfAHqlqXxGZu/SnGtIbFsATEx6vYKdQusETD+/4EKFW5TGTuZUV5T0F7bJROxLUH X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Bon+v8MeP46xVRHyFVpfbqj/7YgALTGjZbprj/qDdFCH5k3Z/OHMAEsllYq5SIV11zwnXQuh3f8G9x8Ua/aqjWpaq6/faVTfTFyf6XQZzHqxSrvfb8q/09dD4kVZ1GFmClTRUU3HbsdIinzt+F6/fO93ifGV8PL9U53kJUQ34qXSw3pg0qikfDJeuO3WndWIaSOsZSQZel5+IOIhwylH/vhk1zbeHmb93WGhNGVWYeW5TXQhxgXxL+dNRJiIJkoPSQ35mXO7e49isvKH3V5EGkIIJoRsACAImAoKRWsH49gbZDi0diaiza0Ku1D1hVpeNsMQAB7bGZla9mp/j7sRqftPD1VFGve9mOeAXqrBfOFKZpySuIR89RuwCh4mVFGqvZBOACcEBKclqLincF2vO8QbUcY4pRrl/BDZBRxZvT+FfxM5+ykAHjsyaF3aBN19JzaJFVffSnz8O9fxA6VBqA9iKWtm0aVr94oWoaIltnYKHwj/HE3yJLli4hjIcpcATPmJvGmvdt+Ul97bkssgJoi2gQ5CErWQJ5UgurQpxPeQ7nwnmrjgq7V8Jdar1bRTjgeVGLnzTFEpUaEKHmPZVviW1wgh1P/hCFPZqPfRjlT2S1XsErwyFgSK8QCU6P8Y+xY7QDOd9hgDdjgjfyx0Ft4mcvEO2gf/cz6skFitOkF/Zrwue53gZegYBJj747Rnou3f2SzuqWp63GpzbNXG3ZuMT0Zm+DUD7Hxxptq9MfVwXGSBcx+adYOSglEAdibSjufuhCJIOZKfGxzsahUBgdeLsHYf3PFNFcgNUUKNBemVA2p8xFJ2jLzw7DMU0TeLB8+TFT8SXXeyvfiaFYZgY8WuSf6U+kp4Kx34AfP7gu1SREpC1X2cbTCBbgqCPa+A1R+qq5XvG+L1jKNWIQQc+pY5zrSHKZTszNap35itoPXFxNHp1wDU7rHkhF+JYDHllsihkRSn3reROts0auIPqdlVaRSbE6+B2vyYmSfQbdAGMwDKID9USRykKpM4X/J0+SfaH7M+pjGHFY6q59KaUSlwuJELpGR9HAd+FigTPDUqmxLKlJEsHXjdxBCJyvdAPmDHGPN/yh6svGZ7tLT3aGg/nzwGQMFjoqOqVnqdP1rw1Ya65mzJ0Zz+KaCSrprYac0SudMhBHPc95bAdIKFUUJRjBmd6jPSSRqPl+jjDzH/4PbSDRLZdelAjrLdmihGVZAwvUkDuuNj12tdth6HrwsiohduXqVYdmp8/EzjuHgYIncVx2U43aocJihh/5gUR5ZFQnKJtGauDhoWEP4UYbExcjHYQhL8MXmhyYZDEJ3Zv6vpxTRPUsOQYYMc5TgLViOLC2orC29uv3mLWDWtt4N56V7cUSdY1CbTCOlfkg8JyHEABKs+ufhrVeY1qlIYlb9a/KnjfI5n8/vVE7a0iIt4+ocSHCD1htFKjaQ+bqHy+fM4AYTz0Do+/qWXMc2ZXP7d3e4TjHn2NJBvN0UIMV5+uCWDhp18qKOnIwnDpYA/ySxrh2wd7WETKHRb94Q/KwMegdDnr4yz959X5mAU8FtqzYwCZJMIp0PvcMoOUN4aBIUxHWkc/+6Lr44TbvlK7zu5KCNngFR3X8tZ8jExZQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: f8aDLZJW825PPjJaVpAb7CTNcrBjS2H/A3D+rdhcQMK1BASjmTLGYox1YjbQSePVXkJwfJN/nAdQhF72ARfJ2lMStrJ1JeY7hBjYujkDF4UPjL9xwb2bc2VySoPWIneDIwQ2EysnfIW7jQAWNqP00oxCYFVLWMXsWD/Wtut0C3uCyYMjIwUuBY771ec79LEgerMYQw2xKl8tQ7SEKcAXt92vEDxPrdQpwAXReFQ894/Ouk+nO+PWmYDQW5o5kFCMMcSVgopObHy8lB5/v16qukrHoS0rNeVtBK/ovA02nZ3fbA+OB7v4igPoQuYJlYSX9pJUpjXCkZ9L3lhqNb32srgR2GtnyyhkKrpyvE+t6QRu3pdbOGMTk6dbVQpuS/gXuKyt3CxQKXmmdAcOVuVuExEG4ToQoxigBAu4aITDi02nciwRF28x/1QTp8n8l1umqxl1ZnTFRY1UdSWD+ZLyKB6xvfahbgrngAc4x47exuJ1C9qF1CzglaBuqJ62zZXcGkgAIEugyXSoypGKnw452WctlpZPlWUTYm9xjz5pJ3Rgarm+kVsK7zcUvQqzmSO1pu7bsPcpG0kK26to2Ojj1tafA+0MVjxLvB2kIaJTPuo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0c1a6dfd-bc4a-4e47-3e0e-08dd767fe423 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2025 09:29:41.8133 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: u1YHWgc5jXk2/SpJaguyWIsrx3Ar2W5J8aZg7XyDS7gDDio4M5XDvtkEWclqYia5lTWpbjB77nOX4O0tG8k7c/UX52efv17d8E4cCozgdNE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR10MB7244 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-08_03,2025-04-07_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxlogscore=999 suspectscore=0 adultscore=0 bulkscore=0 mlxscore=0 phishscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504080067 X-Proofpoint-GUID: y356gagVj-Lg6OrZO2gKifaYy7wU8MjN X-Proofpoint-ORIG-GUID: y356gagVj-Lg6OrZO2gKifaYy7wU8MjN X-Rspamd-Queue-Id: A92F6140005 X-Rspam-User: X-Rspamd-Server: rspam02 X-Stat-Signature: 1pr3nfnarfmioiftyurq36yh8cbnaezn X-HE-Tag: 1744104589-984562 X-HE-Meta: U2FsdGVkX191QAnQpJi0RzK12uiHdAMi392+YWafUnqIN1FCMm9cJqWGihvW8mqPbdX1n0OBc7jRerVUNs49ABu/n3SYSX1s7SRPIBkw+oo3TEi2rDe4Noay8W61O6F9uJIWszpEqAL8BPr59F2BVOtibZsrl8EDGvLWqOnUkXM0g6gfHlhhjf1kBSf7VuOpB+OzWbQrQ5/aQ2mxyrY0pf0PxxcZqDAKI9VhrnzILZC+FzAMuNm3CHb6cxIkhqQbcMO0pwMuEXtIfbNYYYjTHYO6QbNK6wWPo6iDO7kBka62U68LPriSOnpkxnmc89qDLVCCiCG4aYvQB/eX2x+tjbey2mRL9MH9woC4Z1QjRn7TDjz/yWvPDFyugFRuU1atoh5dAWdxDAUA7dBfIUw0KuasnO5XFKsoutem1eKEPzVVS0q3kN0fOeM32EHN5owGx0pgT/rR4Df4bo0DoUbDnZHIEbHlwKV8OUUUemP/suHnOnaOoiESwY8uMQXx+UEwzq2XV6YRzs6G53fE+Fnsx08PcKSNAYlDD/nBssVMfsWnwS+AvDSRB2B0r8sPKTbLnCLRtdJ35gHsEhEG7IuGhZMcJ4qIzctTCarTG0wSJUaf6DS9ZIXCzpvZtw3CT52M8cWbtjCbVhCsX8Ueo9SvkyzHMQCTAaaqMqmEyeZn6uLfL7PGCNmzZTsVlewdjIRV8cb2CIx5rGZbqNf2BjSVBHupC85rmof3RwgwMRl1+G77SVD/5coWs9jMtJYfCJmyt5zBmpXenKiKScCw0DJexvQ9KrGI45f0S+aOtWYe+/9qI8q0zND6XJMAe8FNSGJXDfgyFfBwy/JX8io9tWMbs6quBlH+GAVneH9cBd7j8pBt9E/Birhjwr7Bekq4dKT12j7qu8JEGqbltBvTVIONqQ+zSd+VnKlriusJBP86rxKcHAPfF31812xddUZhsjkENie1B1UtfthhPpEj5Em F9054uiU 8zf5wdnmGuHZVI7Mn8VIZ4ooNNY1unB9rLbHXUwboUDvc9lNzCpxN2HnAPcSQyaUI39OkhIv4e8UU/S4g3s8i05z044rh52qYkbBJdRYHvy9sC2MqcvId+icTuolobtuTzHBXegYYS6H4uyX4lgf6RaL3L9cnxnEaWFAHBh1A3pyuw+aFQbx3+YypUz4V4b3urHEPB1V6mEI3TRpL/300WPS+tsnb9BH8wRkF+r2fd2E9C5Rk0TyqperJ89aQFWJ42eROLAbtAsSpDAoOpVcOXSZVgYA+K2I8OevCVzAF/Gh8JzF8NBC71p1YQEWY7CPMJfHV4Ongmz/E4lE1rVVFrlOQbslp2VwH2hSvGzzA6Ix9sRnvG8U+ki6wuDTTHxQvyBWdkb1iH4tUvPT3uBGMn0mUt8WK4heAtW/MJCI+83olTO7tbXghDwwyhqDouQeRPFOp7dQeb5++BIH3g3y4GBSRewEm1EXiAufYzGS3TB/P4WgoE8yp8qpGU2KjkM7O1A05LYihF3vn3KZUrzg9wJedjfuhUbQZJzyCoYpziE8diMwZvHW6y7yl0PrMyl1xBpnB2pPHub/ihxRVZw0kITZPbGMHWrmkjngLZjMeWgpqxCtxqmF90oARd0/3bBh6mdAZUjyESrkd4mDx1CqDMKtn6lfsTC782VtnWEBbPBfxAcdsPciaWmA0ITNMPtKvwpXZqGqBaExCTiGwE6TEhBJqolWx1gf6xb4e9uHcvLv+NFPdjPQSsIA5Vw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: anon_vma_chain's were introduced by Rik von Riel in commit 5beb49305251 ("mm: change anon_vma linking to fix multi-process server scalability issue"). This patch was introduced in March 2010. As part of this change, careful attention was made to the instance of mprotect() causing a VMA merge, with one faulted (i.e. having anon_vma set) and another not: /* * Easily overlooked: when mprotect shifts the boundary, * make sure the expanding vma has anon_vma set if the * shrinking vma had, to cover any anon pages imported. */ In the modern VMA code, this is handled in dup_anon_vma() (and ultimately anon_vma_clone()). This case is one of the three configurations of adjacent VMA anon_vma state that we might encounter on merge (where dst is the VMA which will be merged into and src the one being merged into dst): 1. dst->anon_vma, src->anon_vma - These must be equal, no-op. 2. dst->anon_vma, !src->anon_vma - We simply use dst->anon_vma, no-op. 3. !dst->anon_vma, src->anon_vma - The case in question here. In case 3, the instance addressed here - we duplicate the AVC connections from src and place into dst. However, in practice, we very often do NOT do this. This appears to be due to an inadvertent consequence of the change introduced by commit 965f55dea0e3 ("mmap: avoid merging cloned VMAs"), introduced in May 2011. This implies that this merge case was functional only for a little over a year, and has since been broken for ~15 years. Here, lock scalability concerns lead to us restricting anonymous merges only to those VMAs with 1 entry in their vma->anon_vma_chain, that is, a VMA that is not connected to any parent process's anon_vma. The mergeability test looks like this: static inline bool is_mergeable_anon_vma(struct anon_vma *anon_vma1, struct anon_vma *anon_vma2, struct vm_area_struct *vma) { if ((!anon_vma1 || !anon_vma2) && (!vma || !vma->anon_vma || list_is_singular(&vma->anon_vma_chain))) return true; return anon_vma1 == anon_vma2; } However, we have a problem here - typically the vma passed here is the destination VMA. For instance in vma_merge_existing_range() we invoke: can_vma_merge_left() -> [ check that there is an immediately adjacent prior VMA ] -> can_vma_merge_after() -> is_mergeable_vma() for general attribute check -> is_mergeable_anon_vma([ proposed anon_vma ], prev->anon_vma, prev) So if we were considering a target unfaulted 'prev': unfaulted faulted |-----------|-----------| | prev | vma | |-----------|-----------| This would call is_mergeable_anon_vma(NULL, vma->anon_vma, prev). The list_is_singular() check for vma->anon_vma_chain, an empty list on fault, would cause this merge to _fail_ even though all else indicates a merge. Equally a simple merge into a next VMA would hit the same problem: faulted unfaulted |-----------|-----------| | vma | next | |-----------|-----------| can_vma_merge_right() -> [ check that there is an immediately adjacent succeeding VMA ] -> can_vma_merge_before() -> is_mergeable_vma() for general attribute check -> is_mergeable_anon_vma([ proposed anon_vma ], next->anon_vma, next) For a 3-way merge, we'd also hit the same problem if it was configured like this for instance: unfaulted faulted unfaulted |-----------|-----------|-----------| | prev | vma | next | |-----------|-----------|-----------| As we'd call can_vma_merge_left() for prev, and can_vma_merge_right() for next, both of which would fail. vma_merge_new_range() (and relatedly, vma_expand()) are not impacted, as the new VMA would never already be faulted (it is a proposed new range). Because we already handle each of the aforementioned merge cases, and can absolutely therefore deal with an existing VMA merge with !dst->anon_vma, src->anon_vma, there is absolutely no reason to disallow this kind of merge. It seems that the intention of this patch is to ensure that, in the instance of merging unfaulted VMAs with faulted ones, we never wish to do so with those with multiple AVCs due to the fact that anon_vma lock's are held across both parent and child anon_vma's (actually, the 'root' parent anon_vma's lock is used). In fact, the original commit alludes to this - "find_mergeable_anon_vma() already considers this case". In find_mergeable_anon_vma() however, we check the anon_vma which will be merged from, if it is set, then we check list_is_singular(vma->anon_vma_chain). So to match this logic, update is_mergeable_anon_vma() to perform this scalability check on the VMA whose anon_vma we ultimately merge into. This matches existing behaviour with forked VMAs, only we no longer wrongly disallow ALL empty target merges. So we both allow merge cases and ensure the scalability check is correctly applied. We may wish to revisit these lock scalability concerns at a later date and ensure they are still valid. Additionally, correct userland VMA tests which were mistakenly not asserting these cases correctly previously to now correctly assert this, and to ensure vmg->anon_vma state is always consistent to account for newly introduced asserts. Fixes: 965f55dea0e3 ("mmap: avoid merging cloned VMAs") Signed-off-by: Lorenzo Stoakes Reviewed-by: Yeoreum Yun --- mm/vma.c | 81 +++++++++++++++++++++++--------- tools/testing/vma/vma.c | 100 +++++++++++++++++++++------------------- 2 files changed, 111 insertions(+), 70 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index 839d12f02c88..8a6c5e835759 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -57,6 +57,22 @@ struct mmap_state { .state = VMA_MERGE_START, \ } +/* + * If, at any point, the VMA had unCoW'd mappings from parents, it will maintain + * more than one anon_vma_chain connecting it to more than one anon_vma. A merge + * would mean a wider range of folios sharing the root anon_vma lock, and thus + * potential lock contention, we do not wish to encourage merging such that this + * scales to a problem. + */ +static bool vma_had_uncowed_parents(struct vm_area_struct *vma) +{ + /* + * The list_is_singular() test is to avoid merging VMA cloned from + * parents. This can improve scalability caused by anon_vma lock. + */ + return vma && vma->anon_vma && !list_is_singular(&vma->anon_vma_chain); +} + static inline bool is_mergeable_vma(struct vma_merge_struct *vmg, bool merge_next) { struct vm_area_struct *vma = merge_next ? vmg->next : vmg->prev; @@ -82,24 +98,28 @@ static inline bool is_mergeable_vma(struct vma_merge_struct *vmg, bool merge_nex return true; } -static inline bool is_mergeable_anon_vma(struct anon_vma *anon_vma1, - struct anon_vma *anon_vma2, struct vm_area_struct *vma) +static bool is_mergeable_anon_vma(struct vma_merge_struct *vmg, bool merge_next) { + struct vm_area_struct *tgt = merge_next ? vmg->next : vmg->prev; + struct vm_area_struct *src = vmg->middle; /* exisitng merge case. */ + struct anon_vma *tgt_anon = tgt->anon_vma; + struct anon_vma *src_anon = vmg->anon_vma; + /* - * The list_is_singular() test is to avoid merging VMA cloned from - * parents. This can improve scalability caused by anon_vma lock. + * We _can_ have !src, vmg->anon_vma via copy_vma(). In this instance we + * will remove the existing VMA's anon_vma's so there's no scalability + * concerns. */ - if ((!anon_vma1 || !anon_vma2) && (!vma || - list_is_singular(&vma->anon_vma_chain))) - return true; - return anon_vma1 == anon_vma2; -} + VM_WARN_ON(src && src_anon != src->anon_vma); -/* Are the anon_vma's belonging to each VMA compatible with one another? */ -static inline bool are_anon_vmas_compatible(struct vm_area_struct *vma1, - struct vm_area_struct *vma2) -{ - return is_mergeable_anon_vma(vma1->anon_vma, vma2->anon_vma, NULL); + /* Case 1 - we will dup_anon_vma() from src into tgt. */ + if (!tgt_anon && src_anon) + return !vma_had_uncowed_parents(src); + /* Case 2 - we will simply use tgt's anon_vma. */ + if (tgt_anon && !src_anon) + return !vma_had_uncowed_parents(tgt); + /* Case 3 - the anon_vma's are already shared. */ + return src_anon == tgt_anon; } /* @@ -164,7 +184,7 @@ static bool can_vma_merge_before(struct vma_merge_struct *vmg) pgoff_t pglen = PHYS_PFN(vmg->end - vmg->start); if (is_mergeable_vma(vmg, /* merge_next = */ true) && - is_mergeable_anon_vma(vmg->anon_vma, vmg->next->anon_vma, vmg->next)) { + is_mergeable_anon_vma(vmg, /* merge_next = */ true)) { if (vmg->next->vm_pgoff == vmg->pgoff + pglen) return true; } @@ -184,7 +204,7 @@ static bool can_vma_merge_before(struct vma_merge_struct *vmg) static bool can_vma_merge_after(struct vma_merge_struct *vmg) { if (is_mergeable_vma(vmg, /* merge_next = */ false) && - is_mergeable_anon_vma(vmg->anon_vma, vmg->prev->anon_vma, vmg->prev)) { + is_mergeable_anon_vma(vmg, /* merge_next = */ false)) { if (vmg->prev->vm_pgoff + vma_pages(vmg->prev) == vmg->pgoff) return true; } @@ -400,8 +420,10 @@ static bool can_vma_merge_left(struct vma_merge_struct *vmg) static bool can_vma_merge_right(struct vma_merge_struct *vmg, bool can_merge_left) { - if (!vmg->next || vmg->end != vmg->next->vm_start || - !can_vma_merge_before(vmg)) + struct vm_area_struct *next = vmg->next; + struct vm_area_struct *prev; + + if (!next || vmg->end != next->vm_start || !can_vma_merge_before(vmg)) return false; if (!can_merge_left) @@ -414,7 +436,9 @@ static bool can_vma_merge_right(struct vma_merge_struct *vmg, * * We therefore check this in addition to mergeability to either side. */ - return are_anon_vmas_compatible(vmg->prev, vmg->next); + prev = vmg->prev; + return !prev->anon_vma || !next->anon_vma || + prev->anon_vma == next->anon_vma; } /* @@ -554,7 +578,9 @@ static int split_vma(struct vma_iterator *vmi, struct vm_area_struct *vma, } /* - * dup_anon_vma() - Helper function to duplicate anon_vma + * dup_anon_vma() - Helper function to duplicate anon_vma on VMA merge in the + * instance that the destination VMA has no anon_vma but the source does. + * * @dst: The destination VMA * @src: The source VMA * @dup: Pointer to the destination VMA when successful. @@ -565,9 +591,18 @@ static int dup_anon_vma(struct vm_area_struct *dst, struct vm_area_struct *src, struct vm_area_struct **dup) { /* - * Easily overlooked: when mprotect shifts the boundary, make sure the - * expanding vma has anon_vma set if the shrinking vma had, to cover any - * anon pages imported. + * There are three cases to consider for correctly propagating + * anon_vma's on merge. + * + * The first is trivial - neither VMA has anon_vma, we need not do + * anything. + * + * The second where both have anon_vma is also a no-op, as they must + * then be the same, so there is simply nothing to copy. + * + * Here we cover the third - if the destination VMA has no anon_vma, + * that is it is unfaulted, we need to ensure that the newly merged + * range is referenced by the anon_vma's of the source. */ if (src->anon_vma && !dst->anon_vma) { int ret; diff --git a/tools/testing/vma/vma.c b/tools/testing/vma/vma.c index 11f761769b5b..7cfd6e31db10 100644 --- a/tools/testing/vma/vma.c +++ b/tools/testing/vma/vma.c @@ -185,6 +185,15 @@ static void vmg_set_range(struct vma_merge_struct *vmg, unsigned long start, vmg->__adjust_next_start = false; } +/* Helper function to set both the VMG range and its anon_vma. */ +static void vmg_set_range_anon_vma(struct vma_merge_struct *vmg, unsigned long start, + unsigned long end, pgoff_t pgoff, vm_flags_t flags, + struct anon_vma *anon_vma) +{ + vmg_set_range(vmg, start, end, pgoff, flags); + vmg->anon_vma = anon_vma; +} + /* * Helper function to try to merge a new VMA. * @@ -265,6 +274,22 @@ static void dummy_close(struct vm_area_struct *) { } +static void __vma_set_dummy_anon_vma(struct vm_area_struct *vma, + struct anon_vma_chain *avc, + struct anon_vma *anon_vma) +{ + vma->anon_vma = anon_vma; + INIT_LIST_HEAD(&vma->anon_vma_chain); + list_add(&avc->same_vma, &vma->anon_vma_chain); + avc->anon_vma = vma->anon_vma; +} + +static void vma_set_dummy_anon_vma(struct vm_area_struct *vma, + struct anon_vma_chain *avc) +{ + __vma_set_dummy_anon_vma(vma, avc, &dummy_anon_vma); +} + static bool test_simple_merge(void) { struct vm_area_struct *vma; @@ -953,6 +978,7 @@ static bool test_merge_existing(void) const struct vm_operations_struct vm_ops = { .close = dummy_close, }; + struct anon_vma_chain avc = {}; /* * Merge right case - partial span. @@ -968,10 +994,10 @@ static bool test_merge_existing(void) vma->vm_ops = &vm_ops; /* This should have no impact. */ vma_next = alloc_and_link_vma(&mm, 0x6000, 0x9000, 6, flags); vma_next->vm_ops = &vm_ops; /* This should have no impact. */ - vmg_set_range(&vmg, 0x3000, 0x6000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x6000, 3, flags, &dummy_anon_vma); vmg.middle = vma; vmg.prev = vma; - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &avc); ASSERT_EQ(merge_existing(&vmg), vma_next); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_next->vm_start, 0x3000); @@ -1001,9 +1027,9 @@ static bool test_merge_existing(void) vma = alloc_and_link_vma(&mm, 0x2000, 0x6000, 2, flags); vma_next = alloc_and_link_vma(&mm, 0x6000, 0x9000, 6, flags); vma_next->vm_ops = &vm_ops; /* This should have no impact. */ - vmg_set_range(&vmg, 0x2000, 0x6000, 2, flags); + vmg_set_range_anon_vma(&vmg, 0x2000, 0x6000, 2, flags, &dummy_anon_vma); vmg.middle = vma; - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &avc); ASSERT_EQ(merge_existing(&vmg), vma_next); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_next->vm_start, 0x2000); @@ -1030,11 +1056,10 @@ static bool test_merge_existing(void) vma_prev->vm_ops = &vm_ops; /* This should have no impact. */ vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags); vma->vm_ops = &vm_ops; /* This should have no impact. */ - vmg_set_range(&vmg, 0x3000, 0x6000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x6000, 3, flags, &dummy_anon_vma); vmg.prev = vma_prev; vmg.middle = vma; - vma->anon_vma = &dummy_anon_vma; - + vma_set_dummy_anon_vma(vma, &avc); ASSERT_EQ(merge_existing(&vmg), vma_prev); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_prev->vm_start, 0); @@ -1064,10 +1089,10 @@ static bool test_merge_existing(void) vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags); vma_prev->vm_ops = &vm_ops; /* This should have no impact. */ vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags); - vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x7000, 3, flags, &dummy_anon_vma); vmg.prev = vma_prev; vmg.middle = vma; - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &avc); ASSERT_EQ(merge_existing(&vmg), vma_prev); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_prev->vm_start, 0); @@ -1094,10 +1119,10 @@ static bool test_merge_existing(void) vma_prev->vm_ops = &vm_ops; /* This should have no impact. */ vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags); vma_next = alloc_and_link_vma(&mm, 0x7000, 0x9000, 7, flags); - vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x7000, 3, flags, &dummy_anon_vma); vmg.prev = vma_prev; vmg.middle = vma; - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &avc); ASSERT_EQ(merge_existing(&vmg), vma_prev); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_prev->vm_start, 0); @@ -1180,12 +1205,9 @@ static bool test_anon_vma_non_mergeable(void) .mm = &mm, .vmi = &vmi, }; - struct anon_vma_chain dummy_anon_vma_chain1 = { - .anon_vma = &dummy_anon_vma, - }; - struct anon_vma_chain dummy_anon_vma_chain2 = { - .anon_vma = &dummy_anon_vma, - }; + struct anon_vma_chain dummy_anon_vma_chain_1 = {}; + struct anon_vma_chain dummy_anon_vma_chain_2 = {}; + struct anon_vma dummy_anon_vma_2; /* * In the case of modified VMA merge, merging both left and right VMAs @@ -1209,24 +1231,11 @@ static bool test_anon_vma_non_mergeable(void) * * However, when prev is compared to next, the merge should fail. */ - - INIT_LIST_HEAD(&vma_prev->anon_vma_chain); - list_add(&dummy_anon_vma_chain1.same_vma, &vma_prev->anon_vma_chain); - ASSERT_TRUE(list_is_singular(&vma_prev->anon_vma_chain)); - vma_prev->anon_vma = &dummy_anon_vma; - ASSERT_TRUE(is_mergeable_anon_vma(NULL, vma_prev->anon_vma, vma_prev)); - - INIT_LIST_HEAD(&vma_next->anon_vma_chain); - list_add(&dummy_anon_vma_chain2.same_vma, &vma_next->anon_vma_chain); - ASSERT_TRUE(list_is_singular(&vma_next->anon_vma_chain)); - vma_next->anon_vma = (struct anon_vma *)2; - ASSERT_TRUE(is_mergeable_anon_vma(NULL, vma_next->anon_vma, vma_next)); - - ASSERT_FALSE(is_mergeable_anon_vma(vma_prev->anon_vma, vma_next->anon_vma, NULL)); - - vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x7000, 3, flags, NULL); vmg.prev = vma_prev; vmg.middle = vma; + vma_set_dummy_anon_vma(vma_prev, &dummy_anon_vma_chain_1); + __vma_set_dummy_anon_vma(vma_next, &dummy_anon_vma_chain_2, &dummy_anon_vma_2); ASSERT_EQ(merge_existing(&vmg), vma_prev); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); @@ -1253,17 +1262,12 @@ static bool test_anon_vma_non_mergeable(void) vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags); vma_next = alloc_and_link_vma(&mm, 0x7000, 0x9000, 7, flags); - INIT_LIST_HEAD(&vma_prev->anon_vma_chain); - list_add(&dummy_anon_vma_chain1.same_vma, &vma_prev->anon_vma_chain); - vma_prev->anon_vma = (struct anon_vma *)1; - - INIT_LIST_HEAD(&vma_next->anon_vma_chain); - list_add(&dummy_anon_vma_chain2.same_vma, &vma_next->anon_vma_chain); - vma_next->anon_vma = (struct anon_vma *)2; - - vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x7000, 3, flags, NULL); vmg.prev = vma_prev; + vma_set_dummy_anon_vma(vma_prev, &dummy_anon_vma_chain_1); + __vma_set_dummy_anon_vma(vma_next, &dummy_anon_vma_chain_2, &dummy_anon_vma_2); + vmg.anon_vma = NULL; ASSERT_EQ(merge_new(&vmg), vma_prev); ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS); ASSERT_EQ(vma_prev->vm_start, 0); @@ -1363,8 +1367,8 @@ static bool test_dup_anon_vma(void) vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags); vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags); vma_next = alloc_and_link_vma(&mm, 0x5000, 0x8000, 5, flags); - - vma->anon_vma = &dummy_anon_vma; + vmg.anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &dummy_anon_vma_chain); vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags); vmg.prev = vma_prev; vmg.middle = vma; @@ -1392,7 +1396,7 @@ static bool test_dup_anon_vma(void) vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags); vma = alloc_and_link_vma(&mm, 0x3000, 0x8000, 3, flags); - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &dummy_anon_vma_chain); vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags); vmg.prev = vma_prev; vmg.middle = vma; @@ -1420,7 +1424,7 @@ static bool test_dup_anon_vma(void) vma = alloc_and_link_vma(&mm, 0, 0x5000, 0, flags); vma_next = alloc_and_link_vma(&mm, 0x5000, 0x8000, 5, flags); - vma->anon_vma = &dummy_anon_vma; + vma_set_dummy_anon_vma(vma, &dummy_anon_vma_chain); vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags); vmg.prev = vma; vmg.middle = vma; @@ -1447,6 +1451,7 @@ static bool test_vmi_prealloc_fail(void) .mm = &mm, .vmi = &vmi, }; + struct anon_vma_chain avc = {}; struct vm_area_struct *vma_prev, *vma; /* @@ -1459,9 +1464,10 @@ static bool test_vmi_prealloc_fail(void) vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags); vma->anon_vma = &dummy_anon_vma; - vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags); + vmg_set_range_anon_vma(&vmg, 0x3000, 0x5000, 3, flags, &dummy_anon_vma); vmg.prev = vma_prev; vmg.middle = vma; + vma_set_dummy_anon_vma(vma, &avc); fail_prealloc = true; From patchwork Tue Apr 8 09:29:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14042503 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0DC5FC369A4 for ; Tue, 8 Apr 2025 09:29:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D2EF7280002; Tue, 8 Apr 2025 05:29:54 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id CE218280001; Tue, 8 Apr 2025 05:29:54 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A6E18280002; Tue, 8 Apr 2025 05:29:54 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 7DC2C280001 for ; Tue, 8 Apr 2025 05:29:54 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 99897140904 for ; Tue, 8 Apr 2025 09:29:55 +0000 (UTC) X-FDA: 83310354750.02.2B714EC Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf25.hostedemail.com (Postfix) with ESMTP id 57ED5A000C for ; Tue, 8 Apr 2025 09:29:52 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=ILSkmcvv; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=rQSr8DQz; spf=pass (imf25.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104592; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=bxQwPc40CICtxcwyaEH/9fV7AeAA8SSgF1epD5ig1fM=; b=AM5F8wYtIBfPG80MkEzE67JAoEVrQiZbGLPNNs3bShmTkSEZZdh18fE5G2S5gQDCsd7QAe tScKNyOZIRwhDBvRYu9cLB7N7xOhvJ0XrWA6OzlnlMu6WIKXE5GPbGotGNit6B8JSptI4x 6ZImKbrpJmGJalUF3hV2JOENh/qUfjY= ARC-Authentication-Results: i=2; imf25.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=ILSkmcvv; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=rQSr8DQz; spf=pass (imf25.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1744104592; a=rsa-sha256; cv=pass; b=Ry549b2tpnVC1TaHRP35XBpnRQsmRinGwUbb56JR7MApVQ0xthE6Gyc5ifgRLxXC2OkidE 6K+/JRFJ21kam4BekVpMT2+AQ2SRMbMITd3YdkMmQStzRVygW66hX2/2DBdFYd1nf8qeF/ asTBD6pbFb7+WHzmuP3ajmvWPTybP6k= Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5381uW0q008063; Tue, 8 Apr 2025 09:29:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=bxQwPc40CICtxcwyaEH/9fV7AeAA8SSgF1epD5ig1fM=; b= ILSkmcvv2R+R/OM9NCU7eJDfR1nwXUkOyNwJmZqe+vTXeY8r8k12CdJbatSCZDav YSx+iioZqG6hHVHobHuX5KVpkg+AOgWQqEcoy61nUhMB73091fIMlOrsh2Whe+Li TCfIXt39SLs6y9bUTJND/9H1wGgH5EJnjJvdwsLZcuiEy9jOUmQD5aXtgUhTSBWy Y9GxVPwYSi4ZBN+3KTP3g22cXkiYxuVv7P5EwOPljvYlVgdrrqgQ3ffRCmCMga2Q K/ZGwI0iOPkOk+ZoFEglW9yzQeDbTEmzKHv2OTnYUCjMyXF18VEtB+Mai6bjVvnY i5ivYp3Olu/8VtebX728sA== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45tv4svcja-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:48 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 5388OCId022634; Tue, 8 Apr 2025 09:29:47 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazlp17012035.outbound.protection.outlook.com [40.93.6.35]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45tty9rn4e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:47 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KOnJLKsMldjI4T5G8ZNxlwnxHmEnzEl0crfuJA6rBAKa/b6A1IqwcDezc9kCCS3IWmSb0+SsfwVdkGI7cjRQjnlaO2O0R1+NPDcUIvkjWN4gUYR1ac1Px8F/azHQfKWfWe8wu6FUGri4uA53w7x7oU9f11oAGHED1HizE1uISLEF5DAeDlB73Jal5w7zMviHludA3u8kli06fUi0MsSOcnslbfuVzveVjM3F1g+Gn9ED9w2hWBh+SUd2LdaRaMgp5KCUZs97vDDasjuMS3H7z/Onr/MMcOZ6E+AY6IXSrDK451QHDIrsPOQime1jesvXsAvUqosb0pNhTrLTolvjZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=bxQwPc40CICtxcwyaEH/9fV7AeAA8SSgF1epD5ig1fM=; b=PQqB7XmRf3M7q7TPZhAOCTXIW2F3VDOq5II1gJHA8uPtPj1yjTWwA0rqio0k3rZYIQ6t1DCswnyuWUGm3fi72iuWjP8C9/1Ry2L4XYlbgw8UeBb5tRkLpPZ5v3I6UcMJDCSnI0x1K0fV8r5bS49u96QElFYqibSQ/a6qDNkADK1SObKVWNbDVA72l1hPNlJG69j+mdn66pyc1hOjZWCIb1ctYXIg4v4tuYSQBFT7OAap+diRjgKdB16swD2+veFx5UlJfwq9E0FhKHbnJdOwi6kTyJ1GeouOOG8hw7OnLEuY7dzDU7f40x7lQ0NvUOu8WgNIUNMMfIuCvEDw2sCHBA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bxQwPc40CICtxcwyaEH/9fV7AeAA8SSgF1epD5ig1fM=; b=rQSr8DQzg7EJXhtOEC0N7y9uWv/rxX7Ov3ZobWa4C6zcRTiIAq6Jcqz+5ycEqrgNQTQ0K1Jgn0/FlCS2UCbjpIfIdhX3qdX7OebUxzSRX/DmBbWtHnM9ysgFBG8rHmTYqAeuPeNThivkV1Epvm9mCMNRpybF70kZzsHmvsLjSlo= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY8PR10MB7244.namprd10.prod.outlook.com (2603:10b6:930:6c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Tue, 8 Apr 2025 09:29:45 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8606.033; Tue, 8 Apr 2025 09:29:44 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , Wei Yang , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] tools/testing: add PROCMAP_QUERY helper functions in mm self tests Date: Tue, 8 Apr 2025 10:29:32 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: X-ClientProxiedBy: LO2P265CA0186.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a::30) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY8PR10MB7244:EE_ X-MS-Office365-Filtering-Correlation-Id: 361da53d-3de6-4b41-d37b-08dd767fe5f6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016; X-Microsoft-Antispam-Message-Info: O3T0aBPlRrm5AKg2k0tF3OBcc5UlYMHFIENWeODVTmVc+iWat0zZg/g3i8zefKe7m/kfX31JCZLysyw7bsmsVL0UkkLNphggrx8Kr76ylNHf2BxNOfuOJLlUw6o3nYqV9dgrUs/i83iTn5WFdMnlsajuz61c5oHw+mZDXI2cWZ9VOxa03+89Q6KyX3gk5dX4CByh9WE7Bsm8NI0rlnsuXebv4RomPXaqAJ7JU7AIYnYVJXDU2KIbcNftZuaeKQodtnVvKTHOOLMnWghExWadeGbGorGN4BYFJqS0nFlY5r5j0I4/v3suaHJbvyEklF/zUZs8XfK+ck1YXAhbovQyAUSlta1SfFb0ixqU5rBsQTy8i2l8SLQ/3TVr7+VSNYiL1n9oQ2/MAGQNGdNPD3G7cwINeG1gUXxqkkFdfJQgWXlEwLA9rpK68zXEulSkvhoRIqtIbPDXmc/+VMeC/lMq5qa4oORg8RAqaB2A/4cHSTkU5ugcjlSaChnTducLfTt+j/qkZdzBazKGvBT42jeomqGnh4BMMyiN1nBp40nkVVJ84n4mDF8IUZaec1GvIu9Qpqc1kR4wELMeYljtyE5BgiLUQWlHoKthM0r93HUlRv0paV0hVVREmzC2yvCPUly824QKggw/IW+QfVJuHJVBfJm9PsJPDdQYJYYgIwTdHzQvzNi+2EmEIrWYvYhmnDhFxyqfxHzoJwRHX/JXyfD2s1cKU2bnn82Eb4eweLQnFTYP6QZk2N5Z4FJwlOS8l3amZjggmCHV2qQPor7HK7m2jLuUvpwp7HPO11Z9z4I6EaYeoPAhywIC4haNs/Vambmvhpludr01HDl3AwSZTgwlPfIkTx7j46jBUNkhGyPgt/rSJ3izlT1OSfxuNJosDLCVI8DI43lKlhnaRHMedfZqxnE9ipB7qJtVYpSlZtJVyq5Mq+FC4XliNlg8erWjV3ffZkqS7Y5PcOvibMjbBA2tjCx/cQd0QnoUtYFwcfW9lvMxPkO3UEPwqqcZi2i9GdH5eO/I5D8lZoqFVg/aXhHlpQKNkyuFsZA6Pzf+MaXSQ+JQsaoqloQxCdC6EG9ZNY5dsS4xsxcnhx9Ie23MAyBjnthRNpNt0J/6zjUUIz0Z393AYXiW69frxhTlnYtljXIWhkmmBhFtG1gqRyeAahrDoz2fVspO7SfeUuUI74spF2VQbLoS1kEG1xelPEZ81tlmbE4CLv0Mr0G5bACV8Z0bZo2Smiwl1J9QDtW1KfQzQ30IjjvKY9nZ+o6on7LoEheNDE5t1CLAtinz+RN4IMHx3CvAHvsEsHAWAtiNy6LaTkDLezBIuoQMYVeLg/vglrJiCnE7mhq5a3HGWSYpeL8+oNBVvhtoKUb69VR9pFlRMh/kiTd6hDdyV+BV2qtxBZ5k X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: +vsLlA5Y53YlIsp7lGs5myukyFreowIF0SWmQfOKqvxIqdD0OKEuockUoa6HZLFLdo/tFW6Qr7VVLhAKNXreRl7hOKZIHYO7MAP1kj4z3cF+064DV89NieoXvq3ZjgiU6ylh4FW7e+OIHrLHDs+gtwV4u7rzIRjo2W/LPLtGMX7BbnWAtOic3YsqzojMoSvPP/4nNwa51IVq24brlFW6G1zlbubDRaoI+YwMjCAe97B3yCkUCreaG9ZuW9f0f33fxsja6lynnf6AR8yQiX7AnK+Y+xKMeAeriL8mJHVDUTNa7/Fpq7p9SDRA2aBjlfVFGeLftXBD7gTkVHNww3NMRa21NJ7KMjHommKOgEbSo3fFuFNIKfEgrNLu1rI/nHJpKaFjhssBRT76/+vKEjUHULUTHALVTt77v7st0z/ZktiujvXD1+7L3GQ/pxFlynMQnwr7+eEmhEwvAE/fnWQvQHnUeXOYhvIh5ekkmB/suN8Rm4XrPs5wG43xceVSpQmuR3BMftIcXHw9Kjm3WoIblFZQ/FoTanJ9MTURexiRjiTQuqQpmUqijfYfOW0qcZIIvQql1E9rLytKKJloExfrOzZ1XvUlWdJ4NOFoRVBmF6DXPyrApfVRwGOqBUjLUtoar5Pn/Eb0h5YgVNbhFFjWEFe6dGECq6/xq+JgZUHdyNasr7Nd0XxsFNSfhtZzbGPqUKkPRrIHJYoVrC7W0tbujXU/zMjHDSlp9wuc/I6eKS/ZNVxJXngMzekNYMjwiVN6J5250w118jsZPst99XuvhVyhZNnUkeOc0dqLLQkZHMq4faledBcgV1KigITGqm+XtyZC70+a5VtsaXPV7uNyq/F1Hb1z6v3tS9AtkpF/Q90UW5aM7uXHxydZ9ZE8EH/u9eNaFcQzYD4t/bcu78isCVaDQsXbAo0+mL6eRZe1G64e60oLqKMy4+fVDD8IAY8ida4k0u5utRehPQk1eYSZ3Bh04PolB4GF2DDcAxauwuDIps0lz6IDS8SgTuUQtCJF9SmmBuUN9rPQXLcR2F3uEH6HDDrKN7Q/QWOf/66IszC5HQ3CMULcX1t3gkCc5wXTTyrddUJ9ge6XMZItvghjA3xk22m09RBxZdRsPR6hEDX+N8kju7bztdSOhcqW5pALy+4Vja2o/tryqZKTicb2GoTwMdarwjS4KmAzfx2y4i70mZuN4NJ7clSwqbUsRAbCd+Mi4wYCAyVQk6W4QmDiibB9qkhBGw2k9Xs12cIYT9ku521ZcIZ48ZBv+g2UhYpLFZte1+xKxvKtgJvqSXzn/HVBKrgVmr8avgftk5oLcOsy1nfAO9tBvaP5mLNb6vEmBIdderYJGTxkxv9K4+jdDML1zusdAKS2ZHuUHvQ3m8p0QjMnGuzVEZ+hS5FIK4h8DIGZq7l0R1lROe+VRBu+Ol3oIxvaqh3apmHBu0cwm9XUkuEq/UbgYATVN89IBJZ8X5GCEYr0NLB85vkAA6XXx/vRhW+WY+MpnpgcUqP0fDJXUuDzEN/EPi3FwqgYyzMbRiERwVUcEOven128YTE6Ar8pKKsfXo/zCEBylbLV6wycCDrbDT+k/C/k8bFZaUarxFooxkqensjKBwI3ZLYFtA== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: a9zeQYxtRWvLqLvIhQBxPe2b3L7ztX7y2z5cKX6fj8rJRWLWabRubiWqIfU5YISGrOouItEwDiuHMPT5/BP83DHTqbtFkKBp+r6z4mR65fDfZidrnOdMO80HO+g1qTDvRY1N42KgvcAVIZ3V+azVCqd2MWGZvJohZ8q+DZkzowd543U5jMnPhg8XlTh1egCgUw0t3747H6cQ051vhDvVWd9ejEXL5kKpTJx8LFvDIdhsM8tttvM5uHrR5DNuMpVHDTFMzI7runYn8qaMBksHwEvAPG9JEdhVr7r2R8uqtJslSm3GJhcaPuG8uZLYdk+0IXqjmGy+ZXn/A2pMj4P8KVqwS9z5aQvP25u+9D1prYvijNWW3StuAKEBRr993BH1Jx5N5BWDNC5SmSa7rqMqU/XqY7ALasjl431rygOSQtw4vcwB65Q9tCOV/o+Qpx8seHvcOZqs0irXZHJCa9nsNhoq5L5mS14tzxgzCPn3MQQ6ComIk1DKC0WzDSjlDJIhikOTkInMenMgFXoY1HIJ3pJwhsZjJefg4v8O0TWUReAJvfJlXwiuBZHkeOfdA0Z8BwgKwsc3P4nvZazQbIzR492fspJbjaSBolXVhCiAXqI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 361da53d-3de6-4b41-d37b-08dd767fe5f6 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2025 09:29:44.9256 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lsD7hbfK6FikBXaCT4uV4+iBNtChascQXDAMaNYee3f87xCvJYw+3Z6c7Lyy67CLSku6QVOuExtsL047AQJ42hi9WE6qce+x5znt6+UVo+8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR10MB7244 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-08_03,2025-04-07_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 spamscore=0 adultscore=0 phishscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504080067 X-Proofpoint-ORIG-GUID: KO3q-jddX1wW2W8Umr3N6eswnuW4UI0X X-Proofpoint-GUID: KO3q-jddX1wW2W8Umr3N6eswnuW4UI0X X-Rspamd-Queue-Id: 57ED5A000C X-Rspamd-Server: rspam05 X-Rspam-User: X-Stat-Signature: 66zaonuys8wk3w565rbifywf5rfwhxzn X-HE-Tag: 1744104592-591326 X-HE-Meta: U2FsdGVkX19cOCWVA2T9Gwjye4VZ6Fbg1oeeBwh9kSgGp54V/ot2a9J8QECzutmkm4Q2vOfJcTW7A55kJ1IlgTnr+nAMtocuLfar5doCRKS9aVzj3q/A+LCnfuIkyaj+pHgnQiaDwBOzswC0EYZjYOc30vhv3O8y7MQmvFsVj0Y5lGnfT6jYkQcGJgui4/tL6F0UecDMc6j1a5/88KW4lGTPpkPqN8i0S+x+s1y5qNXhXMQ2pcAtNDDOo4uRpFD6IIh5/eJi/B6krgTpeL4pbT3v1nPdSZ+/woIbX8NQSrMMuMHDKF8g/lkURmxNjokLLBgDPmC9hnS8g6ajQEdYXP8aXn3H8B3T3uDnDNLEu+vkdioM9vuF0+kO2l7h9SB2VbeVlrTCyEsWWl48jFhgQrU2Pc2ryS+2lUH/i4RQE4UI3BVbrr8PqSnzS0y8zs2Lxg2NG4hHhP+EiP3KjKy0X8QbhJdC9fcFSX/9zowCtpF/X4acXv2Gi60Cy/tl/wbXtCdYI4J807OUM6FQ0Zo+HnsUa3eikXWzwgL4ds1O2hXXgAsZSx6QSxbklLrN9mjUb7byYxGQHqGVxox9DksNWlIu3nPIlp0TVZzMdpUsCxKemUPOs+AlKfObPWiQMlM2iSXA1d5a23ra+0kNn+YSqBeqVSVjYbPnA5U6MPSPK+HQkRi3ea7+inZTJgTFB4KRIlJhJZ3QfQ5ujpMcnVfxvInIWAfERQklj7BVhuYDNk+yTrPxHDuWi1r7QJv4lOg7QSn5fAfz86duDQpmFGCUH5jg8SIiY2zC1dT02yIKajVjXH/kXqeQsRudvmOo4RRL5dnwlOoolWdzXiuwL//efOQogNJBhK0OASz12PtsFbTD0H7N5hqMIG7kxlTXCNhVlPxPbnL9yRM6nJLyYObGYEBFNywkJEIpAI2tv0uSICri5/rLzrHipwPmCHkH84eOSvWz4DfETH5ct3DXfqt GzJ2siYG Qom8tnMEd1f5xjYF7lZmVwST+8jx2j4dhmeHKgzN442CHVOTPJbJ0rxsUAIihWvYm/Z7BP/mOYnDj2Tq22paqAcA5O1gLBhBQP4h5XbHREcwnZAHP5szimfkDMDTgEm09VRI2iFrhE416/G+gEpXGPMhN79lxrGmXD9ZFr3T71ujpSA+JcSL/XM/loVtm25pv0oW5WVGdTakSrUpog44KuofDjsqs3Cszj901DbyzV6qbi0i3KgnonVo1gOGfrmPY+U9sXEn+C451CBPnyhV4JiLwDQrojxXe+k+5p5I/bjfI4W2Q7QpB2IAboFztjY1CTkm9/9mmcn+P+W+m/NX/4ULiSaTJ2yCkbQInBeuHJKE/fOhkohgHN1RWwk4cxyEgWJpN1SSaWQhZ5PXoXXGTQWz3l1Y99Znyc+72fKBja8ja9ozCj5tRHX6uS+CObp4ywDpdC4DNjVNcWaQIaDgwaIY1RAoQhPC2XB+l92xBFHq+VP1fNswDvXSEa2rTdqQFdmiuOS+/9J63Tp+3EVT5Puz5wvYXAcJ5Feq5dRTZkAsy/UGQ0mHYgOj4++HvHcaE7bjpIBr2qb4jeB6OZ0W0moaJk797GXWcK0i3plt01762xtHkxuMw8a7PEDLQuFDKf0+X1QwygyILao2vE51/fn5k28en5GRdc5GEuykTosXOc5NBJuvCmJww1heknnY5PaKPf0axtDdvLZVSdYwbRs4M8ssli+jusQfofZkFjzRZlo7B9kpI2WgGtig1Z24W53eXrRDnI+lHzc3GZdIyzPf2CWxG+EsTEZHj2C1S5dmh3Ek= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: The PROCMAP_QUERY ioctl() is very useful - it allows for binary access to /proc/$pid/[s]maps data and thus convenient lookup of data contained there. This patch exposes this for convenient use by mm self tests so the state of VMAs can easily be queried. Signed-off-by: Lorenzo Stoakes Reviewed-by: Yeoreum Yun Reviewed-by: Wei Yang --- tools/testing/selftests/mm/vm_util.c | 62 ++++++++++++++++++++++++++++ tools/testing/selftests/mm/vm_util.h | 21 ++++++++++ 2 files changed, 83 insertions(+) diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c index a36734fb62f3..1357e2d6a7b6 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include @@ -424,3 +425,64 @@ bool check_vmflag_io(void *addr) flags += flaglen; } } + +/* + * Open an fd at /proc/$pid/maps and configure procmap_out ready for + * PROCMAP_QUERY query. Returns 0 on success, or an error code otherwise. + */ +int open_procmap(pid_t pid, struct procmap_fd *procmap_out) +{ + char path[256]; + int ret = 0; + + memset(procmap_out, '\0', sizeof(*procmap_out)); + sprintf(path, "/proc/%d/maps", pid); + procmap_out->query.size = sizeof(procmap_out->query); + procmap_out->fd = open(path, O_RDONLY); + if (procmap_out < 0) + ret = -errno; + + return ret; +} + +/* Perform PROCMAP_QUERY. Returns 0 on success, or an error code otherwise. */ +int query_procmap(struct procmap_fd *procmap) +{ + int ret = 0; + + if (ioctl(procmap->fd, PROCMAP_QUERY, &procmap->query) == -1) + ret = -errno; + + return ret; +} + +/* + * Try to find the VMA at specified address, returns true if found, false if not + * found, and the test is failed if any other error occurs. + * + * On success, procmap->query is populated with the results. + */ +bool find_vma_procmap(struct procmap_fd *procmap, void *address) +{ + int err; + + procmap->query.query_flags = 0; + procmap->query.query_addr = (unsigned long)address; + err = query_procmap(procmap); + if (!err) + return true; + + if (err != -ENOENT) + ksft_exit_fail_msg("%s: Error %d on ioctl(PROCMAP_QUERY)\n", + __func__, err); + return false; +} + +/* + * Close fd used by PROCMAP_QUERY mechanism. Returns 0 on success, or an error + * code otherwise. + */ +int close_procmap(struct procmap_fd *procmap) +{ + return close(procmap->fd); +} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h index 6effafdc4d8a..9211ba640d9c 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -6,6 +6,7 @@ #include /* ffsl() */ #include /* _SC_PAGESIZE */ #include "../kselftest.h" +#include #define BIT_ULL(nr) (1ULL << (nr)) #define PM_SOFT_DIRTY BIT_ULL(55) @@ -19,6 +20,15 @@ extern unsigned int __page_size; extern unsigned int __page_shift; +/* + * Represents an open fd and PROCMAP_QUERY state for binary (via ioctl) + * /proc/$pid/[s]maps lookup. + */ +struct procmap_fd { + int fd; + struct procmap_query query; +}; + static inline unsigned int psize(void) { if (!__page_size) @@ -73,6 +83,17 @@ int uffd_register_with_ioctls(int uffd, void *addr, uint64_t len, bool miss, bool wp, bool minor, uint64_t *ioctls); unsigned long get_free_hugepages(void); bool check_vmflag_io(void *addr); +int open_procmap(pid_t pid, struct procmap_fd *procmap_out); +int query_procmap(struct procmap_fd *procmap); +bool find_vma_procmap(struct procmap_fd *procmap, void *address); +int close_procmap(struct procmap_fd *procmap); + +static inline int open_self_procmap(struct procmap_fd *procmap_out) +{ + pid_t pid = getpid(); + + return open_procmap(pid, procmap_out); +} /* * On ppc64 this will only work with radix 2M hugepage size From patchwork Tue Apr 8 09:29:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14042504 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66200C3600C for ; Tue, 8 Apr 2025 09:30:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3EEB8280003; Tue, 8 Apr 2025 05:30:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 39BC0280001; Tue, 8 Apr 2025 05:30:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1A29B280003; Tue, 8 Apr 2025 05:30:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id E93C4280001 for ; Tue, 8 Apr 2025 05:29:59 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 59491808FA for ; Tue, 8 Apr 2025 09:30:01 +0000 (UTC) X-FDA: 83310355002.13.CCA7624 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf07.hostedemail.com (Postfix) with ESMTP id DA46E40008 for ; Tue, 8 Apr 2025 09:29:57 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b="i7k9L/Ym"; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="O/NjMBKE"; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf07.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1744104598; a=rsa-sha256; cv=pass; b=QjsXm88nvb5CTe9GJBKsEV6u4mwYMXH5mEFG4Hgjdc9/03n76W3JxA3YBLKUWKHjKgjuvU frzH3uGZRgw3tsLol5wo7SieMSi9EOstpTX6KfAlxVeEsQ2SE44bH4ETHOo4bBSncfT8yi MZD1eKVuOEzX9yAVoiq+X6NkCHw8qNM= ARC-Authentication-Results: i=2; imf07.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b="i7k9L/Ym"; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="O/NjMBKE"; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf07.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1744104598; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=qHfxGge1XWrqzg6XFd5bhYi7zW7cscaCwV2bV2jBt/A=; b=o1p+0UAw84myvDotTBYhOrHs9SlGBbkXNmiuWcphbbiz8G7Y4EIUQrss96+ZC6eM2WzN4E RCFW8Xuwao/ZlqJsiWSTvvNoPzVVw+0BdxG8N/KG6/k/lN0+fXCcgycUKd1bu/x6BTSJ/0 GU4UhwRNVrQdUWUlA/qFju5XSMyUONk= Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5381ubTN025952; Tue, 8 Apr 2025 09:29:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=qHfxGge1XWrqzg6XFd5bhYi7zW7cscaCwV2bV2jBt/A=; b= i7k9L/Ym87/Bzyts0Kx/63JD5FV6dYizI6VQkvz6KMyr8AtRnJXLfsCevWt/mJSU HHPeEyGV0aVXU0Q9sZyJEn01/HkGGI/x+S0K+af8X3yR2DIjQNOcYECLlMbF9qa4 sr+/dhx8UzPzidj2FRokHJJ/gt+WT8luip8eaafkZ/4S/eaITtKMVILNGRs/orTK pWrwAv11fYsylwuw4k6UtB1MWPib80qtgee3pe8EfxStyFRLJgMtWah13d8zUzE4 f/l+hyPLEcGUGO+smlzsrFvMwSX0qpo9qHh+LmBi+lXhUhGrwXvW1UF3HQwhY3M0 Nrmjp9gzYzq50vbbk6soIw== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45tw2tmbxp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:52 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 53882Bws013788; Tue, 8 Apr 2025 09:29:51 GMT Received: from cy7pr03cu001.outbound.protection.outlook.com (mail-westcentralusazlp17012039.outbound.protection.outlook.com [40.93.6.39]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 45ttyfa2q7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 08 Apr 2025 09:29:51 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=USSO0n7FoIpnV1/bs9+zQuyt3R/SnPcWSLZ2t3SjXt8IOB0D/cGz70TNJrNjJWo6pPoneAejwWA+nAfwoX5Um3KptyuGO93MjNGA9LbvD07Af3/3YgAKWcQbWWRBAQnLrM4y8zvRv0EPwNMidTDnqLKzTW3DODTxJNwR/z0GrX35dLzusypVYdH5EN76he4fdRbxSWSyL8E4J7qZfmJhTqWcOi40FHhHM+5xiXKiozoVfxpZ82uY0NHgY+34CdxluLl6HoIvHgsxgxpzkXOzY93AcfVFk2zLHGexFOPul9t0WzVCjREnbMPJJuxLO/zHKwCcsRmS/UtkGGPADtec7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=qHfxGge1XWrqzg6XFd5bhYi7zW7cscaCwV2bV2jBt/A=; b=IJa3XZbxtQavH3HjB9FV18EzRPibOfnsfJFXxSriappiIyUH9HYsMoONUZJ6xL98kC0eVaRwpUIp0CgOy7Oh/Wr+Em9XVxB648UN+mFkKdLVzu90fI3TNfUYf5MoruIZiXTcEbukVdEKTojk3Jzmg2JJyhihhyTDi/PI5H6+/dhoMS7g3lKxWdiE2d2tzFNXl6EuchoYesCVLXyh6NwfSUem+bJFuUWufvMuAXn8nssGX8YGpVAKXlGPN58TqFkKPrvUGoNT+kD536AM5p3hVXDJMfsSv3iIEZgEh+M/ay+YRdMqKqurRIJjHcMVawg4rWJjMIHr1nNCigKrxMlDSg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=qHfxGge1XWrqzg6XFd5bhYi7zW7cscaCwV2bV2jBt/A=; b=O/NjMBKEkfZSFsmZiTKG80/hd8zktVXLPhC2UW20Zu7IMBZn2FhUboDhhre0gNGf9yeZPWJH3dwpugVqBVTc/IkN7WJNNHDVXvlrLSyu2n22cu0WRcC4q5B6wwOFN36EM21j+BsKwiviruSC85F7mo30U5FEkkq1dMY/Y0lG1qY= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY8PR10MB7244.namprd10.prod.outlook.com (2603:10b6:930:6c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Tue, 8 Apr 2025 09:29:48 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8606.033; Tue, 8 Apr 2025 09:29:48 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , Wei Yang , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] tools/testing/selftests: assert that anon merge cases behave as expected Date: Tue, 8 Apr 2025 10:29:33 +0100 Message-ID: <2b69330274a3b71721f7042c5eabe91143934415.1744104124.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: X-ClientProxiedBy: LO3P123CA0007.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:ba::12) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY8PR10MB7244:EE_ X-MS-Office365-Filtering-Correlation-Id: a8176d6e-e517-49be-697a-08dd767fe816 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|376014|366016; X-Microsoft-Antispam-Message-Info: wGJF/Nswgr1+C2aN/fPO+ssznmQ5/igA55E+httHLp7o/LKxhKgZqtIr7P3qUr8DPH5/KdR9dwePjtMWpuHw1xoW/2aasJwW51P5Joa+U9N71JHeqa/grDAuNx6nOI51Y68KtPis3oPEvLTgQYtj/9ctjXO2aGe1y1M+9YFtpIUoiOES6YBTYz2otfvmKKO29EXU+Z61+KZJ3/uNzADuJ0b9vl7DXzNK4r6rVpgD+fPHso6PqtpB2JSQduLvon4EBN9AzOkYLE2Z4J+snDet8aABaROm5JDZ+IyjoEjg4aGSQPAr02X8k5581j24QMMOC8xeMfi/4SeDeot+i/fQ1A9paeGKCg9bmEhcCpepNahr6e/Q4Z4i6fLZKDoSZBunl/iCWmD1EL85neUEOCaRD1G+aHK9eFUFojfCCvJOv72rqpMdYTOLA5y32JPmtQ2GbDq180fR4J9p3WTQ2QZc6Fm3Si23aQ2jS6Eg6x6FO6BRu+XniClXfhPBBibEEYWNrUHiR3Y6pe2CYDNi/Yhm5tDACriigHhYtm0QkMIb+L+oZPsrtyGFGMji1fv90dl7AcyH63ijgkSGj8KWMFOK3pENtxpzlDfYxY2A71ZY3V3j7v8M5qaUIn3JL/pXRXN/BRhY6zWFCggNvL2CLnPL5brieeWbdl+hUENDhoqbGM7ycNTaSpanbOCT5opECI6hbFDn+hmIObZm18YSAmmuizbOvknjyt0IH5Ht0WLrRNzuLt5PH9L3qKiWeD/zOpYoxabA9ltSk/65XGFNyCXN6eUhjjE6G10oNScG9Bl7WnqVpwiPipvvVujFy9XckpWYwh1TLx1qdg1gZzBFj5PtYGKtlzgy4EkZAZnRL1+hCCig7HRmnDD+CT/bHobYS5DRXY8r/6hQJJ5jVYJsJdk5GyVM0QSXf+mNWd/OKVpHiJ+UFWNHVhAo2ag/W+WUKM4ew7LQm9HWt9FmCRG1IeIyBwFj9kP6ME/Vetf9msDcRgi8UaDQaa48LsownepTZGnGsfrcAnDi+RnNi8VVspp7Pxbk1fINd8s2iha6BYUSahK++/u0cvf5Usdx4gNMxZnTNPY+dX7QEoh3BaJ7+bAcFkxWml7HMitTa05Bj+uUDa04gWpLUEutVQcd6aCgvxvU2HaANguuiqcM+L1EJqfRto/AvWKD2ZG4ZGkWlp95kP80gS4fYaGb5+l1XpXAv9KpRjIJ3oBsGizE4CJkjioPZoV5xWg5uzZJMCl3thV2H5KuGThki3GuMiHk6UbOBYq3FxYFkCAKkQYwP8BW39ULp0gStkCOUyMPchBHIi9h8Pizbv8EomebsU61xeUQ/j7S4LEYWIZiudPll7h5D5u+afLKSgqalWL6jII47GU/O5elZFJ1vqfAhlnDiasE0xFt X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: p9x3d1/YlH9RUmTYwP2tew3dTqUtnHUL7ED0j7clZhjG3R4EPvo/LONBQiqWTD9G5O2Xv3kkeZcCWxnMOTELV/T+CIKqgQxwDmYyUvNf0iSIOSHykTngJJF+fyKT18zZ44MljlcnNHqYfpZ+Z5ytDvRxfzCfaPd+3VrwM7ruetbt8iY9vgbEgXkjLTCFFXboePljQ+vEofgA4fSuAlnVFF2K4EjkpzvsAWVeQdVNeITrjWRUyQd31BazDHJvh+x+BzIheLyHnelOqIXAv2K+Xw827b3RWip+bjmdQ2E4JiHp1VJyQlUsGmzM04sTvhOB7yQeMgXY1DnvedHrWh0W+AqoQDk9J5srHp2BKJx82M4PwkQY7Jx8/cZLWeJsyJvoCjsp87miXXRwXXzniDV2nJDiyTpwomPh2sllTL8Z5XgRv1wsshOiLpyo7cLswk0DYprVIlc4S7OZkktlkNf9gp3caVwFBEkDLJwYrzOzBw8E5ZqfBiYQgmWd1GYs9iB5A1h5P3SmxihhTH5cOZmiqyw7+AYG/wRw4xzNrWxym2s5V0J12dfAxuhySLRj/+bJRfHmY6MQg6FAI5jKqM7zOAmK874m5ZCbuBbpRFIvdYLGmafiEhN/RXC8fQXachmm6KTF7vCxAA1lPbB2k5rkOp3Z4sM1H/D0oGAMJ/6UeeyDBh26Q6rnbdPw2Olcc6iAq0M+7ta2xTWpBOi30Y/3sdu/NurY7MIyh2KIsXPq8MyR56A7mhA2+i+33GYIrzt5J7VGEB6GbGSzj/R+atltPTx4PVnZotR7fsTJKCWvtmpH9uOs/BUtWG/Cj7p655+Zxn2zxdupqgHSQi0VKvpadXYMIjHMES67j+nLwCrXCGK/dM+mlbZuhk82YFnXkk7rZDS10CwEMajdo/uho4gL5qwrFc68nJtYLsZJcnOurfwuik4DpEdnGkBTds4hXLOHmiKPSCQpSuWbFWP/FDtHbo5VZmKyjNK6dooluxdi0JzRiTP4mN9o8UwvIZSex63iId0IvDj72DwRRh3ctOMEwEAwvcQ4jtrc4AR0KZNlLWtm9k+Sv/5FhaUfLjcDlfVE1U8ffLJvkSppDpTAmKX0sbvk9sLS1AZP8WMBEcHIZLJyV+7FXfPqzXmj83q7zXG3TDe+XeLZ1tiQf7E8tDKvpykw+egrJh28av0Wkj5wquiC+nHRZMWLe/WZoBjks3pbYOzakkKQ5c1N9qI5xYzG2oNI1AzWDqS4hmxc11fhyttM+IO8YFqltPMpCINNp4nWeNAOQJ/cToHAh0p7EMp6+LmTQMmWBm79owd88AqzGxFS/tndYk/jZy1zWtlNa3IDLNm84pXGWPri74CrnFh0GphM6low44ahn7/EXZr4rTOFzlYZgJIyAmPlZF1MMBIK9g4xSX6V/xb8KtPUaLM0DMyKYEPGrMRF5gwfxry/8k1YLkiQb3c4W3UOD6Hz3ISgXqfYDGfKzflEcBaKehVjc89fFm0Al6YF2thnut2Zz5mV6ZXAo9zRFVnxiwyKfigCmkvPm5efm9vUYUXBmg0S7fymXwyR2ALiQGLzzs/Xp6OJMFbwBu0rdHL28k9r1rItKtbNQA1o7xmcjTXbdgUIWQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: M3nTLpdrilwLkjz16W5tG2WEtugl470hdHZJARkERMf6qxbqTKZxaUbObdPWDFFDLIw1AmW4pi4kh/Hk2/B7XRjcseGaxqN8NAFnOyDoQ7BJfT3nPxxwNKEXZUBxaMLOuvXO3Jl4j9jQYzMXmE3oTQueP6DPI8r4hkv1CnxbRdn2ZXXtgHZNGUtERzJKUWx4pdpFdlWOxjVY+wZWvlBdIORoZIVWV3olW3NNPt0V/ALxInJLtnITG4ZmdsIg7IHe7p9GCBXl3uLuGZ8of1O5BescQkWZ99aO4+SAAiLvbhwpPeiTtasfqx0HK2+Q+1yrYrh8rdd5mnVVwSvwn3QINLTaaf1Eh0nDDDkYOEhV84dhsGSxjOnn4Eup5VJHty6VPxz+ak35NZyLs7W341wZS3BeGpj/x4oaqYEKPBH65VUZrhKblTnfyPcHop9jaBmSIyIgXMIJ7rx1mqf2SFDC7P7D+DoPpKIPaGJP/4x4tqevvx6+3W6HVlbcEU3QQTmP7FncTVB915jCrq/D6tPxE8UC7a6jxhg3uP5jwUN6vzjgLM0lKuB7m6+yQfns3IinJzvhcr2V2pebVXZS0T+1l0zWXIbnmWnJwuYQ66DQZaM= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: a8176d6e-e517-49be-697a-08dd767fe816 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Apr 2025 09:29:48.5038 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Uth4CAPdprh85Z+45jP7kVHVhZ1oXnfoWMK/kbAtNR5p3VQ8CaMGuZuNIzw8bn6FG9Y6869nLU2FQZBYLKdOLwwrWoZa59H52gVo1p608Vs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR10MB7244 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-08_03,2025-04-07_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 adultscore=0 mlxlogscore=999 bulkscore=0 suspectscore=0 mlxscore=0 spamscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504080067 X-Proofpoint-ORIG-GUID: 0XmnN6M-vh6sUzVCMtATta6KVd_3WrK- X-Proofpoint-GUID: 0XmnN6M-vh6sUzVCMtATta6KVd_3WrK- X-Rspamd-Queue-Id: DA46E40008 X-Stat-Signature: 7wd6f6zau7ggty1sxc7u6cdsieso3oef X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1744104597-224120 X-HE-Meta: U2FsdGVkX1+P3meC+0ipPJggBHLJVfZ5VzQSf46nMkl8EGICx9fnvX4Z/yrsWNVBuqWRGR8j1577LC8nxoVcCsIB2xOv70o+INU3MmrwG+aiiZXoXm11BKux4EN+lbfDbgEKKVSTCum5LF9gDJYUDtjeCcwHC3hYGdO8q/QDaReue+lPhjc2SLyYCnPx+Po3y0scVWfYiy/VKYs2fe1LDidWO3q4s2+8FMxxKHmZD7unEXgKG5v+mrsoPS5chtxgLTJtL4tga8faMMyPQmt8iT7dK+eNUICEUdmyo31RGMw6gNEfJqFxd5iwZ7xxR0L0wVY23BuFST3Jmj/FtLVqOoaM6zasoudTLLfOXZTB0cBfMCP699L94Ws7AYCQobX4YYQ0oyHjp6frp1SlbM7sWwuozkdBqtNV4C2EJQff1rSxLjEhnziGnBsXO2Wde/V/zcdZD9oeKfVwds2qHnDdTRLBGYQErNQr3r6DR3OgnYBcyhGCIE+iuAYPKYxBYvtFX90uxhaTm5/LPlrDHEIEcsjAKepeY/M3PDEPG5qgFnF8sPnI5wEmR7lzVmaMqIQ5e+R6F3Y8MsrPQfCRDYFqmTPLx06DC/CEzO6Vsfte41g7ilm3KVSXa33p7jB4irjMhr/9H2eKucNAjEeCnSzyJ1LznJ1eVZQ0+u4ANT3AtQGJcXuhNvfTWRbHT2SClQGr30g5oTGGbqKgHTXYDxyVOPzQ6Ndv2xvkXF0412xiCVTJ+Z69OkPrEk7lteABHS2NrmBK78SiZeBwIIPIV1R5FRlD/BUpVqLbthSnWzO1Qe2EzkoQ5g9a1kaZ129yI9QWXDeM7kqFMY+UpoEYzqjdqtf9I9+lTvYoNEYESpaBfUWOimMIakb3CxDrdAnXzZZOXZZle+YXL51c7vCM1XUYd7y+tdx3Th2Q2S2Rx2YTJaS059Vyr4G8sLOExQxGZyqkxnKXK7vXJVKyRbrMovu 7980q704 vnug2yTUq8JU7JFWdnQSKsj/a648e9hfC+dovZ5n/PwkUnzfkc9ZRw5wKrs31l9kB+8+E7xiaNEDG6Ovm7/GgAG1YJnuIDRFyXM0ed1iIghfCh00NRgBdIIMmjcTXZVqM8VFcmaXrsYRjEape30WQjzyZpr+wOqMX0gJj/PcLJqnHlXnCESyGaJdCzJcC25eCQe8FcIdb2J1SWXLhSe6YYGgOOXIuTFV6dQsvdfAsadJdLqX1+MKdDEK232s9UivMUH7WXMdMWgrYax4HmZVky1QnfVrHRXcBlYHLjw328vrut1Ac7Av+6++b3Mksnjp5hVoNwAOkOAmCp+GuaJRKip9M/WrnOBCxHZk7qgEAjfUgFCn8hC8Z20t08RV0gXwUZcMJMFEEUBlGk7VoOy5ql3NJcBTQEzy+YIWNP8f1anytoHtHGrLNrmAxx6fQjhPi/hn2fw2djdNOTrxzdG3KEkHZ4jbdHYZjPfxrGBGNq0v6362wiRx6wEL0Hb5UbfEippmHa0ZWbc9oDZg6bho4rysCuquUtXs9C3yIVRm0vNY5KShHOWGBpF8TbcLaqOaDxZiupRq/CtluxxCZX7LEIIvZvCU3LpxmXo2UOREsJn7eGND8kHdQiPB0Hkzb2zEMe+hC2Ow7q3eUpcKKklS11Q0kn2MVCS7DBLvXQ5rXJqGOBvQ8M5FkAsm459jRU/DhBg/6o4LcMbf7FO/hBruSvDjbQ822CAZb/WbRCnxJIoVoElmCimbJeESmaw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Prior to the recently applied commit that permits this merge, mprotect()'ing a faulted VMA, adjacent to an unfaulted VMA, such that the two share characteristics would fail to merge due to what appear to be unintended consequences of commit 965f55dea0e3 ("mmap: avoid merging cloned VMAs"). Now we have fixed this bug, assert that we can indeed merge anonymous VMAs this way. Also assert that forked source/target VMAs are equally rejected. Previously, all empty target anon merges with one VMA faulted and the other unfaulted would be rejected incorrectly, now we ensure that unforked merge, but forked do not. Additionally, add the new test file to the MEMORY MAPPING section in MAINTAINERS, as these tests are explicitly memory mapping related. Signed-off-by: Lorenzo Stoakes Reviewed-by: Yeoreum Yun --- MAINTAINERS | 1 + tools/testing/selftests/mm/.gitignore | 1 + tools/testing/selftests/mm/Makefile | 1 + tools/testing/selftests/mm/merge.c | 455 ++++++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 4 + 5 files changed, 462 insertions(+) create mode 100644 tools/testing/selftests/mm/merge.c diff --git a/MAINTAINERS b/MAINTAINERS index de97cd54ff24..358819584ec1 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15550,6 +15550,7 @@ F: mm/mseal.c F: mm/vma.c F: mm/vma.h F: mm/vma_internal.h +F: tools/testing/selftests/mm/merge.c F: tools/testing/vma/ MEMORY TECHNOLOGY DEVICES (MTD) diff --git a/tools/testing/selftests/mm/.gitignore b/tools/testing/selftests/mm/.gitignore index c5241b193db8..91db34941a14 100644 --- a/tools/testing/selftests/mm/.gitignore +++ b/tools/testing/selftests/mm/.gitignore @@ -58,3 +58,4 @@ hugetlb_dio pkey_sighandler_tests_32 pkey_sighandler_tests_64 guard-regions +merge diff --git a/tools/testing/selftests/mm/Makefile b/tools/testing/selftests/mm/Makefile index 8270895039d1..ad4d6043a60f 100644 --- a/tools/testing/selftests/mm/Makefile +++ b/tools/testing/selftests/mm/Makefile @@ -98,6 +98,7 @@ TEST_GEN_FILES += hugetlb_madv_vs_map TEST_GEN_FILES += hugetlb_dio TEST_GEN_FILES += droppable TEST_GEN_FILES += guard-regions +TEST_GEN_FILES += merge ifneq ($(ARCH),arm64) TEST_GEN_FILES += soft-dirty diff --git a/tools/testing/selftests/mm/merge.c b/tools/testing/selftests/mm/merge.c new file mode 100644 index 000000000000..c76646cdf6e6 --- /dev/null +++ b/tools/testing/selftests/mm/merge.c @@ -0,0 +1,455 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#define _GNU_SOURCE +#include "../kselftest_harness.h" +#include +#include +#include +#include +#include +#include "vm_util.h" + +FIXTURE(merge) +{ + unsigned int page_size; + char *carveout; + struct procmap_fd procmap; +}; + +FIXTURE_SETUP(merge) +{ + self->page_size = psize(); + /* Carve out PROT_NONE region to map over. */ + self->carveout = mmap(NULL, 12 * self->page_size, PROT_NONE, + MAP_ANON | MAP_PRIVATE, -1, 0); + ASSERT_NE(self->carveout, MAP_FAILED); + /* Setup PROCMAP_QUERY interface. */ + ASSERT_EQ(open_self_procmap(&self->procmap), 0); +} + +FIXTURE_TEARDOWN(merge) +{ + ASSERT_EQ(munmap(self->carveout, 12 * self->page_size), 0); + ASSERT_EQ(close_procmap(&self->procmap), 0); +} + +TEST_F(merge, mprotect_unfaulted_left) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr; + + /* + * Map 10 pages of R/W memory within. MAP_NORESERVE so we don't hit + * merge failure due to lack of VM_ACCOUNT flag by mistake. + * + * |-----------------------| + * | unfaulted | + * |-----------------------| + */ + ptr = mmap(&carveout[page_size], 10 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + /* + * Now make the first 5 pages read-only, splitting the VMA: + * + * RO RW + * |-----------|-----------| + * | unfaulted | unfaulted | + * |-----------|-----------| + */ + ASSERT_EQ(mprotect(ptr, 5 * page_size, PROT_READ), 0); + /* + * Fault in the first of the last 5 pages so it gets an anon_vma and + * thus the whole VMA becomes 'faulted': + * + * RO RW + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + */ + ptr[5 * page_size] = 'x'; + /* + * Now mprotect() the RW region read-only, we should merge (though for + * ~15 years we did not! :): + * + * RO + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ASSERT_EQ(mprotect(&ptr[5 * page_size], 5 * page_size, PROT_READ), 0); + + /* Assert that the merge succeeded using PROCMAP_QUERY. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + +TEST_F(merge, mprotect_unfaulted_right) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr; + + /* + * |-----------------------| + * | unfaulted | + * |-----------------------| + */ + ptr = mmap(&carveout[page_size], 10 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + /* + * Now make the last 5 pages read-only, splitting the VMA: + * + * RW RO + * |-----------|-----------| + * | unfaulted | unfaulted | + * |-----------|-----------| + */ + ASSERT_EQ(mprotect(&ptr[5 * page_size], 5 * page_size, PROT_READ), 0); + /* + * Fault in the first of the first 5 pages so it gets an anon_vma and + * thus the whole VMA becomes 'faulted': + * + * RW RO + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + */ + ptr[0] = 'x'; + /* + * Now mprotect() the RW region read-only, we should merge: + * + * RO + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ASSERT_EQ(mprotect(ptr, 5 * page_size, PROT_READ), 0); + + /* Assert that the merge succeeded using PROCMAP_QUERY. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + +TEST_F(merge, mprotect_unfaulted_both) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr; + + /* + * |-----------------------| + * | unfaulted | + * |-----------------------| + */ + ptr = mmap(&carveout[2 * page_size], 9 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + /* + * Now make the first and last 3 pages read-only, splitting the VMA: + * + * RO RW RO + * |-----------|-----------|-----------| + * | unfaulted | unfaulted | unfaulted | + * |-----------|-----------|-----------| + */ + ASSERT_EQ(mprotect(ptr, 3 * page_size, PROT_READ), 0); + ASSERT_EQ(mprotect(&ptr[6 * page_size], 3 * page_size, PROT_READ), 0); + /* + * Fault in the first of the middle 3 pages so it gets an anon_vma and + * thus the whole VMA becomes 'faulted': + * + * RO RW RO + * |-----------|-----------|-----------| + * | unfaulted | faulted | unfaulted | + * |-----------|-----------|-----------| + */ + ptr[3 * page_size] = 'x'; + /* + * Now mprotect() the RW region read-only, we should merge: + * + * RO + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ASSERT_EQ(mprotect(&ptr[3 * page_size], 3 * page_size, PROT_READ), 0); + + /* Assert that the merge succeeded using PROCMAP_QUERY. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 9 * page_size); +} + +TEST_F(merge, mprotect_faulted_left_unfaulted_right) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr; + + /* + * |-----------------------| + * | unfaulted | + * |-----------------------| + */ + ptr = mmap(&carveout[2 * page_size], 9 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + /* + * Now make the last 3 pages read-only, splitting the VMA: + * + * RW RO + * |-----------------------|-----------| + * | unfaulted | unfaulted | + * |-----------------------|-----------| + */ + ASSERT_EQ(mprotect(&ptr[6 * page_size], 3 * page_size, PROT_READ), 0); + /* + * Fault in the first of the first 6 pages so it gets an anon_vma and + * thus the whole VMA becomes 'faulted': + * + * RW RO + * |-----------------------|-----------| + * | unfaulted | unfaulted | + * |-----------------------|-----------| + */ + ptr[0] = 'x'; + /* + * Now make the first 3 pages read-only, splitting the VMA: + * + * RO RW RO + * |-----------|-----------|-----------| + * | faulted | faulted | unfaulted | + * |-----------|-----------|-----------| + */ + ASSERT_EQ(mprotect(ptr, 3 * page_size, PROT_READ), 0); + /* + * Now mprotect() the RW region read-only, we should merge: + * + * RO + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ASSERT_EQ(mprotect(&ptr[3 * page_size], 3 * page_size, PROT_READ), 0); + + /* Assert that the merge succeeded using PROCMAP_QUERY. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 9 * page_size); +} + +TEST_F(merge, mprotect_unfaulted_left_faulted_right) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr; + + /* + * |-----------------------| + * | unfaulted | + * |-----------------------| + */ + ptr = mmap(&carveout[2 * page_size], 9 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + /* + * Now make the first 3 pages read-only, splitting the VMA: + * + * RO RW + * |-----------|-----------------------| + * | unfaulted | unfaulted | + * |-----------|-----------------------| + */ + ASSERT_EQ(mprotect(ptr, 3 * page_size, PROT_READ), 0); + /* + * Fault in the first of the last 6 pages so it gets an anon_vma and + * thus the whole VMA becomes 'faulted': + * + * RO RW + * |-----------|-----------------------| + * | unfaulted | faulted | + * |-----------|-----------------------| + */ + ptr[3 * page_size] = 'x'; + /* + * Now make the last 3 pages read-only, splitting the VMA: + * + * RO RW RO + * |-----------|-----------|-----------| + * | unfaulted | faulted | faulted | + * |-----------|-----------|-----------| + */ + ASSERT_EQ(mprotect(&ptr[6 * page_size], 3 * page_size, PROT_READ), 0); + /* + * Now mprotect() the RW region read-only, we should merge: + * + * RO + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ASSERT_EQ(mprotect(&ptr[3 * page_size], 3 * page_size, PROT_READ), 0); + + /* Assert that the merge succeeded using PROCMAP_QUERY. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 9 * page_size); +} + +TEST_F(merge, forked_target_vma) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + pid_t pid; + char *ptr, *ptr2; + int i; + + /* + * |-----------| + * | unfaulted | + * |-----------| + */ + ptr = mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Fault in process. + * + * |-----------| + * | faulted | + * |-----------| + */ + ptr[0] = 'x'; + + pid = fork(); + ASSERT_NE(pid, -1); + + if (pid != 0) { + wait(NULL); + return; + } + + /* Child process below: */ + + /* Reopen for child. */ + ASSERT_EQ(close_procmap(&self->procmap), 0); + ASSERT_EQ(open_self_procmap(&self->procmap), 0); + + /* unCOWing everything does not cause the AVC to go away. */ + for (i = 0; i < 5 * page_size; i += page_size) + ptr[i] = 'x'; + + /* + * Map in adjacent VMA in child. + * + * forked + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr ptr2 + */ + ptr2 = mmap(&ptr[5 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* Make sure not merged. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 5 * page_size); +} + +TEST_F(merge, forked_source_vma) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + pid_t pid; + char *ptr, *ptr2; + int i; + + /* + * |-----------|------------| + * | unfaulted | | + * |-----------|------------| + */ + ptr = mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Fault in process. + * + * |-----------|------------| + * | faulted | | + * |-----------|------------| + */ + ptr[0] = 'x'; + + pid = fork(); + ASSERT_NE(pid, -1); + + if (pid != 0) { + wait(NULL); + return; + } + + /* Child process below: */ + + /* Reopen for child. */ + ASSERT_EQ(close_procmap(&self->procmap), 0); + ASSERT_EQ(open_self_procmap(&self->procmap), 0); + + /* unCOWing everything does not cause the AVC to go away. */ + for (i = 0; i < 5 * page_size; i += page_size) + ptr[i] = 'x'; + + /* + * Map in adjacent VMA in child, ptr2 after ptr, but incompatible. + * + * forked RW RWX + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr ptr2 + */ + ptr2 = mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_ANON | MAP_PRIVATE | MAP_FIXED | MAP_NORESERVE, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* Make sure not merged. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 5 * page_size); + + /* + * Now mprotect forked region to RWX so it becomes the source for the + * merge to unfaulted region: + * + * forked RWX RWX + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr ptr2 + * + * This should NOT result in a merge, as ptr was forked. + */ + ASSERT_EQ(mprotect(ptr, 5 * page_size, PROT_READ | PROT_WRITE | PROT_EXEC), 0); + /* Again, make sure not merged. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 5 * page_size); +} + +TEST_HARNESS_MAIN diff --git a/tools/testing/selftests/mm/run_vmtests.sh b/tools/testing/selftests/mm/run_vmtests.sh index 9aff33b10999..188b125bf1f6 100755 --- a/tools/testing/selftests/mm/run_vmtests.sh +++ b/tools/testing/selftests/mm/run_vmtests.sh @@ -79,6 +79,8 @@ separated by spaces: test prctl(PR_SET_MDWE, ...) - page_frag test handling of page fragment allocation and freeing +- vma_merge + test VMA merge cases behave as expected example: ./run_vmtests.sh -t "hmm mmap ksm" EOF @@ -421,6 +423,8 @@ CATEGORY="madv_guard" run_test ./guard-regions # MADV_POPULATE_READ and MADV_POPULATE_WRITE tests CATEGORY="madv_populate" run_test ./madv_populate +CATEGORY="vma_merge" run_test ./merge + if [ -x ./memfd_secret ] then (echo 0 > /proc/sys/kernel/yama/ptrace_scope 2>&1) | tap_prefix