From patchwork Mon Mar 17 21:15:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14019990 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 1506FC282EC for ; Mon, 17 Mar 2025 21:15:36 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 13A77280001; Mon, 17 Mar 2025 17:15:34 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0E34E280005; Mon, 17 Mar 2025 17:15:34 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D8C2B280001; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id B1BF1280005 for ; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id B05BA1C83FD for ; Mon, 17 Mar 2025 21:15:34 +0000 (UTC) X-FDA: 83232299388.02.3B858D0 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf01.hostedemail.com (Postfix) with ESMTP id 312E24000E for ; Mon, 17 Mar 2025 21:15:30 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=Mj3r0Px9; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=ZiM0SYdv; spf=pass (imf01.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.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=1742246131; 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=9JGaiNeHzko7DLwD5R7fqyVgFCXtQuIIbGMbq1KTEp0=; b=mx1QuwkAHAZizrvvC0kfhhtSUm627kxS+2Zgq042G8f5SAWeNKS/kYmLw/ZoUW2ZLMOAC/ 0pxBhi3PbCJtBJe54k+MzROzXVZ0pAs0aJk0HpjsVKmkNI0984hosKz2TngG/ooOyQSN3P 7kmJwi4nJhGKs2H2rZEt++67StIcJ64= ARC-Authentication-Results: i=2; imf01.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=Mj3r0Px9; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=ZiM0SYdv; spf=pass (imf01.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.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=1742246131; a=rsa-sha256; cv=pass; b=t1ymVdGgXjrz8vzKdd3gaHws5564fSyuNPtwFfe1hukZIjK0umuP0EBzZwq5fwl1fCSFE/ etm4M1Z88QxYP3Fz01QIAPR4lCRRZumW6RuejCxIi9gn/sy9ldhz464WzNrnhk/V3E2SFE fbAwU/U83Z/FszcPuo5NtUTZW5sLh50= 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 52HKxiqY004220; Mon, 17 Mar 2025 21:15:26 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=9JGaiNeHzko7DLwD5R7fqyVgFCXtQuIIbGMbq1KTEp0=; b= Mj3r0Px9LsVLTYLx01scAclQSqtt3tMAVxhZjN9RSl7nwtr1X94zJqABWwiojdbR 2lhFk1T41niWQXwF0QhLQxG4VbAh0EhsB/I+WMEEhsL+ahGGyiTWZj3yHZXhoGHc 5hbHW5HCrjwWzB8u0IMH+vxX3VCjngEVA/44czOhF8puMKui+ActMlV0cbUK7fVE l62QTFmjZ328B41BD0z1rYzCYJLI3BfSKJoqGNVJTXy7EppT1OgTeHO8xb30DqSI 7t80wkO4G4IV0cK7SXAejy7yKk3VebFNxYILj52SPJTTcwoeoF6DoASClSTNaGoB JaZiNV4K7s+LkJL6K/GyiQ== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d23ruwx5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:26 +0000 (GMT) Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 52HJWHce023892; Mon, 17 Mar 2025 21:15:25 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2177.outbound.protection.outlook.com [104.47.58.177]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxeefmgt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:25 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vO+Av8hcypi4AUGaCDosG3/v8ouhSx1R5Q5VcvgRywNT8pjpRl58LT5YrvJmB1Weslkw98XmyHE/jrF+Y/9+aZhDd7WruYqaAJsWPuiTxt5A0j24trywfEaXTk+EZwfyk2bISjlC68eZkp6WgrFNo4h4NIc38pKxJyODDxam7S/Korbq5360PXnvapwHYKMp19M9wQBNRp+mR7hVyEHTAuVyjqlYQOjkM8wu3ff2GKyjftsqb/lmgu7waJOEw3MTxw0sZlch3PMBeiSmyaN0ocIKZAgQh4xOEboFBh1yzW1yUoIrV/BvM+ZgR8chTABAGaj6CngDNAmgkvLLbCnlAg== 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=9JGaiNeHzko7DLwD5R7fqyVgFCXtQuIIbGMbq1KTEp0=; b=VWCNLcebu75eNdDr6XZkJbRe1jLuhjP/6ax5zaNd2VOjsraM/tgkfzdx6X8IwAzIBfaIZCFvddRQwYnzjuNJYB0ei2qmf4kQQeV/4aKWV1CavWrxXX5p+wq/oiCl9ZlHQBUdRVsFdzR1vRhQdMquPN7f4AbhuaNxdC/omuzpZHOPhATNOhVN/0xtGF74pBPpbhLmeFQsxyTTsuLAXU2TsGRui75RTlroz+lpLYkOhLelKgKdyighS4rIHIwQwg/oxzInKlPhBjkFmiwjtQ/7txMmYntUuuV6P6ZRLsH0WhyFmnYb76AwN2EB+pM0JY2ZVb2nxL+uHmpxr5mZF4GHzQ== 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=9JGaiNeHzko7DLwD5R7fqyVgFCXtQuIIbGMbq1KTEp0=; b=ZiM0SYdv9ZsBGCDYGdq8xLUx5Jw0RAJQ5uUUmg78jGirOWElwDPdA1Cwnqtjen8j6wyOUJujFfDf8igECCjI7uaUqHyrIRGIco7tAOvYXrDul9dEu0TAgeeWH1lAZxxVRuyo7mRsGnAGC18IZUAQ7+9Oqjc8jiElWpTYuGNr9yM= Received: from MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) by PH7PR10MB7105.namprd10.prod.outlook.com (2603:10b6:510:27f::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Mon, 17 Mar 2025 21:15:22 +0000 Received: from MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c]) by MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c%4]) with mapi id 15.20.8534.031; Mon, 17 Mar 2025 21:15:22 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/3] mm/vma: fix incorrectly disallowed anonymous VMA merges Date: Mon, 17 Mar 2025 21:15:03 +0000 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0129.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2c6::20) To MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR10MB4112:EE_|PH7PR10MB7105:EE_ X-MS-Office365-Filtering-Correlation-Id: ef0c1a96-7ebc-4704-8454-08dd6598d3dd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: zNV429CfdEm+kvyw3rNiZX98+gqLHacDAdPdpwU6OOX5y2XZoINu0yeJvE4a+GMpQ/P6zvmZg9JeMBqNucAhV9x/Db2M/T1T93Vrs/MlTIjhUzAlWw0doCPefvcEYxeizEoUoq3GYPJ6Jx2T9TOJGjqN4Q0pkwllJ/p2KaimR1z6YbNnEDPDw44HqrlZiptlYKGKSQUxrv2o3C+dR/xd/9/xIT4l0O2jxrAs82DpgV8BB9rsRmSGohnaLGw2C2EPVq/J6z91Qpxw+snXt3hvd3y/A5GzLK0WKe/TzKvGY8KEDsOrF5KbAOtzUpck7Bsnn8xyHiFqFFWF9Bl/OC2j3nbPLbyf9heIi6s9gds8uNwBTwvslzTIbsofjd4eGJvOYVBQ8ZyccrwY8MOwMk9oM3RH+gW6MN6SDdZzMmH3dBcCfm3UCUvuVWlhoeJlYR+JDLoY/69mVWsiBvsXtwGXjrnCWl1yxp4dKPNjb/SdIBXpRG6uuToRSCXxnMxOsVEsGV8HDiQrNWzs9hyJWl9BQkd/pGjKKewJ2l3SA0lw/enN2StyEhxU4qq2WaEH9kegyxdwr0TXY4kGGuasLLCnakxecobRKvJUNK+iut3ThuXCRaHGEHIfejC7P5YRTkSpKy5zeBrQnQo1XdcpEoOIsKz0uVzFHwXtZ8RxBpNZMpU3mShLTIl/8ZmC4w36ejWgJyAoQ1ZZj29JHQfh5xlyI5795ImIBDECkAtVTVqFZaj8zOI14oecETmzxGDDJ59iPENmCAITo0EIqiSe5/RNJQ6zCFzYIwjOw8KqQXfpd3MeSaxngSa7uMmGf4Rb29k0Q7Ssxdnt7ns3wpFYnR2Z7yz6+UrxTsqCM7qMO70OeK5kn0Vc7BT5cLbeT+EvtMvwRbnsdLPCayjWcS2qE1xItg3+WPmNzPB4yVCRyFQw1/oJ18Tn5tMgGkeGtXGkxWR7o1VQkKRPnzbYKERl1kPStFLdev1K9dxHNMHTkfaCLlbKrGiEEWA0OF88zy8OnaWw/au5dbJbMcSVQw2U2Xw8k4WxFGCxrqqMs64StoMy8EZPARi6mhEFIYcA326BmXbHT+xmQp0zSl3Q0YtorjZLNJl4tB+sAcYTpTLiSsQlTjCIOITiPsB9NIX3GYDIIcp6JrD9tGB/UqiMP5HIHTv/UvOfskzaE+fzh2avpzMJIv0eS4VseV8/SJjECGbotXOCi0nQYIj11qht8xhB6JBmHYjlvmXKjNjNfJgFSZ9krqtYIVfaXkBuVY3p+0GBi0l1cllctV6wB1+v/DzIwOFlBg4YrPcYM8TfWeInslSetOt53ssw7T9Kv67v5f8je0Ok9m+Vdjm23mPtmyziwdKDqes498QADNNsNhadg3nFlYzhjrDIie+mzaCveSfJ8dgN X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB4112.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 7W8He5CTl4G/1/8S/mtNfPq5YlHS2e3zMsfAbbHVB1xq8p9Kn5w9d8PM+PNbd8y1cO/yh+m1EtC5xbWqiedZCdc9jDYk4plI0u3sdmKTAFkhf8UyC4yFWiW0X8uQy18wiO1Nd/4K8Jutw2JqBppX8Q/2ujuRc8RnqsN9g31OA3Tjuc03o2Gm3mhmM4+TRAxjqm40pN3NUwt/LV2q1KqeJRKOq1KmFLpy38JTnOFTZRn8H5MCRyk6bnzy+q4nZAcRLrqvam80BfcUm26cHLEJ1ICUe1QCgL5ypUBk3YJtEKEJBW2oUh8xXB1Tv/uMqrqIkNnJDJs6AnGCKBJHFuRlMX/IGLdzskY5uxuIqByA/mQhHByOuKQAcKessWl0y8e6kUwCi1x8TtLUBAPv64kJRkXKvw1ldenpd/CnzxrPEaHTeGWpnbcCLHYEjZLYNRG/gb52PV0Q3Ruz1zKtp3oxombgiTNMARertdybKevE8wEqU0JZz9cjuAEMMnfPGCj5CGCKFjivv7TvzpJ2Nm9qBl1Z0u28o2Oo6h1jFOJVF+HECM3XjeHSFRyMVQJfLmQpY3pHDnaIR4HLU/p1w58LozdAC2D/kJ8Nd9pXuIU/YwkuxBPd94HaRlDvO1CA9VkUp09d7DGqcwzIkOeCfbIO2kk12+Ei068HBtdqPBndMb4gG754eL4uth/GPZA6ze2R7dzTQXqrs6zMdRBgW852SQusYDaiQECoG6KVM0QNxjQw7r5bURsoG1T8OfrOz8SKDhiQ8POXN1gOiQsWf56Pkm91c0s9JApS49OqDntHGItKbQow9+q0j1EICrlDhZn0VdabV8yW5TLKvDQFa0CiKTIxCQr9MWv0pyKXUnHD18N0T0Ka9bQg0Azvo8RZZgA1WR049V08qWzOpNp5/lY8vDxGuqaeG9/aIGUceMvbWnDT/6reVDcjsN7820YZd26N0UPnGWSjR21vBqZ5RerOpE2xLyQ8wuGEZ26bpU33FTAssl+JH0PsBRiZidfFaKfArlo5IuC8S4fMfg1KBUdrDwU4ZUsu5cwxgTEk///1jjTk92ltKf8HK06ierX+VxUind8V4B3bdCPxtKpWhu6GHVCy1Lr5dXiKsh6uk9/D2hQJzpddLZHDja9zALjma6oCT0mtcK1JGv+Xh9fEy3s6quZX+yVAM9aDRv+/8DRvGYg1E0Q3MICmENnNOMpMtQulq1rKeTOlVzllpiK6feunQQKR+nUBJeohXuhjkIKxltBHaLqd1GX2K/Ry/dL5rrcyj/uStoA649hZaTHLTxRlYjPNxnUzpUkUPhwNGWQCuh0pd7oA/i+4P5a7G5X1fazHfypGSpO2ipoWw6uBG71CbYjL6K+fyecOQrMUOzs9Kxv0eT8Gy5QtfxQdKpEDaqXzT/DkRJyd803LX2dGZ5xkyHBGawqZJfAIzhA8F4G/3vE6MNRtuLs777h6K+103RGMZavrSGy7TFEINRAnFfj5sj7hQAPqWGb7/l0bf2OvcBSMHynhz6xUqM5XTSHjrQP55Azo+XyMgG80PmNMwS58H4f7a+2VhtEEPERX2/MPeq7WShEJEd2zbQ87vIjhYz+xVR0CdQr4uXzU2OARE5Gaaw== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 7qky29zhmI+qs+a2oiwNeUKf4mTTN9Cpt3/a/sGqwqKWnKB2Jp2+tWSmAOGL5G98pab9cya0In+yIez8BiFqpYEpU136+EJjgFteJwjSk1rBEtfzQqrPDJ2Kyqe19BJsKITpWsf+7VgHvrGrv+n0mbzlZWd2kXr0TSQ1xeaqaCn/GDHRE2tgOTRP9fsCbK44lqSBYKoAtTStg3TDhSbnh41Wu5s71seDMHjbBn/rAGqYM3qc5Vm/Ofd39Y4gSuoS8pMfZHChxpfmwyfMHfbzBRrhsSBmEBqwy27odNxkT/WwHr0i5BSARLeek/WF6zkoNDRz21H6ESiuW2dXZux5tRuVVFfeOoDzJ5DuYtGy/L54wcnjY5s89BWgnKCwu73smkSzrVS5m6TxQnOvVxSYD+qh/GbyupjiST/3TT9bJWkZ6TvJzIqFIs8GQJpfxlgKMoK/s4jcZAVrM5S4b6yM1T24d+PQxK390IGS6sJrplsgec2P9J2Hf6gi6Gi980QN78k4WpUylA3jwHA0D0ifJQNrsvD3e8Df8wLgWkkSAB/u6d6NXvV3H3UAXrsvAJHGEdPotHtHTz29l22qsWTqqkwdYZC5DTouCF9wGvYa06s= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: ef0c1a96-7ebc-4704-8454-08dd6598d3dd X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB4112.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2025 21:15:22.2802 (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: VeRONMIeOyUefkxA/ePGXpIooojbd0QYaJqkvNEqnmLIKEpXdmZkghkynLuXKec6IqeC53YszsXiBVYJ6mhBbzQqgLj1VRmD2dj2u/ao2SI= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB7105 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-17_09,2025-03-17_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 phishscore=0 mlxscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503170153 X-Proofpoint-GUID: RKclHUrvIMeSSv94VMdJbQkRfwOTrHDD X-Proofpoint-ORIG-GUID: RKclHUrvIMeSSv94VMdJbQkRfwOTrHDD X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 312E24000E X-Stat-Signature: jasut5mmt9nyg1yeei84acnw4cjn5841 X-HE-Tag: 1742246130-289593 X-HE-Meta: U2FsdGVkX1/N1BYj4XxT9VzQrYi7w43yhnS1lzg7b7/pHt65Prl8Mrtcvvsl3PjAwLP0JvhW622FMAuvm7OGEq7msrdz+ImYUkol8fiU97xj8k4TkvW86CI/3/lUaFW6kiWXql50hla1lVqJfT82gV6My18VTW/guKTxY+JB2qV6J7v1rScjY/IX3bLjWSSKmhYz7tiLSCpZOHvtO3D3zQGPLYjXndR/NiVH0fcf3lAdFi92KMvdEuZrc9MdCgfljtf5pie82py15hm6u3aYUl1Z3heFQ2s0OXTt/hRpiMTf9qfvXQr/Et6khLt1LHMNeaMzl8FBELxuc9bWE6zVlcy9rKoG8IkW1vHo2RMquQo8bGdRy39iXrSajAqmdhnap/+rvx1wtW6TWplKZGEcrk6lzskfiwsd6LeZiMIk/rfNEIRiUXy47U4ja1sdOsbxea79smE4jMjOB70joGPlGkDypf5psuqTtVPrDuNGDWJvO8TG2Uw+w5ISQ+OycF0n/ssNmErgA1W3+Y8Eu4+9pFZOAFXQ1eurM19NNpF1USwMoWt8CmOCtIXBKalrOOJZM8jL6ak4WBcjEhADsX7gAL1uoBNzyG9bAaU0IqHPq0QgEChxZhdyx6NV4fs1Fk+I9GgylJfBiVemQn4g8At6Q0X2qT0tXNDKH4y0f1eSRfCCR8yml7/EuS7PQCIyrvU30GiJ363AIIvQGLCT2tUuqey4rsJNHVWfmWL7o/6if6F0/lic1hVbU9Y6TXPkZzF1muZb5Y8tjOreSdGbbKcitokwlMB6YpXsCFhYsWZCCKQw3Wp8pQ8r49m5m1CicJp21gQV7XXhFgX3mUBuHJBvcQUoUpgKl5Y8LpnjzmJCu7waOx5EfVW085Aex9R4GN5XqYfb5p/y6Q/xHQljkB6s8W/P4dw6sYd8JG1p9Y0IIk7hJCfXRXqRPOtxBt2JSmhW4s8Wrsw5Aj76s04PXfI 2DXNMNGT RYp92KU5gc8i9xYwSf5booWXHRE0lqky4uqF1zYdjKIV72r7pRKq8cjPdXNTfYCRPLUlXc2qafIrg7Oor59LAy6FCANyAO1FLJGQOOvlmf5J5lV6OSI+rhq5+GAD3Li3RUIp99MMY9x5L4TuMkoR8Za/3biwqfWnPh2/xfyjehXYYeJ4+Dn9QL1MajxeSJ0mvLsnduA8h1tDvbhoZ/ahN+bEtc4L7vmTKK4QKPAv0TKCRppMXgs7PcWLh+lsVQ2WtZc2DslxEjkCt2C6Wm/9hoRSuZyY9WsjcH/apmNskI4bWv41cgb8//WX8jE/7QW796Fwm1tzyDOueNDk7y/wpLFv7RIeZFTjMBDkB/8XADGRrcXWhy3UMR8pzBy2hSUxGlR1CN177fh+ozm67J9jspirFNb1SOY0MvId17+xybOUBDWG8wD1HtTrR5a2wK2vaMQYAyHeUqvQ+TWExmWusZ6lSJP478kS3BYyz9PwjlOUaEnFBzrSFzBwx88AXvyGc02AOZZHeBbgB53x5mCvcoBNKFWWThUlLLhCMqEtdDu71FyEX/6+6p1c4XvgiVvb/sHJx3EkEimc6gnOCN/FLPfb50QLj8FTcYW3E 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 --- 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 5cdc5612bfc1..5418eef3a852 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 Mon Mar 17 21:15:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14019989 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 565CDC28B28 for ; Mon, 17 Mar 2025 21:15:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 94C54280004; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 8D49A280001; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6BF12280004; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 4677D280001 for ; Mon, 17 Mar 2025 17:15:33 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 0D0F8C0682 for ; Mon, 17 Mar 2025 21:15:34 +0000 (UTC) X-FDA: 83232299388.11.E364035 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf20.hostedemail.com (Postfix) with ESMTP id A66431C0012 for ; Mon, 17 Mar 2025 21:15:30 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=IBD1y0SC; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=AfT90CYp; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf20.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742246130; 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=5ALnRtJHBCOGTybACSflieRd9BTsCCokIy1Rg6CQogE=; b=4nQyw/Jv613R1eqgSWerRr9UwAXhlYOFStdU1Ax7KEpWPu5ej4y1QUr7ALu9KoFn0Au8b7 9ZRzCt+Vxn9kO7aky4lyu5YO+D7bUdPWhdjNx9ZbmnBqTZ/0Sm4r9UBlS7qTD5GlFjLGvA l4ml9OhoT5wH8C9mdYfIuEO7RURoZ4k= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742246130; a=rsa-sha256; cv=pass; b=HBGGCyUWgIePT0IlTzwmhHY6PWF7gBmRj1aX7p/cddiFzsRK+gAExbZW07/6TZxEiMrZmk Fsxnu4npmfVfDigRbPyROccOFqt7Ddf9ImY8zslYAQzZeDKWaLB/FLnNvG/qk5YyOy8HAC cYyzutXMTcTX1eX0tHoK0PaDp6EGu/M= ARC-Authentication-Results: i=2; imf20.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=IBD1y0SC; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=AfT90CYp; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf20.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52HKxULb020921; Mon, 17 Mar 2025 21:15:27 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=5ALnRtJHBCOGTybACSflieRd9BTsCCokIy1Rg6CQogE=; b= IBD1y0SCLo2BrBWLBMgrK7RlX4/ZFPBwclGgqbNQQnb8EUEj1cPSFiQGicsbOfks aNZGM8qF23vi6F5J5rg/0e/KWb1tTmr3EuxaJKC+BPn7lXxB1yiBfAEvJwp1ffKc 7t6OkEKKqVkH6AjCQ0dwG1uNecwDWecfV9INoSCzm3N1MTGPCiwO6JDrZ3c4Wvhv 2KvOSHiHbLy1z6fE8gLjXppeRLCtXGUckl40i2mukrly+syAZnOGFBA8BjR3Ex7K qEkArfeZmDBDCuOqc6nSr2KOg1nS4gQIb5IsFsobl5vq9q1HJazYPOYndh9oNNoH /nRUBjGIQ2DNqaBpyRteNQ== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1k9uxpf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:26 +0000 (GMT) Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 52HJWHcf023892; Mon, 17 Mar 2025 21:15:26 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2177.outbound.protection.outlook.com [104.47.58.177]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxeefmgt-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:26 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=x1aTLXFP0YoehRmJ8Cj3yZK01UNjEbFPS1c6plspUV+Y75zRuNLhc/pQEggO2WLRdOBhApcIDzy0SE9ly9cDEWJhQyLg8yWwxHY/SwsY9hAo8TY/hWK5NsbWiunkJG4gRxidvr4KdJPz7ltYzhrLD2cF/zCnV2oZVerrheQpRduHk+PTaRQxqoiHUIr7JnmubfIiLD+myF/Tu172WO/hdPVoU1moJTQm6X63Sp3votMIfbmkOFOTM4QC7I0tD+TfPCG+wHbFoVVaxbyKnIiUn4Lzuw5cukKQDVxyWerBQOQUBJLxjwLfS5IEO0KKqRryXuyrc9IMgXaGRrKy8XI5JQ== 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=5ALnRtJHBCOGTybACSflieRd9BTsCCokIy1Rg6CQogE=; b=gusF3pUCkEJpCYXhJ8wPl7zXmMTYY+6F93vvvaYma9lEHLSYBIMJDcLovm8XnAd77OvuDfWqxQnwOyEHGiJ7Z2fTc+9SkEZotYuOGVo1nd4xNdy9XMluzDa9msWuuWcXH3u8uu2CmJItnurdYL1VunG815WmukY/p5A49Q9UmuZvtEUqB9CejIMn9FcNmiQw8sBrCfuvqyeLkbnXYgu+Ekccn7+QQWddze+fq1Npcot/tyjZStd2jxWvtCe57HyDhSVoHYj6q00W6sqMPlMh6d+aeO/mjS9GqUZzR908EynZc6CdGDJWCgOVjc8Pk5AFU3QRPYItNbBy1mSqPpip7g== 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=5ALnRtJHBCOGTybACSflieRd9BTsCCokIy1Rg6CQogE=; b=AfT90CYpXiXTwCId4xN8Fhz+g5KiDeawqS/rcJF8sdpHj70SXv3+NmIEiLlJZj/QjcuZF0YezqeqmO9zaBrcTWTzUHBICHsbhOj1SemznAI9zEAbn3qvP6Cqbhn3tqKJHUK/6/fT/JRCfutgBjU8vMcviPc4ZlUTc6Yg3q/XAXc= Received: from MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) by PH7PR10MB7105.namprd10.prod.outlook.com (2603:10b6:510:27f::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Mon, 17 Mar 2025 21:15:24 +0000 Received: from MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c]) by MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c%4]) with mapi id 15.20.8534.031; Mon, 17 Mar 2025 21:15:24 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/3] tools/testing: add PROCMAP_QUERY helper functions in mm self tests Date: Mon, 17 Mar 2025 21:15:04 +0000 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LNXP265CA0010.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:5e::22) To MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR10MB4112:EE_|PH7PR10MB7105:EE_ X-MS-Office365-Filtering-Correlation-Id: 4b40cc0b-cae4-47fd-07f6-08dd6598d522 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: IGAF+qG+o+XJri5a73zY6p4qF3nXu/0tIa1hQ7XdXXIwikDXn5ZuVenzAulpRiWPD2uiRMNS6gAV7sKA6QJ3hU7qW5DCSZkxQEiiRqNkIN8S+4za+aRqvsKkW6Jgwh3lLqbRd5TdAiZ64qfXkEScFyAhMttAl9GE7hi+mF9TpDGvfs6tPbJCAifKz9n+NxKnJeSH9wIom5KrV7g/RBGNijqk7icEX2UeoRyu/zV2wJS59UNpaRV34Oa1+xCKLGs44/99/8WABxeWdH+w5Bo8oxLIEsz81j+azdQXSrcIjVTzFBQSFPCHyBsT92PXEVrUqzAA2KcXvqbnUssYIPHRgRzEfSUYjMe3mvh2/B7qGlQcnq3P4tSCA66jYqB1fil681IHtEb9M1JR+9E/ukNIr2j71Wq965sznXRE5lEnI9yYeEL+l4+M/u29k8JtUttWQFlq6Jbhu1YaVSTPsTw8S9T18kCaXfjGpckaTKwVmkZ4w3tAr5HkXHWT8MuYg4wsezGL4h5ptCHCLElJ5COmITJF8IxKXGalYjjMGMB6c97p26VnTRDE6qkAg+ZVkv90nQ+0j6yzj7FohPZXP/KCaTxlpXwTvu1aoI1tGsaPKWWa9SICjYtCaFXgThw7IvwiKLhUXGctXaSqnmVi2gaQUr0GEkBQ4H+BEkRBi1ebmaFr3cs4j1RQLb2qfbwvoDj5ZRde0WXUp4rrvMw71BIdxq8OqKYHUdllqJDHFQFtKA2ioOm3K6NBqYJngXjKQFR3e7DfEOwqMxLTC1vlP/3OUMwliTUcDOBHkEEaRBSH5Ki2Q7cbVM4TRnAsycls/OgurzcQJl+Em6dHTG85zVCpSMzKBEYKMkbK072wIhD/NYwHvmOpZLbjNJFTUdTqm5s/UesZJDHL3f88FZPvTfqTBTYWEiYrP1haim1IkTi8tq8XI202avT0PmXTkfbX3otXCkthpik23dRqvGCdPM4Ax4vBsaSQzhdWUQHVOhhUmoRohQDkg4ZrVCF0V7/vKUi/B7ZKkkgwu9Z26eoGFTvwQW6isUsp627OuwaSUQTxWy8DplGral4/Tp+EJWEhHPGabzFUoDpF667+VYff8akRlp+7UGhu6HUyamQ+56eW5Iz4NoREsyX31T/ldHrRRnpwDQc4/Pt9QRJHU89UsdMwo6RUoXJ4ErZadsnvkXMl97IxkeWM31DdPwW8nCZMsW7V8xykD4UR2q3gq5lrPFT++sxTwRcNpMtggC2MZF1eXad5GrvNxQdx1KaqCbaesxA84cgIe+j8wla1CD1vJsfb0yC2cshf+IbzyLuDqKztNDJOyNoNbrA1bhO1WYVqnlSCQK8ni4rpC0TFLc988goeYgVolpH6nm+7CgcWNgYuU4iBzn4uQVFpXIH45mnxvnd4 X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB4112.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NKDHBC2+aiGOWkxG70jV0N7zaXm1YmZDb8Llbar4e+HnpXY6xmpSUcvvhPJPCQ68Fcud25eYyb8udZrv+TJua5sKvsXApJzgQW1SvJmJG13gYEFOgHe0/7JxwRIy4D4zz5p9hdyYYVQiazXohAgj1Js2MDq/8qlHA59PniLCGbAMcXfLt4mTqR4QDXeNA6sJoUowLmVWywhO5uOCGy6wbAyJk40sdAGxN4pwzzObQ5ZKtkLENLLdsxZvD/MXSovCg11STTRLEkm3eOjd5WpUTRpl35LUlebufIC13abN3lompv92DvxsLpdUNjB2QSTz74rQrAuSONabDYHhNhLiyPrDyUTndm8I7owpec4Dms0MSbuyxB0781x3mLfs+E0Q9J+H1UBdx9bGyguq1uf9J/YuCdxhPwj4uJkLUU3/kpneBc7oo+8azuFK7DQ9FYc7Pt2Udub280QtGthoI0PyFbZWCQ0e/yxD5Az/BokA42uwxDQlDaDhN5lK7DuMpNm40BhoCbPCL4Npw5pAwO9vIVVU++U88DABGhmfXjGfSSFEf6e6BKP+E4KzeJe4wLYM7Ex7Ux60pXUY09YWQBYjrklznO5EPUHSqglaOigWkEm7VwKBETRc7kLbwwX2fSSOzoKMa3ibD79w5qBVmwbMsprtS+iHOWtjc5rN1LhZNDLsnOl/Bq3i7cU/dn7UfAqnLJBeiqHcuvNacqhrO4kXf1WRCDBpkSdI74KiY70EngkcsacRBnkgTtd3byB0yUp4h1qDwTrtVslARZqc+pm76fSZgqFyEZQG6wwxb+GsrR4r9fei62Nh3ait0D15bSJczmTYNjxgN5Vpe6R3YAFTtsR2LQwFZLLBqH0GPZKV+0q8t9pG/YuMWleZ+90xBoZ8lNJ2YACVGwQ9YMQXDThZlH3GAzCzUFXqkIdrIEywl5Z63tblSZhog10fgFWzQkwFsyLbXnNicQFUfjP/DaipmDkYMhtzTGSn0A57pffvQq8S72OeYJn3rQuKmvfK42/jftleXZA7Q776NQiJcHaB0fOfIkz6Rwiy0NuNs4znea7AzbCsDXu7/WWeywdavtJSwv5G0gdCdFtfYSfU3LgENoYndhDjCdY/nZbW0gnuMsCgDrjEb+7Bie/lL6xjZFvmkqjYEXmmStiijKhZbelJNt4MCU38x2lJs62w6rxWWqi52v5pRdWwDZQIDecKtS3oRuRIBIleUZVdXAoS+xl7QbEP/Sndygvc8zmTucBA21/Ktj2W9e51oJSTQ4kgFd8FT4Mx4FBTJmk03HYwILELSMGPaJ5xHbXoSfoA0HqiTcsM4rLNfxBYMR/02ft6lQ9yXJhmg9vIve43gbKqoQOBroElTR17WW3gjXQW9knMGy4xpntWI1p1Ib1JZ1N4MvrDMnoVmjQAXJNdoE5Cw2IRfd4xYS4iTPcrgXgKoefPNvSWFU2dzHQ05Egu/qysJ1ZmaFkQj81fv1SKYKVlcFKex8ga944YreP1IhUdSvbt4iKU+20L3vtyXSYERwFAzBJSh9lRWSDhgjzeM3W9chc2aEy0gjbzmEpiv2hKN42sfmmqAktS9GRoc18HI9WGI7H4dXLCZcRmFphpEYSSzGQezA== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: D8nulWBJKpyQWesQNPT9BkhSXU57CsuujyQGh7bMs2FI6W3XDk+MaILvx4T3+/ZN9OedZtP8+nuklVZO3bcQyIbgKe+rLZSOVNURFrfqS6w6hON0IZgwE+nsAkfW7nQVpJwt0nlNR7chZeri7p6FxMopW6G8WHTaOV3fx+K3lgrmYSS8ezYGTasAPOBeRJmaGm+stHCdw1/ugWopHvNnUA9rwqp9wcj4PpfVFx5go0gxarY1H7j/K0wIIXTRFd4Sklnq/12mjH3jXSoTD3+zlUvNXKPT7j92YE4Iz7Z0xNzM4jPSXNCbN6rKYDzSiFhyxG9L0An7z+6eQlowvT2M3PnyjrTvHjV6V88Yp+4wr3RzbtxgBLZYOg57p5Q6SrcGBYbeLt+FPuCg+FZb6wb689LELCru3N1kbQrk36WMa8zftLY8cB0z6HffF7rPvsgRHxl6omTpSJFbNbN3WWfXVhWwwb02vZqA23/bzMZXhH+Bl8gjWlWNjsp0eLrbPUgZ3Zn68uaIPkBJxCpd3zvsABu15NOZb56Yk3WQ8FrdZqAYSDOpEnn6s6o2j+a9KV6OxzenS0ao80aOJick4vmAZDgpTTy+rVv4mDSyttTVVBI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4b40cc0b-cae4-47fd-07f6-08dd6598d522 X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB4112.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2025 21:15:24.2778 (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: 6tCf4pOg2VAZKpHeKWMkgHGXTWb4nNIDBn4xSYHdgwRlV3YXt7SZpNmdsPow3AxLJedNo+jx15tHjSa4Mx5M5j4uW0158GtgOiL4m6jP/lk= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB7105 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-17_09,2025-03-17_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 phishscore=0 mlxscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503170153 X-Proofpoint-GUID: WKbj2fwl6-b4KPIR04sY7JRWS1wgIB1l X-Proofpoint-ORIG-GUID: WKbj2fwl6-b4KPIR04sY7JRWS1wgIB1l X-Rspam-User: X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: A66431C0012 X-Stat-Signature: pohgn61pixkf6z1qtjufeiqxd4tixaan X-HE-Tag: 1742246130-947588 X-HE-Meta: U2FsdGVkX18CuhY13JF/q4hwzEr37lyZ3z3z0ZHuzK35mmL5hPCod2FW8Q+ufQ49bnGhNO1s7RVZcUFLOP4SAJ0xBBxewy74Hf7N2BYpwCXIwZgyEjhBh5/gUHp4jMfCRqvgTaUvWbkVguu3Xunjys0feVkJjUo93KkPu+cD5sjtE9gV/1JyGZNH96EJRD7B/cOzGg7Ii9JmTZSxYEAGg9Rqk9stfPOkYyXRMDqpbcMpedkwNCAecCWlMlQ/iutzG/5WZe1woq2f+mKmVEotOtIEhPtfhxeuNFS2dRFunZK5kN9SMHenDtcCcfTuu4fcsF2BfxOLogF7De78wQfAhHe19agszCoJTqkblgCCpvmkHVM6op6yXh4DV+9BerFRTRGeap/jj0m/bnG6J9GwP03E3NdjXorIEzFEMOVWSc9o/XQW/eMUg2vig6ur77K1prwvvQqV6aiBGApjgOL9fwJr/g9gwLhQf/7Tbz7jmuRCjO4eq8kjhLWEDLKOgJ8C4TV9qxL/uycjkZPE+GcJO5/5Xa0JCp2002wUmsCu5QTITJIWg7msjRFDODHZCJRr+X8XuN0mAEfh5bXPc7bWORkob94GGYNgb1zG9eNeYEdexaqTNis1iYMwZVv21DB90QMQeWwV2Wj5PIE3Iq0YDcvMmuX1wDzKGkEbunvD/xX5M5FTXyQmc+KON838IIq1kHZJgU7sb5/cbnXvhhubMCAwK75xxsoQDJI3wLo9T8wFzhhg5SzX9+n8atwCWIPlnFMWj0+7wtrQm3kRn2GRL0UfckO2/R14QMY0Uv97TWfxiAX95Mm3P66rxKYampc+XfhYTVuG1mbXsidVtTnhzI91qyQe9485MeQ7oHxTn7HKuAKdnXHkhpQKg9l29B3JKEX6PecOyR/+krncaBJyfNpQy4ydGSTr5oJEKnHacDRo5KUBVonjslT4YXTiB5YLXnzMLFk+yPFvjwA0FfR TGEnoq2Q u8fzE8QpJawi10vyRUkDaQmC0Lop3fmZ2tdxcHWT5UYoEcebBIwIjd8x0faayexYW3rfIOVljYnucm/JaCaLg1wZj8FtsdIlZUJ1ZheJbtzxyYuUnKhpcC3bcxOWntifmAuTSQJhtx8l/2nodMsiInLJyC1mXJAXzxcGr5PMkIDGsR4kHgm9DEvZbV5AyBlrTk978B8THSyiXq8IMXLOCbxc4BsUxfnima3ALoPMZq40/6tW0j1aTrgC/ZtkT4sp9c9AJWxEuzKENK3oguTDwx5TXdQb6DibmJvMbJf93ujQNborV8dccOoVRoSSjoFUS4LWTPf/4WMkUrim8OJaY7bJl+I1NrRD/vWD5pouESFK9xg7y7x0ugrQXt7dugmMl76hWue8UZJ4yzsdzUsmaWzdHks9E1ItBIj8NL40W817O4A7brPdEyZPtha2IJ3KEfEybvpe7619Q3v1uk5VkzbcLKmV5Jd0S279prpA0fUL2uRHhwT78T5jp3K0BWFQJ8GgNt+cS/XvWruBPdmOKKZhQhg0zTdyCdTG4Wlww1XmDTMrL22UdNWUcaA9urnXV5TAyzl/U70oISq/d95QMj6YJv7dVZq3+rd6hc9+67csGRbQVPXiQQ05wBW3CNIrA2lQiawZd26rbd9RD9Pp7YbMFRQ== 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 --- 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..891ce17453cd 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 0e629586556b..aaea0ef78322 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -5,6 +5,7 @@ #include #include /* ffsl() */ #include /* _SC_PAGESIZE */ +#include #define BIT_ULL(nr) (1ULL << (nr)) #define PM_SOFT_DIRTY BIT_ULL(55) @@ -18,6 +19,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) @@ -55,6 +65,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 Mon Mar 17 21:15:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14019991 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 8C629C35FF8 for ; Mon, 17 Mar 2025 21:15:39 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 36F1C280006; Mon, 17 Mar 2025 17:15:36 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 31DE2280005; Mon, 17 Mar 2025 17:15:36 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F2D57280006; Mon, 17 Mar 2025 17:15:35 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id CAF15280005 for ; Mon, 17 Mar 2025 17:15:35 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id CFAF31206D0 for ; Mon, 17 Mar 2025 21:15:36 +0000 (UTC) X-FDA: 83232299472.16.CF1D605 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf04.hostedemail.com (Postfix) with ESMTP id 9837840002 for ; Mon, 17 Mar 2025 21:15:33 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=GZA9qEw2; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=kb9mnzB5; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf04.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-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742246133; 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=ARIetQv6XeaY5idpJw5j2EHsVFHKr5j/kc9YhY8bEj4=; b=WKiLgnWO0cDl0oqhdMdddM/xYsYwWBQJr5aZGpQ5qB1WlUJjWWvi+W3psTWpG4z1iiWymX X9WFaXLb3Y6idLIzFMPZQ+2fI1vj1MGEMjxAA4aFJr1r7y9+F9hLRhbyQo1VDQ7/kl9pGZ pOkYnT00SZJ9iYZYmARcieygQtHXb/s= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742246133; a=rsa-sha256; cv=pass; b=aKgFjHwDoE8+B19FWp85AILk8aCWHpw/EsIM4i/dgvh5Kqpo2WA66qOsui93ooctCbAZkW 9fbTEWqNjG5Eeauhq0mqzLoRRWugUHd1WwFJrPlEePNEeLAYFUjUaSxTRy7J9MFHGiR8Ws g/N1xm2mYRx0a5asAlt66N5/13adWQw= ARC-Authentication-Results: i=2; imf04.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=GZA9qEw2; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=kb9mnzB5; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf04.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 Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52HKxTCT008309; Mon, 17 Mar 2025 21:15:30 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=ARIetQv6XeaY5idpJw5j2EHsVFHKr5j/kc9YhY8bEj4=; b= GZA9qEw2fzYd+RzUXlQyAp8He+lBffWEnXF6Pj0deBHKEHdI3VbKOQpm/ZoIfHbn W62mSgUXOVlj6SP0CdyovLs/Bw/El2LufF8pvcm2ldaQS3qMnEIma+ViRNhIg+wi sHdSfoAWm/mSssLVDACqa8vdQXjvCXAmBmu9GQWC6TUEZITRHc7mGbR+CrZ7prEh 7hUiLb627/ZXiCVFjE/GL1vxzSFwlCYSbZK3HIOYIBtoHjfRp+DMtC7qG5OmDNDJ uDhS8ZAb+Ft4HDJD9eKD2Av1m+4Mo06lfGpfBsVuZpO1Ts0AJ/POPK2V4U8sl22M MAmfAzRdT+SUb6Z+UX1glg== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1kb408r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:29 +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 52HKbICg027962; Mon, 17 Mar 2025 21:15:29 GMT Received: from nam04-mw2-obe.outbound.protection.outlook.com (mail-mw2nam04lp2172.outbound.protection.outlook.com [104.47.73.172]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 45dxdcgg8y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 17 Mar 2025 21:15:29 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZL2A3e4MHoyMrygV7NU5RMgpRSETaQuJFBt2ZDt9/tmE8yLehrWOk+ErLJcsOtGU26dQhMDVlNpSrnJl/sXjfP4JaFqmJTRR8n2AHm2iJfWglu4QjRqSKofgKHwyoAsVLr+od2VT1wO4veUkjPlxGrjyi5DKdq5+cMVGOt4JOwc60wTOWXKuS+9h1cvUHg5sUJLE8uLKgUOLv1rZR7Mfv6vwfr1YToMyPB4g9fC+AeTVWCwtSFlp41PU/GdFYrVIvMMKzHFb2pAglblb2dOoRkJH/XGsbHCOudhf/+vllkP/eM/56HeiiQTQ8rLHte/wjDINnMZSd8etXj5ZeXrvqg== 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=ARIetQv6XeaY5idpJw5j2EHsVFHKr5j/kc9YhY8bEj4=; b=D0o2WjHtZcYb5ltRIAE9sXCxvhRs9FQ9rPZt9iaJMoC51JkffqSIXyj2PbtG4jw7lkn0WcCufwMOJn/FS6DSa4uA9F7BePgKwuyfImlChaSVI5n0IiS67TJanKR+psHhl3xbpaICJlpVthaYMMFlPr73iHIH/hYug5C0d3cK8IGmSZ5hbVWAS0H+QYKvQEWJOXxBzRIioxMV+BfJBVUaEh6xAb9LJca22EM2MMuPhPtlRmSCj/DHiegWhEZyMDIVu4cUEcYSm5NNkk8tIsweJ+VMrgThr9U0vvQvaIENpQSUd3P1taQoCo0D+1jpkji5EKyLLjzwk2rfTYvR0cOFyA== 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=ARIetQv6XeaY5idpJw5j2EHsVFHKr5j/kc9YhY8bEj4=; b=kb9mnzB5HQEiGooAuYFAKP8T7f8dgBpvPgHsKdfeBsdrxGn2R7SNgWtMOqEIeWs9lI7baPoLqQ7wiQOE/djQE4DbDgQgv/y4p3L8EzMD5dWH75ohyZa18t62lhAicsBax2VOYcZG1k5Kq6j3HiAC6HOaLR0D542fj/13m7bErFk= Received: from MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) by PH7PR10MB7105.namprd10.prod.outlook.com (2603:10b6:510:27f::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Mon, 17 Mar 2025 21:15:26 +0000 Received: from MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c]) by MN2PR10MB4112.namprd10.prod.outlook.com ([fe80::3256:3c8c:73a9:5b9c%4]) with mapi id 15.20.8534.031; Mon, 17 Mar 2025 21:15:26 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , David Hildenbrand , Matthew Wilcox , Rik van Riel , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/3] tools/testing/selftests: assert that anon merge cases behave as expected Date: Mon, 17 Mar 2025 21:15:05 +0000 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0118.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2c6::8) To MN2PR10MB4112.namprd10.prod.outlook.com (2603:10b6:208:11e::33) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN2PR10MB4112:EE_|PH7PR10MB7105:EE_ X-MS-Office365-Filtering-Correlation-Id: ac5109f3-e423-4ad1-268d-08dd6598d657 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|366016; X-Microsoft-Antispam-Message-Info: QtGOPyeat/62idNLj1kXhUxl8Yh0IQZiBRG91c1sT3ak2h9paP5E4qNHd17ubQSvp0vrxP+Vc4bi3ccfuLgvOPSQ9XVYP0z185PrQFPA+gO4Tq7RDORsaRqApRUdP1hdUqMOjTqbwP5RI10Xypbw+CNKNsGorRlM84xc8bcAu4qPyVNc9l5vhyfKJgOCuAlPmIKUsFLo/N7DSCF0JFUmLiYjw56P9EepBCkpgggpVTU/3N5VjTKEP7zuHNCNcV3pvSuUJTGjJvkSgB+zb+g5vcPmhcTJU+PwSB4H5iYjjGE1Tk61SxqUhEOINZv9Kiec29/I3FKsIUnFUFuz+ZiW/Fy2a/RibjUPOwuK6ZQdHbq4noBHDn89xi4RDnBmiHoIRuXm3SMiX42WVfN4Hdrk4N4hjviP19r+8YlKRRIf++0ADpSI1bs46n6aSfeuj8nJ70By2k65d+YTtfDgUFfPv1JPbjUnngWCjZYQliN3JFBKNNyCoOw6DhgqJoBn1x49zKMVKi3BIIARqQ81o6qejwPhMxIy5wbxo9dxu0WeNCFsjwo4AbCmYEIH+tb1/ukppb5Tz0xIKYBg+wz2sYWS9gV3WDsge3Q08PkaBXfZy8IKcezST0hVeU6e6XvTlgsJOKbWVMWQJE71kE0brJj1tTCc3B1kwDM3KR0TnmOW6aE+2RHzvCBtMsrZ5XgNXVXFXDBGmcaTU7u/DWbTE2hAw5Xv+Lm3Ok6PMrP1byiaCkP/j7TfMvf18NJsughbk3g532zPxRaG00YRDRXyZyMgTKGFRFaXw4//uAtb4jj2OxHfCVNx3ueVxOZg7nzDfy7UjcujD50DzZ9v8MBKaI0F90leBNQYoSGfeaLXNcD135ynQcebOq66HW/jNPqi16h5tI1DmhH4/lLeQ4L/y62+hsL5OEWWTnEeQCet0ft8PeIxWWYwOakkdeSQMVUqayXUzWaPXA1QlfXk6YBwa/1JU3DWDt33r7zywojDunNOjJO1Ek7N/8Cp93mCvA5eIrUNO7WlCzgjmgjSClaVnrqbA0ojVN8FRHE+NUJ2R4smtjCsquyHyfwxgT/lShTLKUdYQeBnIoIC0TskcY4kx/5fkBhiXMNemti5oVmqTK0XlICOKYjKlYa4gkeu7NBk6BPJbneW9f4nJEerff0073XJ0ojJX/LuGYBbZamYWqya7O4nJnx30WOvhzG/O6gEHHhPeYi3geX2kAaxXvn3zFoYkeD23feztal8jbZdwg5isqP5SrBoGEMquEfvBLXR+PGyzX2nEPR49n8o8HIcFPmilGZiBL/JiCmhqtzjqOyLxQrzJhRfU/eeUrCAfWKdX0MYd1IU78Tsj2lxJ6LulT0V2ZLyx9AsVcagUsObeqoIo6Iugc6XCA+Q00283/B9dQ1H X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB4112.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(1800799024)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Lnq5V+MS7NIh9dBGDcIcTIIUXmb4OSxJ4v6uJH4DZbC+TPh5Qd25tuUOHhX+hDnukV3BEQV3PqLdoeRICa8MCd5//nARZ0ZsUsfV5hwILSug6o2YoxG5l4W7YAg+5C/AMo+FBdeFpwog/LKIhzLc2tuf/2HwXjl9A27EIACp7lyo6vjBNuqyxcjm8khxMv3/6/gc/fiS54wWnM10qPJPW9TU8jO9CQrb4phT/68zuwbBMbVgDp8fmOgAnsjILVaGL0wQl6R2/JTWJSqidebit2tNqCw9C7SzaW0ZtkL/mz68+Up1CR9OmU4IQ6TVFq/BrQL0qsxpB+W6KawI7o5ir1EMMAtgNz1OWlR+vRPm/LpbZxg4aI45dXCnWIGUKEZmlSoMHA5ijFKcSITZTeP71jKMGFuh6q5yJPl2wfGD9CR5gXrPYyBvw3X5O+1FU613eKc/MgQ37qartcQexKwlENR55ut/yP+PGRrP/yYSl8EOmJBBihlD9kU2NLU6st6stkyEGnrXbjloTC+67x+77UVIKdPda6MP8iNKImz3isQgkXGpdiHY9u8W+awEP/5nrZ5qa8lFW2v60bei0iIWP7iaCuOqnHFZ7sLXLt9ZZuCVtJL+902+7pCh8sTDBonRino/e5BOjmDfP2PQQIwCPFzPsH84fgdvr2cwkxNjifC27oG+/26HY76M/YKLtSuFfTBWDyBNmWUsiwaFmxDAVTE0wq4/ofzE5nDMh5U7wHgcRQCvcKFBmiiI3EQeq77Uen7OxnUTVkJbf6HuQlQMbpdcguIazsueGEGlqbW8TR2NPHQxjv4VQNso7tq38sr0L9EZodzBOLPIWp/LUeAJPVwnhfJYXqIkkYSz8mJ4DTIpvM/0TQK28mFEQZrN/Xyu40iLNBXKQfOu8T48FJzZm7S8cWLEW9KajPm49mwy6zXMwBFN6qBq/EhgMgRIPIHdDTDUyd8iT/XXYYOF9OT+g3ryBYg5LbXFiwx7bJL8My4SANl05AoesPt7zgfQrO0E6KrIlEUooR+wJRJDCYJuwkoNEMoLUHPuYau/LCC3rpa9/MQaZ08b6u1xtFDlomBj3ni1ILeRSH9Ur0pdTPLAu0ULVb15d4vMdFPaI6dJZ+wBdClfOROIHuu3y2pvvr30urXNw2zR5Zeb3b64O9D6JhrfmcMdaYmO27y4NA4xR5trsbdqWEZWGKFIlC65CLS99vHxac/ytqBCvp4OpiONd/xewtCbaMM3cKoFhk+mqwCQWjBidNBnK6LNJeev7TEmx5NO7I/xgU/gRNpRYy35Gi296CjinZBI0klFwcUx1Ap1Z+bhD8KLyuhYmOaYei/7HiD6fuSFI1E+cVk1xZIhd7yhiOukge/6cp1CewGrr1RQdOxrKjAUWVaAozfRrH6lhrakJsZCSX2ZW2/RHC5spAFYOwrW99y3O2/j/B2oAZqR93x78e18HUSYD09GqS9P41iVSFEHg3bZCsti6klv7z+SpoL6pcmIbqUO9p32krIMd0qJuzSNjQg6dQBNfGqraWtQkcNAyIRcGNsebhtSzrgTfK/rxdq+M0B4+VmjC7OpZkthlcMxlZ6Ce6gNmfdLYMhhUG/ZdtXKgDaiWSBEaw== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Y1I/7AJjEamXTXVAQnYqfeOMLbyuEi4/fDblLAHcTbtxFZtdghCm473KoDZm3tC2bmjVS9xroZTLVis/9Uly2fMR2nwoIg6XGAmQ3KbYcLFaaeoipu0Wqbl6ChVH9eN5PIq7FKbeP4lpKK9A1aVyngktHfbRy7nfbWbXXooVoJhonWiYoJy9H1uNAmDyujXP0Y0TRwTh1YMWuDyX2CR+YI8s9JTrSD/uRIdeaXZlDy9mwb60lQm6IGbMxRFlGOaMVLcIH6rgvgvm9vncE9IC0HG4zSJT/x9j9HNeHRvJDC3mugwnHvGQHgW7JC3irpotvbPE3fGINdcaL+o70q9B/II8aTM4HF7aljNnAPHlTh3j3TdnXswQxLQgNKPjbHN1X5befTs0+cTDkSB7vRZ9XTHnFK4xZdzsmq6uSU6UUrX23ZSnhaClifgyFDNLIKyLTLGqw7VNUCV7XEjBe4nRWplueYSS//Fad1wwdrjJUCkEK9GvlBXkT++K20eJgRpqBubRkKDeGeW8pfKr9aBiARnzhTXInIS3QouEPqmay3EN3mgssBI+2UudrIZ9ZkWq60/ECpKvqGcXcWYpPNoGhtx30F9+08tGV1WPp+h9zTw= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: ac5109f3-e423-4ad1-268d-08dd6598d657 X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB4112.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Mar 2025 21:15:26.4079 (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: mpEKXES/kmXHjxwJq8tCt1veYNIWkPnwik8dvi5B/igGXvVBgrN+FU6rDNJYgg3EPSXUEC/nk6yPJpvQR5qeBZQleiHSAh4VwPD0Wnv61js= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB7105 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-17_09,2025-03-17_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 suspectscore=0 bulkscore=0 adultscore=0 malwarescore=0 mlxscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503170153 X-Proofpoint-GUID: i5rlVe6OxLCOJcS-vwhO--xTuMkFF9zS X-Proofpoint-ORIG-GUID: i5rlVe6OxLCOJcS-vwhO--xTuMkFF9zS X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: 9837840002 X-Stat-Signature: 4kd8kwp1h5jqa8ttm35bj93uduacajxt X-HE-Tag: 1742246133-347138 X-HE-Meta: U2FsdGVkX1/HPWtmXBhp97dwaL5zEgtgACg2kc7ozMyB+tVpq0bsR7A8xLG1GLgjwjAYdCw77oxm7xdilTsDFY0xhGrl8rF7uEzCvLdk8dAzt3XE1TKIIJcxlgoaXjM/FMnN0y5F7YoMpLwngxUuyOPYEtc0ZCu0QV9HNRogrALhixlreIU9tYUKE3Mah1xbWMda2sZwRoDBLANGJ3vO8294yQLbBmYTRfowdtXTvccuUvNGPPHDr9cBmLKHNsfgitS6P+np3sHDMeldaLQaukUT1NO8HAUaS5QlkkSsJYW+I4jUNHcT/KFAD72Uwdj+SezFrY97wfqI5xhXjVMpSPD/XpbCMop+wgalA5IMKGYsCdYAxq9rlku374+8GBSikmUIVuffbAWPxFoGYT0CUUFm/DZ6JeOSVJnVaUZSEzdz3LMxrLaTODg22cozhp4PLpuNxM/N/bL9LdoHz9bh+7YoszIkQf+wv7UNytA/SAvJkLDX4CxkluCkVyelHyUFitGTKKr7dkba6tWHKGBihgrojZ+pTgJd29kKssx1BR6QrGtuFgjwPbXHivuWfOgFXzTd7I27z63VMEMtW0+lqtgwaaCOLy/rIu5org7XZEJZVKNbHMOcQZUI4o6t/EP1ic2X0JB2yhoqqTpeob0upk55KT+Q4tS289hbp8Tm1WSFq2TKkcu9TRmdcNwaqFSX1CBbluaIUuYwoe6Tg7UEsSQ23pNw9vB8KM5r6N3dbeV91a+ZLZ8wmOQyrDSVHUvOyAXlVQOWSo8kEOXbAY62V6kek0UVDjMC83RSkFIy9iRREabvl3kgtj4B1l+eJWv64TbM6sp3LTY1OSOl45Qftc1afsyKKHF+pwH9Vzq1UeG0wO+kUIgz2951WZBK7Pj2CiYgiTt2YkOq+RQqpq86spM/+XXkrVAG+hlqMgCjocgJblV41yuQ56BZqd8MKoPB2wC1K2DYHOs4ddbRwBT 6eMRskkF km+KRqGdZZ2dGSp/lTpT/XdBIANsLZgS3MoSODjAu8MRV9hOHhkYfjYyoLNIN0Z+21ZoES3EaM0AJ3u0ulF80MiZGFg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000001, 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. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/.gitignore | 1 + tools/testing/selftests/mm/Makefile | 1 + tools/testing/selftests/mm/merge.c | 454 ++++++++++++++++++++++ tools/testing/selftests/mm/run_vmtests.sh | 2 + 4 files changed, 458 insertions(+) create mode 100644 tools/testing/selftests/mm/merge.c 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..9cc61bdbfba8 --- /dev/null +++ b/tools/testing/selftests/mm/merge.c @@ -0,0 +1,454 @@ +// 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 before ptr, but incompatible. + * + * RWX forked RW + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr2 ptr + */ + 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: + * + * RWX forked RWX + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr2 ptr + */ + 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..0b2f8bb91433 100755 --- a/tools/testing/selftests/mm/run_vmtests.sh +++ b/tools/testing/selftests/mm/run_vmtests.sh @@ -421,6 +421,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