From nobody Fri Dec 19 02:49:18 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D7DA2580F7; Fri, 25 Apr 2025 14:55:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745592928; cv=fail; b=Ge4tZfPfwZQGzg1umLOf/p/m5x8MQRE14DMe3GchzMf9zpd0f7/hhr8rM0q3GwyWruM7ilYy+P/wVlXhdkSXD84Wt/pUtuyPcSfXLyucxt75HkSSdZ/aCPdtIiQsuDs/EyO02ViYlrxfFZvKXbFzQT2IaKknp/pqlhBtQKTGE7U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745592928; c=relaxed/simple; bh=/TkIqNNO5ttpypkpoN6+dnrvPa3oVkuoEb/DpDeM7aM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ogGsUgl7+k836W0XHzGCrMTCnJXjBz83d7pLAypiZogdH4/jVv273XX+PdOINxoJIFrodtV+R6DL2OPPQRjZoG5y7nVqyESXYl7teR12q+ZddITiMOs1emhTUkc/rKOwgjXaqjeGaFnaoDbLrQBit6h/D5n/r8w7mq6BhYcNKe4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=Q0yOF2Ys; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=vMwtme7X; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="Q0yOF2Ys"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="vMwtme7X" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53PEmGsb007472; Fri, 25 Apr 2025 14:55:09 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=RaqMO7+3oD1/F4oBmH4sOwtfLFx5iMNd57DSP0Xx1hA=; b= Q0yOF2Yslqee9BK3g7qUoMR4hel8dy+n5YaAe0rJTu3psN25YEdApuHAT0+sB4aO 7HYJ0eaPLt+v5DdHUPsRQsoZUYiGAyZN+hdabBSlq0tNUTbTSaKmcymdrAiT/Dlg VdRCt+WdNMZSosHZJwEg1LwJSRhSn6sOxaGu1dyNMuMvnr1BkKY61FmIpW9bYw6O WmOae859pwMNeiXXfuRGmhBNHxipFTXLb8g50gld0S3BHL+f6PVB65QS1aOCQ3ov hGib031mSt3LYm4+MH9+wtrLUeiCCodlaocrExj8oWtZbxIQc3y0gA8i+9T/oQkS sLKCS+nXxAfXMAuL3hY8pg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 468c84r3tm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 14:55:09 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 53PDQ31X031609; Fri, 25 Apr 2025 14:55:07 GMT Received: from bn1pr04cu002.outbound.protection.outlook.com (mail-eastus2azlp17010022.outbound.protection.outlook.com [40.93.12.22]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 467gfsum04-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 14:55:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sQaEdcWKyvPqkY1Vb6B3oAhcWo7AkvnEHvYzuLReykm1sb6bFAZ+/3EHpNdInXYyLvejXn75UW6kwA44gLAIl+2EC/FFguvlBx63aUVAWLoK92Y8oeVEp5sRz/fFeGR+b9jeLnkof4tfldYwwtwzADBjrFlNcQBxf0pJFn15gAp4aV65jbb1A/kbRxbovVSud3rEJPV0ajJcmU8zidkKYWPdyQRvvEE/geIEUVAqIYMnseRlXtuJhdQmelM8EjY0RlybA4dsY1OIu1i9O/LTic5Z+PzPHUQkxyu04KG1xo7K4AUkl5Qygy6ASDIffvtSLZINRYLCgLP2R8y/lVG97Q== 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=RaqMO7+3oD1/F4oBmH4sOwtfLFx5iMNd57DSP0Xx1hA=; b=n6Z+zxJzsiQa+ANQE/0NHVmdXt8XPV+PwTIuTbfdcVYJ+Fua7aVbjcGetKLH7tnuI9soKLgkB2lkexD1niQVGzVduUaUCsMeLCfLU+krHrWQu5I+I0wSdq15Ib49yaLqGbwg7S5H2tOo7zwsQ2HsgzOYwY79Fk4XoWTOhTmGlf89WS3UkyFks9Jw2Q2koqFJdzhNQNPiHlFx+hnwoN8fvCjELfRI1ur/sLOHHBHyv45zSRDHpLzmzK52SQEXDJSl9XmbA7f3dT0Ooe77yfJT+hclDh9gHtL2AZsIihA7ss+smZ4B+yhUWF2Bl2X8FiijGWGFCYBzctZfiDRPfh/F8w== 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=RaqMO7+3oD1/F4oBmH4sOwtfLFx5iMNd57DSP0Xx1hA=; b=vMwtme7XJtfJTa6tRQP6cGVsLyQHJVw7RMXFrdlOD+5vdOa3eqo0CTZPox5CKEUK3cGTIS0QQC2srlH7JJZZr5aSEi0QdDyuZP6MG89T5+Kbz2ctS4VhePDbiM7nsAvjck+oViVovSytzkKnfrWHBREUV2oWyBRvWEI6ng9XYXI= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CH2PR10MB4133.namprd10.prod.outlook.com (2603:10b6:610:a6::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8678.27; Fri, 25 Apr 2025 14:55:05 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8678.025; Fri, 25 Apr 2025 14:55:05 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: "Liam R . Howlett" , Vlastimil Babka , Jann Horn , Pedro Falcato , David Hildenbrand , Kees Cook , Alexander Viro , Christian Brauner , Jan Kara , Suren Baghdasaryan , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/3] mm: abstract initial stack setup to mm subsystem Date: Fri, 25 Apr 2025 15:54:34 +0100 Message-ID: <92a8e5ef7d5ce31a3b3cf631cb65c6311374c866.1745592303.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0580.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:276::16) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CH2PR10MB4133:EE_ X-MS-Office365-Filtering-Correlation-Id: 7b16eb02-6706-4f5f-9ccb-08dd84092a46 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?u4xBuyrn5UTY+kb3hqfHu0YWQpJVbnauDI1kLLZpduIsaeRF8zzJfzYL6OcK?= =?us-ascii?Q?sXonTOONL+8nl9ImtueHyejyzM5qPO9BB7flMAfv62TXUX33HvkQ4eqOesvf?= =?us-ascii?Q?+irZruuY9jPbc78sKAgHakwGUCgfXBcUCZEkuGdAeSjWj7SqinaCF1pAGsJG?= =?us-ascii?Q?JRI54E5Es0VE5LlfoDsPZJF+VxWvMziCyD0qwsuiAOPCkahxucT6x/Ial0lC?= =?us-ascii?Q?1lW0cQHOW2VE9AD4uwvNl9tjHVCY+SO0Fj+c4mmXN1qW40P6Y3owOo8DBLwg?= =?us-ascii?Q?Sr2/jCH+BhEn8XtXN6sQruyHetCibXoBuuY8o4+Rk1JyrGa7UKeIMwBHNoW5?= =?us-ascii?Q?g5jjP4kHpKIW80lHVYtk+F6DeX/0CVm0lK5vciOo+tLgSC1W9ZX2CI7RXpZ7?= =?us-ascii?Q?FRixdZgRBsrXyqzeK6VMYzDKZdIXygdHiAItO3/K0hTqQd01Ety+/3zSy3C4?= =?us-ascii?Q?ZPP8LdByDofjODv+qVherLhHOpV/02YGvWgx+TB8rcNtGwh5DkgGFb6jmr1H?= =?us-ascii?Q?fT7VL3gGsN12nuDp5uDw4+b5LSus8r6Yt/G28ntcPbAajmofqLj/X5zM5yPA?= =?us-ascii?Q?RS/qEHE7Zv6DWF2E/HTvo8TbJ920LTjvTBjhqtHW2qkd2Fnk2l2x/V4mFPQL?= =?us-ascii?Q?Ce03WWweu2riH7upOc1HuuEGsGXMoQXwaeprxKDjOKFoATKnNm7CYt5h2MfW?= =?us-ascii?Q?BIAoHttoDx9SNkW4Ah75eLkBiw9UXjRvqRE7lNoT9KBmjLvv6Kf+K6+X8GVH?= =?us-ascii?Q?7P/DJXdVAkd8vmW12tO4BCJXfxugA0ehLbI/p//MnJNN4Co/CkH39AFIU8s0?= =?us-ascii?Q?9WtbEfuszv/F0ZQMouy/UY6bNLDAUm3aH0Gb9bQ4eTK77fCivR75/wQTnvJ0?= =?us-ascii?Q?QvkPpNaZ/qNDgmOwpy2VcI4XszDhUHF18cGA7Xm/YzSBy6bCeuA6NfME3Dg3?= =?us-ascii?Q?C2PFVUgX4Anx+hUwuVAkDWGsSmxP0s7OaN7JO+QB7ElKG9tqllcQK2XgnQih?= =?us-ascii?Q?R6vY0uDvoJil1GhW5jwuLsMvzZN5avamJIZaBJz7kzUcxpCiDgC/DdwTKUqE?= =?us-ascii?Q?9qvSAQo01PuOBDq1bKHh9baHkVfHz0Ef3SnzzSaxKxyVpQGdpzC7umRLllqG?= =?us-ascii?Q?EI1KIYVxYC9WmgUA2f2AP0YPQRuPVj/SwFYHW6514odh2NhrWX1j1qCSPMAW?= =?us-ascii?Q?NklY8Pqm7ijCVhTb0vm9ruSio6NmS8zwZHVsnrvqmgzFcY45CThVHgi8+cCu?= =?us-ascii?Q?tZantvOSX2Kt0GJ8XqkT4K6loPtnVQayDySOKSnzgsuSJhBd5DblJo+egTIU?= =?us-ascii?Q?e6dWSK0Jq5WO55hjJpRtB4SA/LnJkdMGKQcR6kUh3bbJPjM5QUJz9TfxkSi5?= =?us-ascii?Q?SCBFyd92ZSVf4EIpzDXjSMXtX70pNoaPmx4EFiGhgEmfT7O5doaxHQb3D0mi?= =?us-ascii?Q?1tRuT3xqs7A=3D?= 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)(7416014)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?D5qTm+kMdFrtB5vtVSEOLSPPj9GDZWZmvPCWUrpDHg9bvMCjTulpNpljSL62?= =?us-ascii?Q?5PyDRoXUK1/NNqtk3PTzDdfIhi7OT56EP2qe+ykMJ9yszwmllFhG2DyCOl+h?= =?us-ascii?Q?HgBzoJT5WjNmlRQAZYV/jYKkNFlPSaffW0iE0EvhOGvdAOj0tL7a9WaE89Yk?= =?us-ascii?Q?2K1RKQyc4CqvvcGyBXSRPElbycssjX9ZyTDA6JbThFNKvE6Y+0n8ttBON0RA?= =?us-ascii?Q?6RBwDnKLvDurekbAHb/iJPLVgibGk0xySmxQSUrkJghfdwMALNEANpfvG7wI?= =?us-ascii?Q?H7HexT4dfvGmWKuLw8erEw4CK414PlaHqmrP7NypXh2kBr4xBtcJXaE4R99H?= =?us-ascii?Q?qiTg6bJUS9kC6O2hvsUiXPKD3DXRqpR+HMxN4j3Al7IrVwBRYHXctDnlLz/f?= =?us-ascii?Q?kmVUY5X71Mc0Ku3YtngOM+QrPubch9V9zSwyxH0Yyvvrn0rNlwI3oM9SpGKd?= =?us-ascii?Q?IQi8Ct3rrma+hlt80Mt7mG8jljKV1SaHPE/j+dapyk6sJ+IYljoM0FxhwDTA?= =?us-ascii?Q?Fv00XxEvRI8sxGJOh+a2ohzRcbL4R7svU4ytBJHw4pYRsSiPmeaAY2+fw55B?= =?us-ascii?Q?W108IqZpmVbsj+cgaLMdl6K9oqgzmXLVsEOmgftm6YAqSKSHFJ7kaONKvW+s?= =?us-ascii?Q?+fpl5s7U6c6ahr3N4GSnQouiR4CDBYNPL4vzt6TqX6zCx8plPe73tTw/dYnc?= =?us-ascii?Q?OOfY4Ty2oBD2NLepPghtJdswjD6Dl/ZE76A4JFNBJmZwRW4rDXu0ZxP4VKjU?= =?us-ascii?Q?Ly3RXdIQ/nklmZsqe5kpOYswoURTrVkO1B0CMFmcicfPfTh/5yVTWxoKUjYZ?= =?us-ascii?Q?UZ/T15tV+oxX60dDsdmFkxZnCzRTpqBAPVeVMYwu8R5/gGVzkTdREjNjwckk?= =?us-ascii?Q?+wBAN043SZiwySlb6MHo41zOa3/nCvFpAWd6VDyubzQ/pIqVLORme3Pk3/OS?= =?us-ascii?Q?8AQF2KOrxyoFBjPzJR2Jl2Ggqwjrfg+bsH9YUMrlfE5Agj5hP64OjBxCtq7h?= =?us-ascii?Q?gs2+UfySLTUFy8jXA30iZFo2nb4i1frTjrWwWWYFWEoUw/bm/4a3CN3TwEjV?= =?us-ascii?Q?/lbbPVwmU/Y5vxn8uXtletJj0xtdFtxtAmKrF2xT9hMIRsZqgB2soDMwOAA1?= =?us-ascii?Q?ECfoOqDOnvnCJCp6C2W1u1cV722njgSQejB3ZDgDicYCla9uT1CUZYPT17Uq?= =?us-ascii?Q?ACEf7c+PqhlQ+z4IJnJtIXTklqyCE3SteK2M5s4wUgQ+aM7ivQIpZjr7jb/g?= =?us-ascii?Q?UhqOGuQZ+gkyWi/SxDvNRqCTXB2XeQFSl8WPG69421n2DF9mJVHY4G66+J6B?= =?us-ascii?Q?W6hFBqUSNM9JQXZsXGK1cSMlsfIzYkN2X139d/2fpIKrClRgqVI85h0dkwKy?= =?us-ascii?Q?MdQMkM49toXGhAXF/H5bgzQTcZWh6CFcCvpOSadVZxT2XGTgdy1QnQwjt4V9?= =?us-ascii?Q?1o+cgVyeVpMt2vJ6AUNEYtRatK4ONU5MqfN3aB0BX/nA1/ve2dT1SYCCAuzn?= =?us-ascii?Q?AL/M4ZdUV1VfRbkk/telp2EgLDPkBjVUnDtIoMkp8WYNx9GjFLY2U2JbBI6D?= =?us-ascii?Q?tI20ycp3CdcNgqsMG4PYniNtg8OJR/65mMDlzFxKZbUEg57VMcYz/PC2Qp1Y?= =?us-ascii?Q?sw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: QYkWn1vghjwPHm8x4X3Y0uZV5FMmQB2mWy4CUOEv5TRmGTyuMba/XFOpVkRnA4S6rti9hD/ouokh6A22cRakL2DSo8+jkeHuEE9n5BU80Iuyn38N4S/pwsl9f0oQe9lifuX5/aaBS3vau5rb/MEl2KoZ+RNQv50e3nQyodljNHEQpfM+6+j101Trx27KkC/1e3qWeYg7vGv8i8F9quqfj78Rou9SqFMOrWSdYC/QDZTCWdYf7/IN2XW/y2T8ySulX4LkYmh1vuOGcj7VEulnWWGFgFUaxSNE0jTQQ9tKp4utzJ+SL4ImEUOctG2I/IzI+m8PeyTN+shi+AosWMjWKrHW5OSb0HtTO4goFrEYhh03TY37OlkGaK4R0DM6l1wlgsgxcBl6JVR3O7ymVl7RklevopDORAzKE1EmwjIu4SsRo7p3KjNlRnIejGoFmZ3mfFQ1Au+klF6oD+tKpnri5pL21Uy03mvItJ/FeZBsEProm6A9MhljWqY2W+3fu+lA0i3GfmwlWSlEGzcrDvPR7ZUT4EZwx8ShK+pUzIR7/OOGJPa0hUvnJXGafjO8cVFaTUU13Tg7qoCI6xqz7NGtf0+NGYkqw69vDrCl4u+jsv0= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7b16eb02-6706-4f5f-9ccb-08dd84092a46 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2025 14:55:05.6080 (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: wRKbiSoMXIAHMripYYiIm50MbxDwjjpxHJw9Sz12NYurQg17xomUbZoKDXSTx+XpYdzH9t5chJW7OxBAep1nbOGk8I0HFev4GqaW0hKxo2g= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR10MB4133 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-04-25_04,2025-04-24_02,2025-02-21_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 phishscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 mlxscore=0 bulkscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2504070000 definitions=main-2504250106 X-Proofpoint-GUID: mgXoRP2l8AAfA7tVlv73gwCgaRiQE66o X-Proofpoint-ORIG-GUID: mgXoRP2l8AAfA7tVlv73gwCgaRiQE66o X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI1MDEwNCBTYWx0ZWRfXzJeovKxgh9M7 hVMXtFyiG9/zhV3CIAK6BcefSjsLUJzhLHcGGjMXoXnZ86xzahhV7n+aj1qdYy49UpPJ2A7cURc Y0o+n1MxZORdu4ypiCIQED1HuwsEzsVfCo68N+yv9rBCJ5TYlRT6/UgM1e7WUFoyZA7JV6D9xeW hbyrLQf1dB+ZOrUblfqELQP2jwsFmnGRaCNxUN1qVGNt8GIO8SbrJ8lhPPYRVkLW118MqW40Lmk 7DlOYEy1TlJe+cNqVVygcU9rp5OfGGQtITisw9vi6ltpaxgo+lbrBXw8hBgg8YA+b6rN3jF0LNI RmclwBWeZ2n4Tk0KiYYvmqTaHIWCXBfxogzCBlwfOCwprExcNalAM8zw3x6dqqNyqXM5cYAW7OH jxpYVDOD Content-Type: text/plain; charset="utf-8" There are peculiarities within the kernel where what is very clearly mm code is performed elsewhere arbitrarily. This violates separation of concerns and makes it harder to refactor code to make changes to how fundamental initialisation and operation of mm logic is performed. One such case is the creation of the VMA containing the initial stack upon execve()'ing a new process. This is currently performed in __bprm_mm_init() in fs/exec.c. Abstract this operation to create_init_stack_vma(). This allows us to limit use of vma allocation and free code to fork and mm only. We previously did the same for the step at which we relocate the initial stack VMA downwards via relocate_vma_down(), now we move the initial VMA establishment too. Signed-off-by: Lorenzo Stoakes Acked-by: David Hildenbrand Reviewed-by: Suren Baghdasaryan --- fs/exec.c | 51 +--------------------------------- include/linux/mm.h | 2 ++ mm/mmap.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 50 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index 8e4ea5f1e64c..ef34a68ef825 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -244,56 +244,7 @@ static void flush_arg_page(struct linux_binprm *bprm, = unsigned long pos, =20 static int __bprm_mm_init(struct linux_binprm *bprm) { - int err; - struct vm_area_struct *vma =3D NULL; - struct mm_struct *mm =3D bprm->mm; - - bprm->vma =3D vma =3D vm_area_alloc(mm); - if (!vma) - return -ENOMEM; - vma_set_anonymous(vma); - - if (mmap_write_lock_killable(mm)) { - err =3D -EINTR; - goto err_free; - } - - /* - * Need to be called with mmap write lock - * held, to avoid race with ksmd. - */ - err =3D ksm_execve(mm); - if (err) - goto err_ksm; - - /* - * Place the stack at the largest stack address the architecture - * supports. Later, we'll move this to an appropriate place. We don't - * use STACK_TOP because that can depend on attributes which aren't - * configured yet. - */ - BUILD_BUG_ON(VM_STACK_FLAGS & VM_STACK_INCOMPLETE_SETUP); - vma->vm_end =3D STACK_TOP_MAX; - vma->vm_start =3D vma->vm_end - PAGE_SIZE; - vm_flags_init(vma, VM_SOFTDIRTY | VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SE= TUP); - vma->vm_page_prot =3D vm_get_page_prot(vma->vm_flags); - - err =3D insert_vm_struct(mm, vma); - if (err) - goto err; - - mm->stack_vm =3D mm->total_vm =3D 1; - mmap_write_unlock(mm); - bprm->p =3D vma->vm_end - sizeof(void *); - return 0; -err: - ksm_exit(mm); -err_ksm: - mmap_write_unlock(mm); -err_free: - bprm->vma =3D NULL; - vm_area_free(vma); - return err; + return create_init_stack_vma(bprm->mm, &bprm->vma, &bprm->p); } =20 static bool valid_arg_len(struct linux_binprm *bprm, long len) diff --git a/include/linux/mm.h b/include/linux/mm.h index 9b701cfbef22..fa84e59a99bb 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -3223,6 +3223,8 @@ void anon_vma_interval_tree_verify(struct anon_vma_ch= ain *node); extern int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sy= s_admin); extern int insert_vm_struct(struct mm_struct *, struct vm_area_struct *); extern void exit_mmap(struct mm_struct *); +int create_init_stack_vma(struct mm_struct *mm, struct vm_area_struct **vm= ap, + unsigned long *top_mem_p); int relocate_vma_down(struct vm_area_struct *vma, unsigned long shift); bool mmap_read_lock_maybe_expand(struct mm_struct *mm, struct vm_area_stru= ct *vma, unsigned long addr, bool write); diff --git a/mm/mmap.c b/mm/mmap.c index bd210aaf7ebd..ec8572a93418 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1717,6 +1717,75 @@ static int __meminit init_reserve_notifier(void) } subsys_initcall(init_reserve_notifier); =20 +/* + * Establish the stack VMA in an execve'd process, located temporarily at = the + * maximum stack address provided by the architecture. + * + * We later relocate this downwards in relocate_vma_down(). + * + * This function is almost certainly NOT what you want for anything other = than + * early executable initialisation. + * + * On success, returns 0 and sets *vmap to the stack VMA and *top_mem_p to= the + * maximum addressable location in the stack (that is capable of storing a + * system word of data). + */ +int create_init_stack_vma(struct mm_struct *mm, struct vm_area_struct **vm= ap, + unsigned long *top_mem_p) +{ + int err; + struct vm_area_struct *vma =3D vm_area_alloc(mm); + + if (!vma) + return -ENOMEM; + + vma_set_anonymous(vma); + + if (mmap_write_lock_killable(mm)) { + err =3D -EINTR; + goto err_free; + } + + /* + * Need to be called with mmap write lock + * held, to avoid race with ksmd. + */ + err =3D ksm_execve(mm); + if (err) + goto err_ksm; + + /* + * Place the stack at the largest stack address the architecture + * supports. Later, we'll move this to an appropriate place. We don't + * use STACK_TOP because that can depend on attributes which aren't + * configured yet. + */ + BUILD_BUG_ON(VM_STACK_FLAGS & VM_STACK_INCOMPLETE_SETUP); + vma->vm_end =3D STACK_TOP_MAX; + vma->vm_start =3D vma->vm_end - PAGE_SIZE; + vm_flags_init(vma, VM_SOFTDIRTY | VM_STACK_FLAGS | VM_STACK_INCOMPLETE_SE= TUP); + vma->vm_page_prot =3D vm_get_page_prot(vma->vm_flags); + + err =3D insert_vm_struct(mm, vma); + if (err) + goto err; + + mm->stack_vm =3D mm->total_vm =3D 1; + mmap_write_unlock(mm); + *vmap =3D vma; + *top_mem_p =3D vma->vm_end - sizeof(void *); + return 0; + +err: + ksm_exit(mm); +err_ksm: + mmap_write_unlock(mm); +err_free: + *vmap =3D NULL; + vm_area_free(vma); + return err; +} + /* * Relocate a VMA downwards by shift bytes. There cannot be any VMAs betwe= en * this VMA and its relocated range, which will now reside at [vma->vm_sta= rt - --=20 2.49.0 From nobody Fri Dec 19 02:49:18 2025 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C85325DB14; Fri, 25 Apr 2025 15:04:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745593484; cv=fail; b=Y7ZacvimJbw2USbMFRAcsgBA3AnHED5LrPyoXNX2jeJFLjovEPqbHWsyyTlq/MlUuNI24eroJa1eaqyQlUq7Pu8+2eNmDm/+mHWeis677q7GxFDuW6ltyfY7nE+SyZTwfv6cdfOrf7PxsrIUdd4604QVUso/tAqnrSNbkgL3+aA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745593484; c=relaxed/simple; bh=I3620H6LfufVGI+FnEVslV/lakEIQSeZgOt+aM7R8jA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=LYuyTwkHaVDLCZRgLoETuJN/CAcCfiuc/VyNHaTKApyZeBXg1deaojthQDWx3/TlQLRb6hzFhP97xR2TxMAed+Y6IraGLS2/9Js1Qt96FW45E/9B9WJiXCTtzLm7zJ1YO6aduU4HCAzG1zY9eUlIQddJdsEE4UxaiTdi//d976A= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=gTBcXOh1; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=VdwOjVEP; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="gTBcXOh1"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="VdwOjVEP" 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 53PEtpeh026456; Fri, 25 Apr 2025 15:04:29 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=WoFsmy/S4lVvvL3hRlwsWIIMpQdQWGOGTE0+2NOIz8w=; b= gTBcXOh1qaqpG9hYB3jHBSRgnfru6ZwW95Bds5c2z1l9lczcg93DQ89/XH+YEHJi whDFvmRcuIoH9EfCcDLeso1sY9rlGaFd4OwWEaqyk9NRnjvhCjd8OjVLerXZR0E0 JboFH5Er6bXkWItkPgz4NaeNaJgCfs+Aiu9mhC6ofvt6o6guVsbHbhO8q11b4iwz 0JNQk7bQHhb38wlhf6PLVv+oclqaMpe6qSugRJyjIukh/ixlm9K04PapBuS5MK7h qYSnvXTX14OtuyjO5AeAXRUQ3mirHYBlVyrtL8zNasSAlikbMO8gMCN5xEk3qgBn f0Xg/vb5i912lW3ufVO22g== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 468bs1860v-3 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 15:04:28 +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 53PEtB1e024802; Fri, 25 Apr 2025 14:55:13 GMT Received: from ch1pr05cu001.outbound.protection.outlook.com (mail-northcentralusazlp17010004.outbound.protection.outlook.com [40.93.20.4]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 467pucw37r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 14:55:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=eS9hQdbJzJz0cDo80/skhp7cbN7XjR8uWH8S+80Vv2fYgEf1XUZmycQgc3ssH6rLVFvuR43327jj/cEDNBsi2/58pyR4GOJFTVc2JeCdFokR4quQ55Kn2XtFaxq7s1FxIDeRO6HWe9VhHTmeZNXBVI83r9UQtoryMSaR5WSeR1F3ZNrz+bzylYYCyF9bB17+Om4vo2G7m8BTM1mBqWYm5iRjxz5yEHwQMwAVc4DVoxsSNJzNh6B1XvCcGCoR5uhvd/3ecLX6046eRsmZJ1DDVDCOJu1usM+zvu5y9mEXL2LGJFjr5plTLDN3/ipT2jFowl/zbKFaEH6aSBnjSkf5VA== 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=WoFsmy/S4lVvvL3hRlwsWIIMpQdQWGOGTE0+2NOIz8w=; b=aC5+GbElVzZz17JGhYwQOOR88YGVzCzCM7lim5XBRVkHy6fgr6NBIeS8NFZRlUVlRFkvRdiLHVBaZQSf70sQD2RLQ5ShbO4AnhZ+kyBfaQJFdbSizzy6syV3Lx5TXnp9XnmA9bZrO3yDeQNMXJ9b/wfkA3q+BYDVq2Tn/wzg2LFnEZSrQv4hr2dXXZfOpfRfEh7/JPd8IWCHZl7b8eDklwL7YixZ71cS5/W3rGlUhGD3HweI77ElaSEO/22kfPFISTRKwv3NJ3RBaYBJeVTBvYjlpIFDuEsp1FZu7XqTyCDL0FJmADr4kzsLUiiUEhQaDCFLcRzM6m9tzVaTKwCq+Q== 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=WoFsmy/S4lVvvL3hRlwsWIIMpQdQWGOGTE0+2NOIz8w=; b=VdwOjVEPnhoTH/hBOuvE6+M8DQV4Etxyc3rShE5UOIKIHwlWpQB1pUx8WYw/9fm/fITdTN/5eLRTunwAXfOgSbbY+QUuWPsa98mZ/cOSi5ATJ5XAdTzsYt6Yrw4jyUQRhvaYnc11p70lvtotTvCixkhmCVbWPSs9TL9Oyd/qZsU= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CH2PR10MB4133.namprd10.prod.outlook.com (2603:10b6:610:a6::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8678.27; Fri, 25 Apr 2025 14:55:09 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8678.025; Fri, 25 Apr 2025 14:55:09 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: "Liam R . Howlett" , Vlastimil Babka , Jann Horn , Pedro Falcato , David Hildenbrand , Kees Cook , Alexander Viro , Christian Brauner , Jan Kara , Suren Baghdasaryan , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/3] mm: move dup_mmap() to mm Date: Fri, 25 Apr 2025 15:54:35 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0472.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a2::28) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CH2PR10MB4133:EE_ X-MS-Office365-Filtering-Correlation-Id: c1ed28cd-e12c-4e94-34d1-08dd84092c77 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?9rj7rPT1GnR0w44Iqb8803yXOLD0ojxOgDVJNtWeHoQl7jtJWOpKavXBo8fM?= =?us-ascii?Q?CE+EQ0SmH21twJAtgKtZnfof43clUvgDrsr5TZEx2ql8oUXk8nkO5v1rs+MQ?= =?us-ascii?Q?cuh91SYI9EORZhIrMjr+g/V6t3uycOpaFM5ERhSw1CKvK4cTvZ7Rki/ZFWAo?= =?us-ascii?Q?ekPY0Er0uGh+bSVu7XqT1/Sq0BDeYrCE4ZQBTCg6XPZ7S2O5CGu4BPwBo++p?= =?us-ascii?Q?l4c0aSGkQTlcD3jem4H0dAW+4epJxrJ94/h1zlEgIzeCLHqaptQJ7ecDapMM?= =?us-ascii?Q?3ucpZBeSn5IGndQn/8gcbRnQ61ZiY5dm2esMN+K+s6jtjlWdEeNN1IvvcWn9?= =?us-ascii?Q?rFcadqjDW/FcyMD4PCY82O8M9hA4HMnp29C+2hhg0ZRfGOssVlr9yG2tQ0OP?= =?us-ascii?Q?6NvxrCKKtUuO31KP4sHl2fEJA0SSlWfuwfjFIdDRMmzgSOqlQsD27DFCzftD?= =?us-ascii?Q?/DC0lLSnhl9Ot3rps8Bjwsb85Z9VGQUR32TJokhsxojrONrOVoDW0awQvrwF?= =?us-ascii?Q?AiKd33KvdmGbbCbT6D0PS1CZj/gDVaehUNWefRJHQANBZuKZa7ZA5VamuBBu?= =?us-ascii?Q?C5bslbIPfWjVHP/64nBSOsBQyZRp/iKP6pQhwAPzpaqEd9ZRxe1e2c6B15Cz?= =?us-ascii?Q?vL/S1owTk0vCaSlCdAc7N1wfSpWCcITjZdWbLicETFne1onkZiRgCgYavKAP?= =?us-ascii?Q?+Xmlrx1au/mlnmwz5IrqGYsc5c/qK4Z7yveLEju2u2cieqCEV/1ijlVDyxIZ?= =?us-ascii?Q?q2x0esIBOxTId7pgycDE5/sfLNCYffw9YZGyJjiJKRKv4UEi5e29HuhF2gSU?= =?us-ascii?Q?j4FtPfzbeLkTnEjq0z13SyxIGFcBHU8MwKqIf101+E5ysWkSPBTypBiK7NmO?= =?us-ascii?Q?lrQqmdz2e4gGx1ajhpKszWAeZ16Z/spUN22hIvJdhklwE5UoD+RkUd82xpzK?= =?us-ascii?Q?C1YN9h5vLzGJhejou/SbxrzIvPyVg7AYmBWNTUXq6QYnUPwd3KE4n3pdxbjA?= =?us-ascii?Q?1ISU3HrN2izYbYFW7BCGgUSC6ezE9UB+cISrq2KU1ZauS0dhFbcz0xsOzapw?= =?us-ascii?Q?lMHaxwtGWk1QtFHVAKPLkwfBMj0kCoEWHWxjgEbKRb5PvPamaZKBVyHSa2K0?= =?us-ascii?Q?49+WdnuFWj9tVt51WvtQos5/Y8rXYQRKA2ftVsPuxK4dzEHW9iElxJDqGw6W?= =?us-ascii?Q?B18TxGx76lduC8aVK2g0p1nbiaeb80PatdhSvzQiAM+2y45aCuGZeuacimyO?= =?us-ascii?Q?LJD6xUpfobZFwXfR/hPpFU/eBjxA89YZFPUkV7Yp9d9eH8ZKvWpJOE/QCm3R?= =?us-ascii?Q?P5hRAdlgPCPruFavURfquenguZUcs+rqKhgkGpKQoyDIhr1LGsQmNgBbXdPa?= =?us-ascii?Q?q2r4H+3JCe8525umpQI0BKN/LUN/IPww44dnumxKTcSQUaFYgw=3D=3D?= 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)(7416014)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?D6vdR8iiyaV/txItJOiFYy+NZviooPwgovLpMJgDQ7OkPKFeecwPC5+UxCnj?= =?us-ascii?Q?9gJS7IOw7EwCJoFhR2/tozBC1pmbgYAvSqM+M23QkUqj/p2Q09k7jh1g7HlI?= =?us-ascii?Q?8TyHpFoe0mrGVNtt22tDPlQZQe4WSYoumCnc0sUYT1/wVQSi0vkAsRxe6MVK?= =?us-ascii?Q?kHWCS8WXdNzgB4ABLTA42vCHpESgncSwrCBjdBZvdv3o6cMHHMt70/zj31YO?= =?us-ascii?Q?WjVuMApgO619AOjBrhuUbODqFUngxXaWZ1ZEyxOi6DSew7BD93F3oH/HUPR+?= =?us-ascii?Q?m8A5i6uzKyMguu2Hr1zWfVzpH9CiLaJ5r8/7v55QteiiVrKyGUsqQi/HiDwe?= =?us-ascii?Q?6SPUE59xG5xkmOsvAD/tkci/9c//Si/QGU5imoDl8SBDg4p77SIZKPEYB/jj?= =?us-ascii?Q?RtoJhZxtVj1JBrLh67vKRu9lscNP313OLeBNZEBOX0OUZAJZTuQi9u8O0oTj?= =?us-ascii?Q?b4uBnyqUo3mnm/W+zed+bH7f8Q8uvnKD2k2GzmVFWJQuOZPnt2fbmEfMlp35?= =?us-ascii?Q?sy9cZdpjcVWUOCgctD1GOv8a3a+7rTAgcbnjnBYMqvBB7j/XjJ9pr6GYScTD?= =?us-ascii?Q?FdgxxWWrwsw+/IpXbchcpSNRRRFvGZSAFHwZBNlhx8aWmctXuxLURikQNKhA?= =?us-ascii?Q?czCxwynY8S2mpTWm/ljUbNq0naXkhrugjZ7fQeSIL3wxymj5An33lHbOLyzT?= =?us-ascii?Q?sdIajcBL/CCUlZ1hzEIPyVexhtzZVV8gWa8NW/NPRLTEJB9/FNKL1iM21J9t?= =?us-ascii?Q?oXweqWMlct1e8AmorkNME6pbNrBl0YWP4Qm+uBk1GJp6oFGunXGNtz3PqVGF?= =?us-ascii?Q?MAsYeP5syzdTjQpFIrLcjQ+3TNzFH2o+LIT8Tafb1KmEGs8bM6KPFj5Dc1RP?= =?us-ascii?Q?P6+9nYTyJmoHeqQNCeq54nM4ISNMVEO9O4a1HbzeaiihOCpCgDB8C7LZlPzk?= =?us-ascii?Q?TmtZ9u2IgHNAIURTM6An0xOpJGg8SZbc4aeUFoq2St14yMeidJe/37ZEOqTc?= =?us-ascii?Q?V2T8VideGwJLAUVfzFnHrCPbDnT4Zer02VhL/itZr120LnCl8JxeBULvdEib?= =?us-ascii?Q?Op81ooWZrluxplq0SR1mIwtuznVw5KWJ4+eXcloVJBQHzJHd97H66jhwY+WX?= =?us-ascii?Q?jBj0YXhn8WWHEXfYx5l/SmV6qW9vG1GbK8Otwf0lHMAGNMKODn+fyR64gafw?= =?us-ascii?Q?bbifhpYm6BT0EK8jPfdmriiOYO+yWrPVVOztxL0w0e2Jh2p7RpovnAJp2cm0?= =?us-ascii?Q?jDvk+80vccuRDrpPZ1mGzTllY5E6bg96oCu/6hSGiW9GfFHnSPJh2jfjlvqH?= =?us-ascii?Q?osE/W48ozWiqwYut04jYIyHpc+DPnpPU/Ts2h16epy/JKAN2Cu+0ovq5zY27?= =?us-ascii?Q?GARnzk5nEoLWIXnTzHiwiuX19ZJLUumc8ZCk9oafR5am2dVthHaFrgS9XfFW?= =?us-ascii?Q?CJ1rj5SF1EygGYEtmh1vKqMTzMv8LCLnFxowfY64ZP/g+g3Q5hMmOPIoKO62?= =?us-ascii?Q?S8h1H+TY5sjQbmEoRtfSXBFhbHpy00SWR3dpOMnmmT8acF51jTTD8u+uXhOY?= =?us-ascii?Q?OGvhK0xs8bV0DxaZFp2D+C4HtI4x7udjKg1tzjBpnpz4SLsDpy3IHHLZ/MZF?= =?us-ascii?Q?jA=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 4NeX0cVo/jR6myHrEq7CSxNfWoBHFR7c8+2dyTOOyUnJ+ttXmieGSjQvhdDxuq/NFEAPHjGxHBrai4Ib9gtpMbIrVKpIJh6T0S+IBCQb01LwHV3vUqbRdYPqEFQ8cH/uKFfF1IgojPgHgyesuBj2cniLgJV753F6YvqArJA8nfTy4OobF5jD+s6cnIPeW2F85XnWYZqg55mkvLz94ja0Ct0q0Y6tlDbKSZYfJWXcmUxUeP9x1R7NKqGm+rZNqoXMyVQ2nMAqALaohKA/6SAGyIS1wdaIJJ9f2p/fuOrhLHbCuMroofs71gQb4GGgNuguq+wk0k8ztZF9mGdp+7rJQg6o8h5A92d9+mRXPJss9et8tEQoYsxI8XLNCyLCPdk5OoMFnbRoMIX0PYZ1JwPbfHE2RBlSUIAdkawsW6JD4kdvQLGncgYwNn4HDMX88AcNkG4XLGKHw4wp5g2iieQX/X4wlan1n76dqVbNRQp3tnrsrS60HK5UaHfdb5YZfXsn1n4AG2ac+DQIwFpbE76x6L9LHdlMjfsWT3BS7W/Qa625qMkpD363ZbM+RhlVHHjHoL7s1MwOvlzDnU26gz1fZCjtPFeTVT3IewE+x32foUs= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c1ed28cd-e12c-4e94-34d1-08dd84092c77 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2025 14:55:09.4163 (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: U4Vhxwx5ASQjmuZU5lpZe2H2EIt1ZhyfUErU6t8m8Rg/UxlzphhUYTXerojuJqVzqmG5eIdPGhRSVgfe+dvKY+htQnNimiKSvrdukryeYr8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR10MB4133 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-04-25_04,2025-04-24_02,2025-02-21_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxlogscore=999 mlxscore=0 spamscore=0 phishscore=0 bulkscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2504070000 definitions=main-2504250106 X-Proofpoint-GUID: w1KjMkgp8IWize8DvUfbH35tobWNnmHD X-Proofpoint-ORIG-GUID: w1KjMkgp8IWize8DvUfbH35tobWNnmHD X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI1MDEwNyBTYWx0ZWRfXzBUuIWy64ML6 6FZc6yIrG2ncASimVfVCE21CKO0mVfsMBZwPl70K1A/lZ/FcwVcncIfE5XLUny6ykvmfDR3/dNi ZkuJ5/4AHg3gEEnSiXhHqENxitnt9h/QXhsbAoaHtxP4X3oheGEOXyAk97QWM87oxCSYa4XgRqO Apt9QaSn4V03nRicosqip/8e5m3TSpSo0hZJmRyaQ4HcYHEPUQWXKxEBAFXvhNNHE71n8NZHMwE QIQH47gvBN2C0iA2vupDd0ETherAAGnqZax/EpdJreXt6IbXDDFJMdRb/E2YX1LbJ1yizvWTtf4 EyZlyI2q2k/WF5WaKqQwsI9Mop2XBxOgtj/Ymd392ICreT18zVXlUAjb3Xw0fpxq0/q/gIax6Pu 8Fc/Ppat Content-Type: text/plain; charset="utf-8" This is a key step in our being able to abstract and isolate VMA allocation and destruction logic. This function is the last one where vm_area_free() and vm_area_dup() are directly referenced outside of mmap, so having this in mm allows us to isolate these. We do the same for the nommu version which is substantially simpler. We place the declaration for dup_mmap() in mm/internal.h and have kernel/fork.c import this in order to prevent improper use of this functionality elsewhere in the kernel. While we're here, we remove the useless #ifdef CONFIG_MMU check around mmap_read_lock_maybe_expand() in mmap.c, mmap.c is compiled only if CONFIG_MMU is set. Signed-off-by: Lorenzo Stoakes Suggested-by: Pedro Falcato Reviewed-by: Pedro Falcato --- kernel/fork.c | 189 ++------------------------------------------------ mm/internal.h | 2 + mm/mmap.c | 181 +++++++++++++++++++++++++++++++++++++++++++++-- mm/nommu.c | 8 +++ 4 files changed, 189 insertions(+), 191 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 168681fc4b25..ac9f9267a473 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -112,6 +112,9 @@ #include #include =20 +/* For dup_mmap(). */ +#include "../mm/internal.h" + #include =20 #define CREATE_TRACE_POINTS @@ -589,7 +592,7 @@ void free_task(struct task_struct *tsk) } EXPORT_SYMBOL(free_task); =20 -static void dup_mm_exe_file(struct mm_struct *mm, struct mm_struct *oldmm) +void dup_mm_exe_file(struct mm_struct *mm, struct mm_struct *oldmm) { struct file *exe_file; =20 @@ -604,183 +607,6 @@ static void dup_mm_exe_file(struct mm_struct *mm, str= uct mm_struct *oldmm) } =20 #ifdef CONFIG_MMU -static __latent_entropy int dup_mmap(struct mm_struct *mm, - struct mm_struct *oldmm) -{ - struct vm_area_struct *mpnt, *tmp; - int retval; - unsigned long charge =3D 0; - LIST_HEAD(uf); - VMA_ITERATOR(vmi, mm, 0); - - if (mmap_write_lock_killable(oldmm)) - return -EINTR; - flush_cache_dup_mm(oldmm); - uprobe_dup_mmap(oldmm, mm); - /* - * Not linked in yet - no deadlock potential: - */ - mmap_write_lock_nested(mm, SINGLE_DEPTH_NESTING); - - /* No ordering required: file already has been exposed. */ - dup_mm_exe_file(mm, oldmm); - - mm->total_vm =3D oldmm->total_vm; - mm->data_vm =3D oldmm->data_vm; - mm->exec_vm =3D oldmm->exec_vm; - mm->stack_vm =3D oldmm->stack_vm; - - /* Use __mt_dup() to efficiently build an identical maple tree. */ - retval =3D __mt_dup(&oldmm->mm_mt, &mm->mm_mt, GFP_KERNEL); - if (unlikely(retval)) - goto out; - - mt_clear_in_rcu(vmi.mas.tree); - for_each_vma(vmi, mpnt) { - struct file *file; - - vma_start_write(mpnt); - if (mpnt->vm_flags & VM_DONTCOPY) { - retval =3D vma_iter_clear_gfp(&vmi, mpnt->vm_start, - mpnt->vm_end, GFP_KERNEL); - if (retval) - goto loop_out; - - vm_stat_account(mm, mpnt->vm_flags, -vma_pages(mpnt)); - continue; - } - charge =3D 0; - /* - * Don't duplicate many vmas if we've been oom-killed (for - * example) - */ - if (fatal_signal_pending(current)) { - retval =3D -EINTR; - goto loop_out; - } - if (mpnt->vm_flags & VM_ACCOUNT) { - unsigned long len =3D vma_pages(mpnt); - - if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ - goto fail_nomem; - charge =3D len; - } - tmp =3D vm_area_dup(mpnt); - if (!tmp) - goto fail_nomem; - - /* track_pfn_copy() will later take care of copying internal state. */ - if (unlikely(tmp->vm_flags & VM_PFNMAP)) - untrack_pfn_clear(tmp); - - retval =3D vma_dup_policy(mpnt, tmp); - if (retval) - goto fail_nomem_policy; - tmp->vm_mm =3D mm; - retval =3D dup_userfaultfd(tmp, &uf); - if (retval) - goto fail_nomem_anon_vma_fork; - if (tmp->vm_flags & VM_WIPEONFORK) { - /* - * VM_WIPEONFORK gets a clean slate in the child. - * Don't prepare anon_vma until fault since we don't - * copy page for current vma. - */ - tmp->anon_vma =3D NULL; - } else if (anon_vma_fork(tmp, mpnt)) - goto fail_nomem_anon_vma_fork; - vm_flags_clear(tmp, VM_LOCKED_MASK); - /* - * Copy/update hugetlb private vma information. - */ - if (is_vm_hugetlb_page(tmp)) - hugetlb_dup_vma_private(tmp); - - /* - * Link the vma into the MT. After using __mt_dup(), memory - * allocation is not necessary here, so it cannot fail. - */ - vma_iter_bulk_store(&vmi, tmp); - - mm->map_count++; - - if (tmp->vm_ops && tmp->vm_ops->open) - tmp->vm_ops->open(tmp); - - file =3D tmp->vm_file; - if (file) { - struct address_space *mapping =3D file->f_mapping; - - get_file(file); - i_mmap_lock_write(mapping); - if (vma_is_shared_maywrite(tmp)) - mapping_allow_writable(mapping); - flush_dcache_mmap_lock(mapping); - /* insert tmp into the share list, just after mpnt */ - vma_interval_tree_insert_after(tmp, mpnt, - &mapping->i_mmap); - flush_dcache_mmap_unlock(mapping); - i_mmap_unlock_write(mapping); - } - - if (!(tmp->vm_flags & VM_WIPEONFORK)) - retval =3D copy_page_range(tmp, mpnt); - - if (retval) { - mpnt =3D vma_next(&vmi); - goto loop_out; - } - } - /* a new mm has just been created */ - retval =3D arch_dup_mmap(oldmm, mm); -loop_out: - vma_iter_free(&vmi); - if (!retval) { - mt_set_in_rcu(vmi.mas.tree); - ksm_fork(mm, oldmm); - khugepaged_fork(mm, oldmm); - } else { - - /* - * The entire maple tree has already been duplicated. If the - * mmap duplication fails, mark the failure point with - * XA_ZERO_ENTRY. In exit_mmap(), if this marker is encountered, - * stop releasing VMAs that have not been duplicated after this - * point. - */ - if (mpnt) { - mas_set_range(&vmi.mas, mpnt->vm_start, mpnt->vm_end - 1); - mas_store(&vmi.mas, XA_ZERO_ENTRY); - /* Avoid OOM iterating a broken tree */ - set_bit(MMF_OOM_SKIP, &mm->flags); - } - /* - * The mm_struct is going to exit, but the locks will be dropped - * first. Set the mm_struct as unstable is advisable as it is - * not fully initialised. - */ - set_bit(MMF_UNSTABLE, &mm->flags); - } -out: - mmap_write_unlock(mm); - flush_tlb_mm(oldmm); - mmap_write_unlock(oldmm); - if (!retval) - dup_userfaultfd_complete(&uf); - else - dup_userfaultfd_fail(&uf); - return retval; - -fail_nomem_anon_vma_fork: - mpol_put(vma_policy(tmp)); -fail_nomem_policy: - vm_area_free(tmp); -fail_nomem: - retval =3D -ENOMEM; - vm_unacct_memory(charge); - goto loop_out; -} - static inline int mm_alloc_pgd(struct mm_struct *mm) { mm->pgd =3D pgd_alloc(mm); @@ -794,13 +620,6 @@ static inline void mm_free_pgd(struct mm_struct *mm) pgd_free(mm, mm->pgd); } #else -static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) -{ - mmap_write_lock(oldmm); - dup_mm_exe_file(mm, oldmm); - mmap_write_unlock(oldmm); - return 0; -} #define mm_alloc_pgd(mm) (0) #define mm_free_pgd(mm) #endif /* CONFIG_MMU */ diff --git a/mm/internal.h b/mm/internal.h index 838f840ded83..39067b3117a4 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -1630,5 +1630,7 @@ static inline bool reclaim_pt_is_enabled(unsigned lon= g start, unsigned long end, } #endif /* CONFIG_PT_RECLAIM */ =20 +void dup_mm_exe_file(struct mm_struct *mm, struct mm_struct *oldmm); +int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm); =20 #endif /* __MM_INTERNAL_H */ diff --git a/mm/mmap.c b/mm/mmap.c index ec8572a93418..5ba12aa8be59 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1869,7 +1869,6 @@ int relocate_vma_down(struct vm_area_struct *vma, uns= igned long shift) return vma_shrink(&vmi, vma, new_start, new_end, vma->vm_pgoff); } =20 -#ifdef CONFIG_MMU /* * Obtain a read lock on mm->mmap_lock, if the specified address is below = the * start of the VMA, the intent is to perform a write, and it is a @@ -1913,10 +1912,180 @@ bool mmap_read_lock_maybe_expand(struct mm_struct = *mm, mmap_write_downgrade(mm); return true; } -#else -bool mmap_read_lock_maybe_expand(struct mm_struct *mm, struct vm_area_stru= ct *vma, - unsigned long addr, bool write) + +__latent_entropy int dup_mmap(struct mm_struct *mm, struct mm_struct *oldm= m) { - return false; + struct vm_area_struct *mpnt, *tmp; + int retval; + unsigned long charge =3D 0; + LIST_HEAD(uf); + VMA_ITERATOR(vmi, mm, 0); + + if (mmap_write_lock_killable(oldmm)) + return -EINTR; + flush_cache_dup_mm(oldmm); + uprobe_dup_mmap(oldmm, mm); + /* + * Not linked in yet - no deadlock potential: + */ + mmap_write_lock_nested(mm, SINGLE_DEPTH_NESTING); + + /* No ordering required: file already has been exposed. */ + dup_mm_exe_file(mm, oldmm); + + mm->total_vm =3D oldmm->total_vm; + mm->data_vm =3D oldmm->data_vm; + mm->exec_vm =3D oldmm->exec_vm; + mm->stack_vm =3D oldmm->stack_vm; + + /* Use __mt_dup() to efficiently build an identical maple tree. */ + retval =3D __mt_dup(&oldmm->mm_mt, &mm->mm_mt, GFP_KERNEL); + if (unlikely(retval)) + goto out; + + mt_clear_in_rcu(vmi.mas.tree); + for_each_vma(vmi, mpnt) { + struct file *file; + + vma_start_write(mpnt); + if (mpnt->vm_flags & VM_DONTCOPY) { + retval =3D vma_iter_clear_gfp(&vmi, mpnt->vm_start, + mpnt->vm_end, GFP_KERNEL); + if (retval) + goto loop_out; + + vm_stat_account(mm, mpnt->vm_flags, -vma_pages(mpnt)); + continue; + } + charge =3D 0; + /* + * Don't duplicate many vmas if we've been oom-killed (for + * example) + */ + if (fatal_signal_pending(current)) { + retval =3D -EINTR; + goto loop_out; + } + if (mpnt->vm_flags & VM_ACCOUNT) { + unsigned long len =3D vma_pages(mpnt); + + if (security_vm_enough_memory_mm(oldmm, len)) /* sic */ + goto fail_nomem; + charge =3D len; + } + + tmp =3D vm_area_dup(mpnt); + if (!tmp) + goto fail_nomem; + + /* track_pfn_copy() will later take care of copying internal state. */ + if (unlikely(tmp->vm_flags & VM_PFNMAP)) + untrack_pfn_clear(tmp); + + retval =3D vma_dup_policy(mpnt, tmp); + if (retval) + goto fail_nomem_policy; + tmp->vm_mm =3D mm; + retval =3D dup_userfaultfd(tmp, &uf); + if (retval) + goto fail_nomem_anon_vma_fork; + if (tmp->vm_flags & VM_WIPEONFORK) { + /* + * VM_WIPEONFORK gets a clean slate in the child. + * Don't prepare anon_vma until fault since we don't + * copy page for current vma. + */ + tmp->anon_vma =3D NULL; + } else if (anon_vma_fork(tmp, mpnt)) + goto fail_nomem_anon_vma_fork; + vm_flags_clear(tmp, VM_LOCKED_MASK); + /* + * Copy/update hugetlb private vma information. + */ + if (is_vm_hugetlb_page(tmp)) + hugetlb_dup_vma_private(tmp); + + /* + * Link the vma into the MT. After using __mt_dup(), memory + * allocation is not necessary here, so it cannot fail. + */ + vma_iter_bulk_store(&vmi, tmp); + + mm->map_count++; + + if (tmp->vm_ops && tmp->vm_ops->open) + tmp->vm_ops->open(tmp); + + file =3D tmp->vm_file; + if (file) { + struct address_space *mapping =3D file->f_mapping; + + get_file(file); + i_mmap_lock_write(mapping); + if (vma_is_shared_maywrite(tmp)) + mapping_allow_writable(mapping); + flush_dcache_mmap_lock(mapping); + /* insert tmp into the share list, just after mpnt */ + vma_interval_tree_insert_after(tmp, mpnt, + &mapping->i_mmap); + flush_dcache_mmap_unlock(mapping); + i_mmap_unlock_write(mapping); + } + + if (!(tmp->vm_flags & VM_WIPEONFORK)) + retval =3D copy_page_range(tmp, mpnt); + + if (retval) { + mpnt =3D vma_next(&vmi); + goto loop_out; + } + } + /* a new mm has just been created */ + retval =3D arch_dup_mmap(oldmm, mm); +loop_out: + vma_iter_free(&vmi); + if (!retval) { + mt_set_in_rcu(vmi.mas.tree); + ksm_fork(mm, oldmm); + khugepaged_fork(mm, oldmm); + } else { + + /* + * The entire maple tree has already been duplicated. If the + * mmap duplication fails, mark the failure point with + * XA_ZERO_ENTRY. In exit_mmap(), if this marker is encountered, + * stop releasing VMAs that have not been duplicated after this + * point. + */ + if (mpnt) { + mas_set_range(&vmi.mas, mpnt->vm_start, mpnt->vm_end - 1); + mas_store(&vmi.mas, XA_ZERO_ENTRY); + /* Avoid OOM iterating a broken tree */ + set_bit(MMF_OOM_SKIP, &mm->flags); + } + /* + * The mm_struct is going to exit, but the locks will be dropped + * first. Set the mm_struct as unstable is advisable as it is + * not fully initialised. + */ + set_bit(MMF_UNSTABLE, &mm->flags); + } +out: + mmap_write_unlock(mm); + flush_tlb_mm(oldmm); + mmap_write_unlock(oldmm); + if (!retval) + dup_userfaultfd_complete(&uf); + else + dup_userfaultfd_fail(&uf); + return retval; + +fail_nomem_anon_vma_fork: + mpol_put(vma_policy(tmp)); +fail_nomem_policy: + vm_area_free(tmp); +fail_nomem: + retval =3D -ENOMEM; + vm_unacct_memory(charge); + goto loop_out; } -#endif diff --git a/mm/nommu.c b/mm/nommu.c index 2b4d304c6445..a142fc258d39 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1874,3 +1874,11 @@ static int __meminit init_admin_reserve(void) return 0; } subsys_initcall(init_admin_reserve); + +int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) +{ + mmap_write_lock(oldmm); + dup_mm_exe_file(mm, oldmm); + mmap_write_unlock(oldmm); + return 0; +} --=20 2.49.0 From nobody Fri Dec 19 02:49:18 2025 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B2E89267F42; Fri, 25 Apr 2025 15:02:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745593356; cv=fail; b=kSfxKRyvio8piebbo0E7CNHXWbPG4ToNVw7JEaT9PilYPMia3zhYJKdzeDCuu0MkstYoIbPR63+rSFaqJAT/yT9oOtqc48IjSpQ3AliWUaTnuMHx8MeqPxu9WzN1T1tE7Uk1ZMQtPlIlp7UMtUXQMM5xxVMEwgqk9RiFAuOXSp8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745593356; c=relaxed/simple; bh=0NaqT+48Hn74Ymwy9pkGuO6dpi73dtLf9npt1wHypmw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=PMebSVDu77EHsTKIecNoFD1hTSZhSvbaQ6yfyeVcnPWKq71PxwCOmtoRJoNd0IgjiZ+AaEqmltzfXj4Nu7+V1qMrqWP4ZKo1E4jcehAaLEGQj9M6BRrmUs8xItREJsxRdDEnNfB+wKqT0FmwdRWCQppJBye567LzLanclLWW+uQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=hBh9v36I; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=VuaVXxOt; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="hBh9v36I"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="VuaVXxOt" 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 53PEtr6S026501; Fri, 25 Apr 2025 15:02:16 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=uue9dnjDnucZ0k8a+q7dV6i2WUwY+yhnFcXuxQ83DZs=; b= hBh9v36ISQY8iaBjCLbS82lsy90dISKsqD3AJ7yY+tnEG2grAWnNIgze9OVgkIL3 afyWNSzeZslItB+vE2aVBdsWRUIDKDAzi9dX3Um48T136Ylf3CI7cjqgeUBBrHaC Fq2icsesbm9er7pqaJjXc1hr6wkh9GPcjYNfd8V7fgiiHqfR8JhuNLYsqr7ZGXJY jKc6Cb5/a4ZdlG6KNaRyxJtsTB7OhlxfrIxJOY+SbaQ65q5QJ7oD6kuJX+N/q917 KHalHyoGvG4dTlALf7juBH5GSgFJ98tLOnhIe7cYseOnm4nKjGsXSZ/AC6hratq9 cqlq5Ou+9+6MrOCSD4+ATw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 468bs185sq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 15:02:15 +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 53PEtB1f024802; Fri, 25 Apr 2025 14:55:14 GMT Received: from ch1pr05cu001.outbound.protection.outlook.com (mail-northcentralusazlp17010004.outbound.protection.outlook.com [40.93.20.4]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 467pucw37r-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 25 Apr 2025 14:55:14 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JugETxghUKz6fgu2Yb8EF8BVpjApeNSLrCJBMm4kmKjmFCGw4vtMtZ5trZN5VEtLVCMMDT/zmSgMA3z1cCW6Mzn0YgPnZCyXNowIUrDPACxZmX6NIl7WnNegCKOs+DYxfT+9DB+rkNZGzfGsa3nEIfnaV3rlNpEMA8PI2lL7QvCij4CakXa6VSV2uu5zp8UpbfXqhSJg/f4XoD41tf9wrwXi27yvu73y2Y2cZjHdY3VCXf8M3v3xT0grH2Vc/uJSRY/vREP5kbhSVM2RaceTm+ldwECDy7FK7NPCW3TPqNsGjrUt10dh4s2VeHIyswVoCDng0aJcrbp9JWP9lqUHiA== 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=uue9dnjDnucZ0k8a+q7dV6i2WUwY+yhnFcXuxQ83DZs=; b=FzGbvvyqIfh14foskgFxCu/VGMaVf2jz2jvJfijaBOy2iW4OVyB/XyUf3OZanNbG/qkpwEbXP6HwBE09raAWepLLNyj+KK0XNw15KQSz3FYG3bqKqVXj8kTHO9MUtY0XgV98GOcp5Etgaxc/vVj0bSOZpWDb5O5T3hjlSWAMRtFbmR9IKRva20hEryGsS7XKdbKCMTudvL53K4nRtr3GDpHH5ag0RQ4HM9lsud9S81N5BUg8aGzwxJ37BGXFliv/S4GbCCkXsEm1cfA9CWshzvVGjkvuzTdLx0zuOZmExzgfwrNfeE/8VASzwZzcgbygYRp7HNAceqk+roIE6HcNkw== 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=uue9dnjDnucZ0k8a+q7dV6i2WUwY+yhnFcXuxQ83DZs=; b=VuaVXxOtLWyEIkIBhprX5VWDRUmSlQXbjwLkzw8gy5BX4n3irGtDoFmAlKCZLGVnRbl0OeE+fJnk7CzJ9cPJ5aLye0JiCrzr1q67bKYQMJLoFPlHyF6sefK4NCy1tLXs8SDZcESkboTw8LaDQqmQMQCb7II6ankOs/CyuhtUCbw= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CH2PR10MB4133.namprd10.prod.outlook.com (2603:10b6:610:a6::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8678.27; Fri, 25 Apr 2025 14:55:12 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8678.025; Fri, 25 Apr 2025 14:55:12 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: "Liam R . Howlett" , Vlastimil Babka , Jann Horn , Pedro Falcato , David Hildenbrand , Kees Cook , Alexander Viro , Christian Brauner , Jan Kara , Suren Baghdasaryan , linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 3/3] mm: perform VMA allocation, freeing, duplication in mm Date: Fri, 25 Apr 2025 15:54:36 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0504.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:13b::11) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CH2PR10MB4133:EE_ X-MS-Office365-Filtering-Correlation-Id: 8d1ca4e3-fee5-4668-d140-08dd84092e10 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?bDqUR4igDZvZkYMZxtnfo++p7iLakc4ExtOr6M5XZhDs6X47CD5KwNX6ZTWq?= =?us-ascii?Q?dn9ogvG2NfofP/YP1tegSTQs/Ws2KDy//i2dTuhS+bSiOD6H5TnkDJa6RgdI?= =?us-ascii?Q?XjUhs8Syw4ZovnU6LgFhjzpr5dn/IPoMGOxQ4PxlwRCFNtyyqZ5WzUw3pKpE?= =?us-ascii?Q?FgGQdQCzY3UMzLQ0cT4bmF8cfS1jb3DI+jm+dSaMkc9JFxLkHIQoSvOBqPrB?= =?us-ascii?Q?x3h1oHeETB/e7wYtpPOm+MsrlA4uov0D2pBCbCigBAqqlCEQd3pMDmXpsGWL?= =?us-ascii?Q?WhUVOC2WvS1LhePkapSf5ooYdhA+iXaBuanMig4/nEj6bCozhKRmv+THxSty?= =?us-ascii?Q?V7e4xW5tWSRrrnSDlTSddaHT/a59lLwBDT4V2vY5UtWsUNXd+vTaItEXdL77?= =?us-ascii?Q?idCLPV1SOu25SjpaXUYNr3PDM8feBOzFNsxaXCq1KHfL/LSY/FBdQ7nP2tyB?= =?us-ascii?Q?PE5MLjkqQpGvYgG8+82QiCdQazU28DKyk9mhjeKVgx3N0IMM+3ttt6DmqYAD?= =?us-ascii?Q?TZSkbno7ow41tEhi91r/nzz4RcfPeJ6yGtBWMTbDhpbniY5EVsXSUVsJ0Crv?= =?us-ascii?Q?bzXd3K0jFX+bnihlVxcF3KP4d31E2yeztLSpi0ncrfJncagf2L1G8nGPhDkV?= =?us-ascii?Q?EG9d1oT9JqC+oUlxupbqxe+0kvrTfqLImkiPbn7Y2+0vi8CjtZyJKED9hBGc?= =?us-ascii?Q?4tibDCVqVBFVOYQGesGv+T1tzpC+fE+hlXyQeqLOjxU+sisZy0BlrZup0rcV?= =?us-ascii?Q?kZfxoYjiXS/ZBbhJyPOCbSCChkZIZt7IH3xOr061MJ43tvLzzwvNDzcDOzLU?= =?us-ascii?Q?U8mREigSj0RCDf7iYFXi9WeO1WS2QQPo0KZjPZnp41As9EPfoQUKOyVMc68/?= =?us-ascii?Q?/cgx53zt4NMVtcQGqhID3yd9UYHNOCfy8JuycqU62ABoR46qui7NBiPRn1+W?= =?us-ascii?Q?3wB7MkBfzB2R5nGWRIVQG5JVVSF3eEahVbFlYdMlPORpYa0dlUymQfKd31zo?= =?us-ascii?Q?z03hjORQxN7YKxbfr/Uxoj+Byghtqlpe8ZuKbQpWDUy5Ap4KXJbsNyfYDIoi?= =?us-ascii?Q?fUfpFY68WzbJze9r8YfXWdY1YLDjjq8qcmI06AftGR8g3ztZN2g0sXslkHxZ?= =?us-ascii?Q?jfUpEm7ab+CBRKJFF9+1uu6z9+9dwnr6mGG89oblU60KwyxrroGLRY5/M66t?= =?us-ascii?Q?P1Jc8ZaWaVjFnQbZ1rhqC0moycW/og1G8x3gE1lyuiLokQ72tw6aAMoSj72O?= =?us-ascii?Q?lduI1k5CsS+v/S5+Mt+6wmVfaBdM91fx2vPXYWQnHAi1kZhZdCWj88qCzwSQ?= =?us-ascii?Q?dG3kYhRyxEBVzV3WjLhSeXT1JsbMD6ypx1YFi1cx7BZEJKJr106HCIEPBHVk?= =?us-ascii?Q?wBmRcSrQYRs8hS0PMsLgAohuD3ZRF52gKUSBekLKrFyR3UHq7oE4NCDEojvZ?= =?us-ascii?Q?wNDy3s16SIw=3D?= 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)(7416014)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?gsjIE1674tmuM1Y5nSnKcR8Sfg/1AeedmQq7vQhFl9pnvw0kALMtIVTRBwIC?= =?us-ascii?Q?ja8RAeW5R2J7q9YLDQ/soj+RhPdLw38bf+U2GHO9actHRU1nulG+jdRgzzLo?= =?us-ascii?Q?tHcEETFTdb5h4ancDYtLPmChZ7Ev1XrUnqwjqK5QlEHTdA96bx1d0nDkpX5d?= =?us-ascii?Q?jNph35xIvMWb/Q+E5cZFA8E+OLbfJ3Llwhh6ZIqervEKBCUJmLyAooh3qyHI?= =?us-ascii?Q?oCuCVjrClaapI21bKhZ1nB8BPl10gx2gQNzUupEakXcI/EWuiZvGz1Jxw2bq?= =?us-ascii?Q?Kl+L46Zn5Sy+672Y8cYSysBQqI0UoFJ39/PDr+WlG6zqyvx5xaGKXV4kNcB5?= =?us-ascii?Q?SSCDYW66bjjc1UZ8uakwHC1a99zhNK2RxUIj5WI1knfng+iU+CPeHqxdsWrP?= =?us-ascii?Q?etmCFxYRKEeIPNBdQ+ee55PLlxy+1sTiW/nOXbD4RvYImVrQvbp3XgJ4ZFyj?= =?us-ascii?Q?qW3azNzfJ1y74cpguXFLe2DsPUv+BKPgWhcamjFzDqXVDwzPFq72wpZHMHmq?= =?us-ascii?Q?Ls+B+/jNvMAknQ4LMOdvCy3Z5r7xBfz9Rixp9vGW18QCIBqDXr4A4sjMj1lP?= =?us-ascii?Q?ZHQdfreMx+FyYoQRDjbPt/52D/m9x3VGk/a7X9tsK3zUJevBduyR+oNEOhqN?= =?us-ascii?Q?hjo0UTJy799jzHJTqcAMrMYFRUJvg1yOVwGlvj+XRW1RqzPmaxekiuuvO59y?= =?us-ascii?Q?hMKOt2PsCpsF5IjsAyXkH3S3AgEUls1ZYWKalBv4zHIrYDme4v4YmSglCeeR?= =?us-ascii?Q?LovbG8rFJeoJmKyoRiLbkB6e1+7M0UChMhPCbCqiRMTdJPS56hVaATrgiYn6?= =?us-ascii?Q?65s/4uP4XROP9R3FPt4SFhUuZS2WiUeXPBTe9fHb+vo0ATUwFy12EdDoj5jh?= =?us-ascii?Q?TwtPsoLh0AcD2k8chBSGsDHf8J/ARcHp+0L/+s11r69auPm51k+YLAYnubNj?= =?us-ascii?Q?2HHqRtQl0T3WIImwJgXTLH4dCxU6e0tkC11Yexjb6w+KrFE7DQ7qf/OUat7A?= =?us-ascii?Q?sv/2ht3xOWWIh6laB4RfvFBBK36Gr7fC1NrfFNkE9ZY1/drBsmet2AH6y7EL?= =?us-ascii?Q?5pSfzzIpUiFZEX00nK0mmwIo814FLWzo5DVazZB+lg7IzOrZ0YXN8mjq8xBT?= =?us-ascii?Q?yYde7+43B9bon0RtKg2w0o13VDNpBHy69RzuslffoCWfLk9R7B7ui/PehU+9?= =?us-ascii?Q?waVpSsu6vg8dh9GJrKyxuKJfDoF4XGJJpCz8XJhK0rKH89thl51xugx1DnG4?= =?us-ascii?Q?u2hJfKNwBWohPDkq586L2uhcVTom0Zg79+6/VdW513PPj1Rx8Y+2PEZzCzyU?= =?us-ascii?Q?k6Usk379lmGqDGOB/n4dGaYogopg1q0YnT52rz5gvvJ3AQbTbC9P/k8H/9DV?= =?us-ascii?Q?/35PCm1bD5FHieeUmhBiGfPY64EKT/HilRkFL9kzZ+q5c4sJPyp2Mxk9NvE1?= =?us-ascii?Q?Eu4sEmeny4xcOrPaLUW8JFoUwIrK2eFK7OGoJGPyS5mLiVBRtvI4Tvmvl1je?= =?us-ascii?Q?8RQJe44a5IWNfwFDZpXDGe6UbdnPPRtiibTI9azMCh0hp1787d97mH/j6PVU?= =?us-ascii?Q?LtBZIcRopt72T7lqr2Ru7SuakfuNmXOOTzpLf3OCfqmua9DYa1880XKf2rOH?= =?us-ascii?Q?kw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: yObRPxnwdnjYn7D4oXGv2rjx2O42ivJSVkTA0Xey9/DU9JOgKPWrX4BZkVlYHfMELpRl5RYb84QM0I48rGkGv10Jj4Q2MPrNb1Q5Bb3BmbMtlJK2w/UIC0ENSCiAPSb30k81g16Bu5P7F9MPw7udIkZNaKJXy4yEskp4LFqe7YLaIMuBNtU5QUgQlfcd5bSHDkSXmlYUIJMhDEmeCEk56DCvC1kPvXtcfzkXg7y+GzJuypSAaZLi6UZgfBQukXIM3kfuaZzsBtouDIfL63r07fCcyYgtOw4Y5DET4OGqoYezpW0D7V41A9xRruDblVCMdILQVc76nZbYUNa2WBCjAiLjMyF4R+prTkx5Wq88bho2u7X2hEnu5QO5mj9ThRukFJOuPz3f8FfmY3w+3UEguuDnx+uHFtRBSG1gEncXKGiw8pLOgN1e7/0XzI/NNLk5uB0yMTaPFF/VR4NFSpFtK2x4Ra0OFOs5EEJpg/W0GxdZWqsRfOEvz9p6/JsKtKR9zaOonTHePVSs2Z5XCMCAPsjPtCc/dP8TzB/NpotLknbD+tULDd6hlaU+ig1gk+JNBUsxUpWvLRu5z1WB5wbXfKM68pj6853N+RyxKHPHX+U= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8d1ca4e3-fee5-4668-d140-08dd84092e10 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Apr 2025 14:55:12.1221 (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: kW/aKCFTBbhNdb0l79jXH5/qshE92KRVMfoZroN3wSA4yMGCRlfw0IC5k3qFMDCfhNGmVg+T34LBK21IRB+AqDGvMAdP+ZvbGPiJW74SmCY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR10MB4133 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.0.736,FMLib:17.12.80.40 definitions=2025-04-25_04,2025-04-24_02,2025-02-21_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxlogscore=999 mlxscore=0 spamscore=0 phishscore=0 bulkscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2504070000 definitions=main-2504250106 X-Proofpoint-GUID: 5W1bnpJmmNfwR8o7ylL89G5rUNblTDb3 X-Proofpoint-ORIG-GUID: 5W1bnpJmmNfwR8o7ylL89G5rUNblTDb3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI1MDEwNyBTYWx0ZWRfXzrGm6koG54yN R75rqyGNfST5iaxj9XIg96PgNVfUVZyDnbZ+qwgfMS2HXxWhbub5dTk49LVaSTpdCNBYWHYQNVJ V1uKGj2LHgTot7tQZMABOhKUOarO6UTL+TlWHN9qLPzKyyb99UhOjWBclpQwIF6rZrsmhreVckk MDAW9GH9mrdUlUxh4Fq9mcM7VH0madfhc91dDO6RhwG7ATMyBanhQRLMTZg2uoV3e1+OAGLxnSQ TA9qb66Ij0UTw5zFwe7A7grfDDk0lTjJLGUHepyDfi0pAy8iZcvt7a+9SS7s8guedkOMkKb5yRY aUPJbatP2x88MQ/rUmqbcudt1uSPeoLuyNNfz+gFNliprDywYgY8mb+2rwXxZyX9A/DzoL6xIPk i/jdgm5A Content-Type: text/plain; charset="utf-8" Right now these are performed in kernel/fork.c which is odd and a violation of separation of concerns, as well as preventing us from integrating this and related logic into userland VMA testing going forward, and perhaps more importantly - enabling us to, in a subsequent commit, make VMA allocation/freeing a purely internal mm operation. There is a fly in the ointment - nommu - mmap.c is not compiled if CONFIG_MMU not set, and neither is vma.c. To square the circle, let's add a new file - vma_init.c. This will be compiled for both CONFIG_MMU and nommu builds, and will also form part of the VMA userland testing. This allows us to de-duplicate code, while maintaining separation of concerns and the ability for us to userland test this logic. Update the VMA userland tests accordingly, additionally adding a detach_free_vma() helper function to correctly detach VMAs before freeing them in test code, as this change was triggering the assert for this. Signed-off-by: Lorenzo Stoakes --- MAINTAINERS | 1 + kernel/fork.c | 88 ------------------- mm/Makefile | 2 +- mm/mmap.c | 3 +- mm/nommu.c | 4 +- mm/vma.h | 6 ++ mm/vma_init.c | 101 ++++++++++++++++++++++ tools/testing/vma/Makefile | 2 +- tools/testing/vma/vma.c | 26 ++++-- tools/testing/vma/vma_internal.h | 143 +++++++++++++++++++++++++------ 10 files changed, 250 insertions(+), 126 deletions(-) create mode 100644 mm/vma_init.c diff --git a/MAINTAINERS b/MAINTAINERS index 4015227645cc..ce422b268cb6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15608,6 +15608,7 @@ F: mm/mremap.c F: mm/mseal.c F: mm/vma.c F: mm/vma.h +F: mm/vma_init.c F: mm/vma_internal.h F: tools/testing/selftests/mm/merge.c F: tools/testing/vma/ diff --git a/kernel/fork.c b/kernel/fork.c index ac9f9267a473..9e4616dacd82 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -431,88 +431,9 @@ struct kmem_cache *files_cachep; /* SLAB cache for fs_struct structures (tsk->fs) */ struct kmem_cache *fs_cachep; =20 -/* SLAB cache for vm_area_struct structures */ -static struct kmem_cache *vm_area_cachep; - /* SLAB cache for mm_struct structures (tsk->mm) */ static struct kmem_cache *mm_cachep; =20 -struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) -{ - struct vm_area_struct *vma; - - vma =3D kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); - if (!vma) - return NULL; - - vma_init(vma, mm); - - return vma; -} - -static void vm_area_init_from(const struct vm_area_struct *src, - struct vm_area_struct *dest) -{ - dest->vm_mm =3D src->vm_mm; - dest->vm_ops =3D src->vm_ops; - dest->vm_start =3D src->vm_start; - dest->vm_end =3D src->vm_end; - dest->anon_vma =3D src->anon_vma; - dest->vm_pgoff =3D src->vm_pgoff; - dest->vm_file =3D src->vm_file; - dest->vm_private_data =3D src->vm_private_data; - vm_flags_init(dest, src->vm_flags); - memcpy(&dest->vm_page_prot, &src->vm_page_prot, - sizeof(dest->vm_page_prot)); - /* - * src->shared.rb may be modified concurrently when called from - * dup_mmap(), but the clone will reinitialize it. - */ - data_race(memcpy(&dest->shared, &src->shared, sizeof(dest->shared))); - memcpy(&dest->vm_userfaultfd_ctx, &src->vm_userfaultfd_ctx, - sizeof(dest->vm_userfaultfd_ctx)); -#ifdef CONFIG_ANON_VMA_NAME - dest->anon_name =3D src->anon_name; -#endif -#ifdef CONFIG_SWAP - memcpy(&dest->swap_readahead_info, &src->swap_readahead_info, - sizeof(dest->swap_readahead_info)); -#endif -#ifndef CONFIG_MMU - dest->vm_region =3D src->vm_region; -#endif -#ifdef CONFIG_NUMA - dest->vm_policy =3D src->vm_policy; -#endif -} - -struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) -{ - struct vm_area_struct *new =3D kmem_cache_alloc(vm_area_cachep, GFP_KERNE= L); - - if (!new) - return NULL; - - ASSERT_EXCLUSIVE_WRITER(orig->vm_flags); - ASSERT_EXCLUSIVE_WRITER(orig->vm_file); - vm_area_init_from(orig, new); - vma_lock_init(new, true); - INIT_LIST_HEAD(&new->anon_vma_chain); - vma_numab_state_init(new); - dup_anon_vma_name(orig, new); - - return new; -} - -void vm_area_free(struct vm_area_struct *vma) -{ - /* The vma should be detached while being destroyed. */ - vma_assert_detached(vma); - vma_numab_state_free(vma); - free_anon_vma_name(vma); - kmem_cache_free(vm_area_cachep, vma); -} - static void account_kernel_stack(struct task_struct *tsk, int account) { if (IS_ENABLED(CONFIG_VMAP_STACK)) { @@ -3033,11 +2954,6 @@ void __init mm_cache_init(void) =20 void __init proc_caches_init(void) { - struct kmem_cache_args args =3D { - .use_freeptr_offset =3D true, - .freeptr_offset =3D offsetof(struct vm_area_struct, vm_freeptr), - }; - sighand_cachep =3D kmem_cache_create("sighand_cache", sizeof(struct sighand_struct), 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_TYPESAFE_BY_RCU| @@ -3054,10 +2970,6 @@ void __init proc_caches_init(void) sizeof(struct fs_struct), 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_ACCOUNT, NULL); - vm_area_cachep =3D kmem_cache_create("vm_area_struct", - sizeof(struct vm_area_struct), &args, - SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_TYPESAFE_BY_RCU| - SLAB_ACCOUNT); mmap_init(); nsproxy_cache_init(); } diff --git a/mm/Makefile b/mm/Makefile index 9d7e5b5bb694..88e80df4b539 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -55,7 +55,7 @@ obj-y :=3D filemap.o mempool.o oom_kill.o fadvise.o \ mm_init.o percpu.o slab_common.o \ compaction.o show_mem.o \ interval_tree.o list_lru.o workingset.o \ - debug.o gup.o mmap_lock.o $(mmu-y) + debug.o gup.o mmap_lock.o vma_init.o $(mmu-y) =20 # Give 'page_alloc' its own module-parameter namespace page-alloc-y :=3D page_alloc.o diff --git a/mm/mmap.c b/mm/mmap.c index 5ba12aa8be59..99e51d82ac0b 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1596,7 +1596,7 @@ static const struct ctl_table mmap_table[] =3D { #endif /* CONFIG_SYSCTL */ =20 /* - * initialise the percpu counter for VM + * initialise the percpu counter for VM, initialise VMA state. */ void __init mmap_init(void) { @@ -1607,6 +1607,7 @@ void __init mmap_init(void) #ifdef CONFIG_SYSCTL register_sysctl_init("vm", mmap_table); #endif + vma_state_init(); } =20 /* diff --git a/mm/nommu.c b/mm/nommu.c index a142fc258d39..0bf4849b8204 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -399,7 +399,8 @@ static const struct ctl_table nommu_table[] =3D { }; =20 /* - * initialise the percpu counter for VM and region record slabs + * initialise the percpu counter for VM and region record slabs, initialis= e VMA + * state. */ void __init mmap_init(void) { @@ -409,6 +410,7 @@ void __init mmap_init(void) VM_BUG_ON(ret); vm_region_jar =3D KMEM_CACHE(vm_region, SLAB_PANIC|SLAB_ACCOUNT); register_sysctl_init("vm", nommu_table); + vma_state_init(); } =20 /* diff --git a/mm/vma.h b/mm/vma.h index 149926e8a6d1..7f476ca3d52e 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -548,4 +548,10 @@ int expand_downwards(struct vm_area_struct *vma, unsig= ned long address); =20 int __vm_munmap(unsigned long start, size_t len, bool unlock); =20 +/* vma_init.h, shared between CONFIG_MMU and nommu. */ +void __init vma_state_init(void); +struct vm_area_struct *vm_area_alloc(struct mm_struct *mm); +struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig); +void vm_area_free(struct vm_area_struct *vma); + #endif /* __MM_VMA_H */ diff --git a/mm/vma_init.c b/mm/vma_init.c new file mode 100644 index 000000000000..967ca8517986 --- /dev/null +++ b/mm/vma_init.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +/* + * Functions for initialisaing, allocating, freeing and duplicating VMAs. = Shared + * between CONFIG_MMU and non-CONFIG_MMU kernel configurations. + */ + +#include "vma_internal.h" +#include "vma.h" + +/* SLAB cache for vm_area_struct structures */ +static struct kmem_cache *vm_area_cachep; + +void __init vma_state_init(void) +{ + struct kmem_cache_args args =3D { + .use_freeptr_offset =3D true, + .freeptr_offset =3D offsetof(struct vm_area_struct, vm_freeptr), + }; + + vm_area_cachep =3D kmem_cache_create("vm_area_struct", + sizeof(struct vm_area_struct), &args, + SLAB_HWCACHE_ALIGN|SLAB_PANIC|SLAB_TYPESAFE_BY_RCU| + SLAB_ACCOUNT); +} + +struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) +{ + struct vm_area_struct *vma; + + vma =3D kmem_cache_alloc(vm_area_cachep, GFP_KERNEL); + if (!vma) + return NULL; + + vma_init(vma, mm); + + return vma; +} + +static void vm_area_init_from(const struct vm_area_struct *src, + struct vm_area_struct *dest) +{ + dest->vm_mm =3D src->vm_mm; + dest->vm_ops =3D src->vm_ops; + dest->vm_start =3D src->vm_start; + dest->vm_end =3D src->vm_end; + dest->anon_vma =3D src->anon_vma; + dest->vm_pgoff =3D src->vm_pgoff; + dest->vm_file =3D src->vm_file; + dest->vm_private_data =3D src->vm_private_data; + vm_flags_init(dest, src->vm_flags); + memcpy(&dest->vm_page_prot, &src->vm_page_prot, + sizeof(dest->vm_page_prot)); + /* + * src->shared.rb may be modified concurrently when called from + * dup_mmap(), but the clone will reinitialize it. + */ + data_race(memcpy(&dest->shared, &src->shared, sizeof(dest->shared))); + memcpy(&dest->vm_userfaultfd_ctx, &src->vm_userfaultfd_ctx, + sizeof(dest->vm_userfaultfd_ctx)); +#ifdef CONFIG_ANON_VMA_NAME + dest->anon_name =3D src->anon_name; +#endif +#ifdef CONFIG_SWAP + memcpy(&dest->swap_readahead_info, &src->swap_readahead_info, + sizeof(dest->swap_readahead_info)); +#endif +#ifndef CONFIG_MMU + dest->vm_region =3D src->vm_region; +#endif +#ifdef CONFIG_NUMA + dest->vm_policy =3D src->vm_policy; +#endif +} + +struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) +{ + struct vm_area_struct *new =3D kmem_cache_alloc(vm_area_cachep, GFP_KERNE= L); + + if (!new) + return NULL; + + ASSERT_EXCLUSIVE_WRITER(orig->vm_flags); + ASSERT_EXCLUSIVE_WRITER(orig->vm_file); + vm_area_init_from(orig, new); + vma_lock_init(new, true); + INIT_LIST_HEAD(&new->anon_vma_chain); + vma_numab_state_init(new); + dup_anon_vma_name(orig, new); + + return new; +} + +void vm_area_free(struct vm_area_struct *vma) +{ + /* The vma should be detached while being destroyed. */ + vma_assert_detached(vma); + vma_numab_state_free(vma); + free_anon_vma_name(vma); + kmem_cache_free(vm_area_cachep, vma); +} diff --git a/tools/testing/vma/Makefile b/tools/testing/vma/Makefile index 860fd2311dcc..4fa5a371e277 100644 --- a/tools/testing/vma/Makefile +++ b/tools/testing/vma/Makefile @@ -9,7 +9,7 @@ include ../shared/shared.mk OFILES =3D $(SHARED_OFILES) vma.o maple-shim.o TARGETS =3D vma =20 -vma.o: vma.c vma_internal.h ../../../mm/vma.c ../../../mm/vma.h +vma.o: vma.c vma_internal.h ../../../mm/vma.c ../../../mm/vma_init.c ../..= /../mm/vma.h =20 vma: $(OFILES) $(CC) $(CFLAGS) -o $@ $(OFILES) $(LDLIBS) diff --git a/tools/testing/vma/vma.c b/tools/testing/vma/vma.c index 7cfd6e31db10..98a1a0390583 100644 --- a/tools/testing/vma/vma.c +++ b/tools/testing/vma/vma.c @@ -28,6 +28,7 @@ unsigned long stack_guard_gap =3D 256UL<vm_pgoff, 0); ASSERT_EQ(vma->vm_flags, flags); =20 - vm_area_free(vma); + detach_free_vma(vma); mtree_destroy(&mm.mm_mt); =20 return true; @@ -360,7 +367,7 @@ static bool test_simple_modify(void) ASSERT_EQ(vma->vm_end, 0x1000); ASSERT_EQ(vma->vm_pgoff, 0); =20 - vm_area_free(vma); + detach_free_vma(vma); vma_iter_clear(&vmi); =20 vma =3D vma_next(&vmi); @@ -369,7 +376,7 @@ static bool test_simple_modify(void) ASSERT_EQ(vma->vm_end, 0x2000); ASSERT_EQ(vma->vm_pgoff, 1); =20 - vm_area_free(vma); + detach_free_vma(vma); vma_iter_clear(&vmi); =20 vma =3D vma_next(&vmi); @@ -378,7 +385,7 @@ static bool test_simple_modify(void) ASSERT_EQ(vma->vm_end, 0x3000); ASSERT_EQ(vma->vm_pgoff, 2); =20 - vm_area_free(vma); + detach_free_vma(vma); mtree_destroy(&mm.mm_mt); =20 return true; @@ -406,7 +413,7 @@ static bool test_simple_expand(void) ASSERT_EQ(vma->vm_end, 0x3000); ASSERT_EQ(vma->vm_pgoff, 0); =20 - vm_area_free(vma); + detach_free_vma(vma); mtree_destroy(&mm.mm_mt); =20 return true; @@ -427,7 +434,7 @@ static bool test_simple_shrink(void) ASSERT_EQ(vma->vm_end, 0x1000); ASSERT_EQ(vma->vm_pgoff, 0); =20 - vm_area_free(vma); + detach_free_vma(vma); mtree_destroy(&mm.mm_mt); =20 return true; @@ -618,7 +625,7 @@ static bool test_merge_new(void) ASSERT_EQ(vma->vm_pgoff, 0); ASSERT_EQ(vma->anon_vma, &dummy_anon_vma); =20 - vm_area_free(vma); + detach_free_vma(vma); count++; } =20 @@ -1667,6 +1674,7 @@ int main(void) int num_tests =3D 0, num_fail =3D 0; =20 maple_tree_init(); + vma_state_init(); =20 #define TEST(name) \ do { \ diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_inter= nal.h index 572ab2cea763..28f778818d3f 100644 --- a/tools/testing/vma/vma_internal.h +++ b/tools/testing/vma/vma_internal.h @@ -135,6 +135,10 @@ typedef __bitwise unsigned int vm_fault_t; */ #define pr_warn_once pr_err =20 +#define data_race(expr) expr + +#define ASSERT_EXCLUSIVE_WRITER(x) + struct kref { refcount_t refcount; }; @@ -235,6 +239,8 @@ struct file { =20 #define VMA_LOCK_OFFSET 0x40000000 =20 +typedef struct { unsigned long v; } freeptr_t; + struct vm_area_struct { /* The first cache line has the info for VMA tree walking. */ =20 @@ -244,9 +250,7 @@ struct vm_area_struct { unsigned long vm_start; unsigned long vm_end; }; -#ifdef CONFIG_PER_VMA_LOCK - struct rcu_head vm_rcu; /* Used for deferred freeing. */ -#endif + freeptr_t vm_freeptr; /* Pointer used by SLAB_TYPESAFE_BY_RCU */ }; =20 struct mm_struct *vm_mm; /* The address space we belong to. */ @@ -421,6 +425,65 @@ struct vm_unmapped_area_info { unsigned long start_gap; }; =20 +struct kmem_cache_args { + /** + * @align: The required alignment for the objects. + * + * %0 means no specific alignment is requested. + */ + unsigned int align; + /** + * @useroffset: Usercopy region offset. + * + * %0 is a valid offset, when @usersize is non-%0 + */ + unsigned int useroffset; + /** + * @usersize: Usercopy region size. + * + * %0 means no usercopy region is specified. + */ + unsigned int usersize; + /** + * @freeptr_offset: Custom offset for the free pointer + * in &SLAB_TYPESAFE_BY_RCU caches + * + * By default &SLAB_TYPESAFE_BY_RCU caches place the free pointer + * outside of the object. This might cause the object to grow in size. + * Cache creators that have a reason to avoid this can specify a custom + * free pointer offset in their struct where the free pointer will be + * placed. + * + * Note that placing the free pointer inside the object requires the + * caller to ensure that no fields are invalidated that are required to + * guard against object recycling (See &SLAB_TYPESAFE_BY_RCU for + * details). + * + * Using %0 as a value for @freeptr_offset is valid. If @freeptr_offset + * is specified, %use_freeptr_offset must be set %true. + * + * Note that @ctor currently isn't supported with custom free pointers + * as a @ctor requires an external free pointer. + */ + unsigned int freeptr_offset; + /** + * @use_freeptr_offset: Whether a @freeptr_offset is used. + */ + bool use_freeptr_offset; + /** + * @ctor: A constructor for the objects. + * + * The constructor is invoked for each object in a newly allocated slab + * page. It is the cache user's responsibility to free object in the + * same state as after calling the constructor, or deal appropriately + * with any differences between a freshly constructed and a reallocated + * object. + * + * %NULL means no constructor. + */ + void (*ctor)(void *); +}; + static inline void vma_iter_invalidate(struct vma_iterator *vmi) { mas_pause(&vmi->mas); @@ -505,31 +568,38 @@ static inline void vma_init(struct vm_area_struct *vm= a, struct mm_struct *mm) vma->vm_lock_seq =3D UINT_MAX; } =20 -static inline struct vm_area_struct *vm_area_alloc(struct mm_struct *mm) -{ - struct vm_area_struct *vma =3D calloc(1, sizeof(struct vm_area_struct)); +struct kmem_cache { + const char *name; + size_t object_size; + struct kmem_cache_args *args; +}; =20 - if (!vma) - return NULL; +static inline struct kmem_cache *__kmem_cache_create(const char *name, + size_t object_size, + struct kmem_cache_args *args) +{ + struct kmem_cache *ret =3D malloc(sizeof(struct kmem_cache)); =20 - vma_init(vma, mm); + ret->name =3D name; + ret->object_size =3D object_size; + ret->args =3D args; =20 - return vma; + return ret; } =20 -static inline struct vm_area_struct *vm_area_dup(struct vm_area_struct *or= ig) -{ - struct vm_area_struct *new =3D calloc(1, sizeof(struct vm_area_struct)); +#define kmem_cache_create(__name, __object_size, __args, ...) \ + __kmem_cache_create((__name), (__object_size), (__args)) =20 - if (!new) - return NULL; +static inline void *kmem_cache_alloc(struct kmem_cache *s, gfp_t gfpflags) +{ + (void)gfpflags; =20 - memcpy(new, orig, sizeof(*new)); - refcount_set(&new->vm_refcnt, 0); - new->vm_lock_seq =3D UINT_MAX; - INIT_LIST_HEAD(&new->anon_vma_chain); + return calloc(s->object_size, 1); +} =20 - return new; +static inline void kmem_cache_free(struct kmem_cache *s, void *x) +{ + free(x); } =20 /* @@ -696,11 +766,6 @@ static inline void mpol_put(struct mempolicy *) { } =20 -static inline void vm_area_free(struct vm_area_struct *vma) -{ - free(vma); -} - static inline void lru_add_drain(void) { } @@ -1240,4 +1305,32 @@ static inline int mapping_map_writable(struct addres= s_space *mapping) return 0; } =20 +static inline void vma_lock_init(struct vm_area_struct *vma, bool reset_re= fcnt) +{ + (void)vma; + (void)reset_refcnt; +} + +static inline void vma_numab_state_init(struct vm_area_struct *vma) +{ + (void)vma; +} + +static inline void vma_numab_state_free(struct vm_area_struct *vma) +{ + (void)vma; +} + +static inline void dup_anon_vma_name(struct vm_area_struct *orig_vma, + struct vm_area_struct *new_vma) +{ + (void)orig_vma; + (void)new_vma; +} + +static inline void free_anon_vma_name(struct vm_area_struct *vma) +{ + (void)vma; +} + #endif /* __MM_VMA_INTERNAL_H */ --=20 2.49.0