From nobody Sun Feb 8 05:27:47 2026 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 8A203288C8F; Thu, 24 Apr 2025 21:16:00 +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=1745529362; cv=fail; b=pa9EQr0Uzc2Bg+dUXyMXzjSAX1CN104JjIHeyrWDHXkP/fl7kXFRGctakeLYCMnpyao4xd7h1s8dOhRDFgJlzoHZb9UXm6fcHnKHAIbkWn8+TowxzSAdaMd12wVj8T9flFVol1c8MWWXLgkkYpfN61TsNJEpCKm0MGDEdzgQcpg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745529362; c=relaxed/simple; bh=/yi7o3m2gCzu3ViZvSikp4N29oXl3n5xDg7+IqxRItE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=sX9fRRQbhzgUibbsiS9iXgqieYGxkfq7Hsb6kRj3xxdei239jfW+AaXwtuZlkb+OwxIVuhq8WjKKQyKumIFNYnPrPR39whV0wBPQ3nEb0AYbCsLO+N8KYDHXJcWO+GtLv2mffF0AHWKq0MfMQ6xid1CGMI1JrW92HeQd3hhlfxc= 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=igE9pnYi; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=y4iLryNs; 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="igE9pnYi"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="y4iLryNs" 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 53OKv2rj013529; Thu, 24 Apr 2025 21:15:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=BroK/C7XX9pjO0HOQ6onmq6GTx9AgXcSxQpVJbpzmMs=; b= igE9pnYiQDVqFjivY8BR8sdCJHBAl3Xd9yFulmlHVntFkqd3DZt891LSmy+97Iq0 s0zi4gJxmaV8w5q+/xzlIfcviRL583cVxDvTVTpizhOhRVplCn4P+b+vakjK6/q3 EU3VKn2pRjCrZNF0PiQvGwsZ5tnUL23P5xVZBaq8Wx/UaCIr7ct5DPzleM6SBwqG BLbTCB3F3D2fe5S6jYwDWpdIbTKYTHCkXgJlgdh8cSQfaZyZ+EkY+rdH5Gh304ix DZ4sKAKuFc5ReKt0HBRYZZ/zkI3wsy42vGEcL9DIHm6SVcr2+hV7Z7wBAVT8uj2O ue5ZgSzTEXsWRHdtZF6R4Q== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 467vsjr19g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:45 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 53OKDmsw014191; Thu, 24 Apr 2025 21:15:44 GMT Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam02lp2045.outbound.protection.outlook.com [104.47.51.45]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 466jxquc2p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:44 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=udtPvooC4tuip0Qoyb5rMOqPmzocl9VVLmL23ju5B1fYsuP8E4yoainNN+OlIKZMkeBpyQI5TEZlWigRjv401hXUKCdF+NiaxJ1T1watUp2SwEWgszSOEvHzou31PhCYY6ODSbzAdhTki7T78nnbINp2Lqwj2DUfzBw8Zh1ldNAFCaCo8foeUfG7E6x13/0BvrbwaGFxe4t0ksdIgMahNeYcd95ip2uZYdbutFNoKnqE/QMSsj0wtek7HfkEIG8z2gLM+Q669wAGtIcIe1SrZg6+eu/J26RlcmYutjQcdeavfa+8eXvL1Og+PuM8HVQ1ACoXstOFM5gUi4RFt97GGw== 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=BroK/C7XX9pjO0HOQ6onmq6GTx9AgXcSxQpVJbpzmMs=; b=r0GtwJCRLi/x1Zh9JztDcYataiDNXYMhJViDY5RWOhZzJLoTT5/6GmxP/nHdZk2yIFjz2P+k3ItPaIELjuRMjoQT3+n3Q+81AlRhcndXiEiR3RC0u/ZdIIlFkJFq9jQWFnUuLNJy/nrg5uCyjNm6cu6q5gU20YCXFxSJQn+82Ebzk48+b5M46oCeWczbBFNydniyPfu6u0SWmQgCSGaFr43aH3JGUw203cUnI7uSCB+pY1gJAlN0mfIIyJNP302ZgFo216aSDSh3CTNvP0x5F1XVhnCQkv4Xo7YxtbFV6DemKSV4bK4xJqDYHDK4Twjpu5cjJWEjQcyB22owIOjk7A== 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=BroK/C7XX9pjO0HOQ6onmq6GTx9AgXcSxQpVJbpzmMs=; b=y4iLryNsg4glhTh1trypsD+3h6rZpkvn/MzH8JO/ffQTUoztPFXBWiBgYwVb4KG1pUXrpu8xwh27e6yOmndP7nRPKRU2071EsEqo/XAdhjekVE7YcCPeR3T+RmnwrgmZ7C9e1mLHh+H954SxXtbpR6v4PYyjtVa8DQAnHpNzjF8= Received: from BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) by BN0PR10MB5109.namprd10.prod.outlook.com (2603:10b6:408:124::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8678.27; Thu, 24 Apr 2025 21:15:41 +0000 Received: from BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582]) by BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582%3]) with mapi id 15.20.8678.025; Thu, 24 Apr 2025 21:15:41 +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 1/4] mm: abstract initial stack setup to mm subsystem Date: Thu, 24 Apr 2025 22:15:26 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0279.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:195::14) To BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) 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: BL4PR10MB8229:EE_|BN0PR10MB5109:EE_ X-MS-Office365-Filtering-Correlation-Id: d960741e-87f5-4cee-9112-08dd83752b35 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?HLnE7yn6qwSres6pICi0cBBUcgksVMg1gf6/DxYLOl1WYEKhYWlnrFmH0t0a?= =?us-ascii?Q?3VMhFoX5+SHEpxjrcf6ed1+EvhEU7M6CyzJuagEI7w7u9Nz3PdHc55hNbxoD?= =?us-ascii?Q?D1+ErDEd/hHPS37m6tIBWEhN5uEKVm0xKx3sNmRT3ubsbGYpqcaZLTuaDdaT?= =?us-ascii?Q?n6Xx8dpH28Poy6XPqqA42Hzx8P2y0Uq503ka9Mz66sus5BE/dgwmMZy9SISm?= =?us-ascii?Q?xBf5bqdDWUrTx00l4PBSMgh1uh/Cvfn/U3IkDhBl7JFVGimGUmQE2aPHPmhV?= =?us-ascii?Q?aCXvIKQNM8KJ6NyGU4Lv0UuIIv1O8im+SN8L930NZFEwBOGCZond6Ru2TbpK?= =?us-ascii?Q?XAnSgZ/KY2VTeIukqL+oTA6PXmjNCnZXy0DlBOALYeQZiw/S7kauMKu2R68G?= =?us-ascii?Q?yNT2N+0U7fJscq/Az0EbgDYoo0urrWKj4OS+unwBjHHwSZ9m+V9DU237dOvF?= =?us-ascii?Q?qplU2WFVK/kZPE5zlsDQ0retQZE5AyHwt06TmmMCT+WUM2jI43JXHPJ18hcO?= =?us-ascii?Q?fVWS4VpZOh8pf2kpOOgtnINSamnYraYoBuuJz5OtQcUrlpUCdrTNQzbC2WMI?= =?us-ascii?Q?QnNfdNZ8LUxQzcb9h7Wtk/j+nQ+sTlZVB+nTFpKy9dxXCJek3btx6kvbDE4f?= =?us-ascii?Q?5k5ByMyOiRJ00CcXDEBE2DXkXzny25yu/+SpJL1eD67NWVQAOrjbD5eYDi9M?= =?us-ascii?Q?mZ/peD2Npm9mdY8/ekee1+7ZYKvbIZVIAjkvzawcksec2vVyu6o5PD2j78Fy?= =?us-ascii?Q?QL5n5DkoHZwpsCbykRtoznuZpFndxfVFHr5v6cqGzaPz+Zz3Cd6tZ8wXpgqL?= =?us-ascii?Q?fxtmDbMBHr9cASWBtTeibBgsnUDTkNt5tEy2lmUGtTzB1HLUcZfZ2WiYDv6U?= =?us-ascii?Q?HArwOQxwhVS/ep/5KCZ9HjQFfraZHzrde3TsJtxq9v96l73RB3DxFVjADBMf?= =?us-ascii?Q?jUru1l6VYZvwp347EF+lqYrrcOlxncklvq3JpQ8Xh9B7B2jEz+mz7DwDDksa?= =?us-ascii?Q?ZEbDRuC91uSJFIPU35h/yMTx+WlblmWttKgxfPJcdkFUDUuiFTi6sL25xlIt?= =?us-ascii?Q?A7+cQMZcwyO4b6kRv4vqRM7puYdwQgTTz7zk2jDtyv1hjJk8Y0YsMpvtD/Gp?= =?us-ascii?Q?AXpO+nOc8q47kAdlO928yGU/v/G3invVrahO+27NkqtO15wjxKMLCJ5s0XPb?= =?us-ascii?Q?7MVspdmon49tpFVhHJBgFj1ih+BfUkB/7kUArlucHRq/0+X4FNRIs4dV7JOK?= =?us-ascii?Q?xzsMT4yncKVHFoLkD3Zz109MugRPgtRNioSYMatlj02lfUwwVhSvoJCFmQYg?= =?us-ascii?Q?rb2kPgNb4wp9z0kghC1FLCdyTs4AGviC8FA9sKjjLe5NRGjVPduJfRXKk+AW?= =?us-ascii?Q?w0HJbmQX91UFI0X5EvKHtI0mVnNt+S1YN2/1fok3AQZQm3nVLSbWIKK6/XB8?= =?us-ascii?Q?5y2lD6DjclU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL4PR10MB8229.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ezg7KNLvZ0B6sDSQhDw3oHnuJpYAtKvX9fsakvtIl3IcTBVGf0hvcJi8tVGl?= =?us-ascii?Q?u3IMrotlIe2MS6pPjEPeXXYeEWcnx7gv2Fy2IQZQ1pgjhR9CbwscCnhlf7Ua?= =?us-ascii?Q?b57vRzKN5PW+ZRIVRViC0euTzJDtTleEiDXGYUe6gGhjPjZ/eZZgyDYUO45u?= =?us-ascii?Q?UglrEuRaAgNMLz/SxBVgQ3J2PS1T5IJRpaEI54FYC0qCA3cG8Sed/TqyMaWX?= =?us-ascii?Q?S8rN0nT/OHkE177MsSu5rU6wRfjzMtRLqy1ulNlDRpqAQBKqL+DKMP5at9Am?= =?us-ascii?Q?MgBgcM/+rt6RTKtrT9TDQssU/AmID1DMIDl92XMpL6qABF1pECYUYLc8W60A?= =?us-ascii?Q?Q8iOyDH/h9DyeiLKMksbD/uS6RHevUPTK3JeOCqGTVbsyvmOHfEHgYHm0XjX?= =?us-ascii?Q?E+gC9DkPGrEoC2NVRfCmAbPJ+xNgH1+fChAy9CxplxxTgnQt6mt2vbSVgxIt?= =?us-ascii?Q?sB47+cdqn/LkqgqXSsf76cFhcqBkeXt3AizjH8Gvkuf2oELG1b8eUVQHptok?= =?us-ascii?Q?9kES1bZqETElv1CxV9iuVSGMRo8VtWaCLJlD1U259CagW0KAj1vnlG4QHAf6?= =?us-ascii?Q?Fcj+58NLSBMGO3n8VS07vREfFnyZB4Zk5yRq7HfA1NvtSrNViDpH/qE1feA8?= =?us-ascii?Q?0kCp9aNZtp+oauET1T+bsSZzMhOCXrDq3sSY/YTzLWsyigx1q7El3WRZpTcA?= =?us-ascii?Q?TLDpTGNfH6fRnkwELhqk1iZoVrzrmZydaVbrPHQIqFPqRQktbGIxZ/EPPIU+?= =?us-ascii?Q?X/vNbxP6p78NV9S58qmRcLcIZ7yE8AQjPtWBABJkbzkzbQx0R/damua4SDeP?= =?us-ascii?Q?LbxZAUC4S3P2nCX2rtf0j2/Yio8JGWIssATG5ThQSGVbK3WQcYE1R6dds6cx?= =?us-ascii?Q?XoDS99EoSA7IZdqos3HckcZNYxc6HX3WbiXRv+htNZuKz1K5rq5Lsx8w4Q9J?= =?us-ascii?Q?2+BSVJo2fUJ4ry9ZnHK338jXxmmTsDPlHwcbsGMdpZnm5Pe3bLpslUHAPyXY?= =?us-ascii?Q?SAi4JBVeIsTl6T7yEkcOyDCkduCdcQc7NfQqM71DwL6kADMby9Cq8gPHJwav?= =?us-ascii?Q?Hb8C1cRmvIpy9sQD790IsWRqt1d9XNnVX4rDkOKIcPr3AK61bjJb0se+polE?= =?us-ascii?Q?xQpP3Y76bC3BgMtdJ/9otdtyfHF7rgxf9gQmpl8tCQouYtlG6QhE81+eBH8Y?= =?us-ascii?Q?xG7Lp+NYteYYWuTjKhV5qiGx0ruOd7Q4y8ou0y5wxx9IoZ3mLLm0UFz7CCtr?= =?us-ascii?Q?VwT/+4nsEnPEg1Yx67+uKBM9m+2Dh6dscbRCE+f3JKJapwTyah0CpxY1IAL7?= =?us-ascii?Q?06/rNSTuuMS+440p+MzOFYM8O19SetMia6sMWNhunX80ny2HZ6G5IqJxlHWH?= =?us-ascii?Q?ZAppsebEXYf/HC31Iqq8KLwQ1dhCEv4Szsc2y7HFzk0pEx3JdE0DbLBBFtNo?= =?us-ascii?Q?GgXcqNJXA2zzy5ZCwRlikhH1XMlbAwWSexFTksI328fqD/Xsl1qyrMXEw1ht?= =?us-ascii?Q?Tjlfw1FggoXR/Z4t/ub6deDeSJQhc97u7CP2afu+NpHD8035Vz/nNTRDf/aw?= =?us-ascii?Q?gsOvRHOlk6Jv650MJaNJr+UFhKhJHhENpgz7CqkXJB7BEYVek+DAgT/FqItO?= =?us-ascii?Q?NA=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: hrKvr1P8zT0a+3XNmKvkpWErSCFiVnSotUuzdtFNsS9TtF6AYmzW4KCbCZc8bAAUm8zHtAqLRV2VMIVgO+a8VTWMOhk1SnPc+p6Vc7VsKWm0GTcUAAFYbcfQMl5TqFVUbp+/i4sJM5F99Haiag0bGq0/Yut4CTg0c4pNCLIBbR8KV3otdP/YjmfvZ9gYsDJpeFas9clAXGVhoTwB6tHURbeYlPVEXNLwFcS5yibsPb3Eh2Tx6lF/6EESwmINlbhcIKq7yvVQt2Ogmv1efgYAUZ1z1PHTo1MNRTnscUq7KfhyQIqrIuLcVZHH2+Vrwsn2wNPDukdvtz0orlSU/GgQP0t9+JYOSJEWm3Wi36SnmVnYBzx9AzYisjg5i4MHVm5hDSq/1wHWsJgv8SYOinsXgAgnJtJpn5lLxAmU7ayJbL01E5RN3AEZGX78NU1T/xOER/MIrjRgciMuOJXsS+ytW80BU3vax9hvW82nuzdj3pLMmx1pHcN512EmkcxEA4axQzdSTmoRplMSKstQfzQu1bBku+gw4Ynm3CNxsepX3YWqa76dQmZK4DJ+VqVNrhoeXa+/ePgf3brmfa+riUvJpeJOBR6Pkq+jm7njWt8VPIs= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: d960741e-87f5-4cee-9112-08dd83752b35 X-MS-Exchange-CrossTenant-AuthSource: BL4PR10MB8229.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2025 21:15:41.6468 (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: W69SyXgpj2JKTvL0/w8fIwnORBZa7knWaU+P99tvqtl8+YhFiyLHKIGLsXIlPNgQl+PdCt8p6K4zqLp2U0o/kCvsvWnGkZXoFkOKY3F+PoU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN0PR10MB5109 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-24_09,2025-04-24_02,2025-02-21_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 adultscore=0 phishscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2504070000 definitions=main-2504240149 X-Proofpoint-ORIG-GUID: -9YNGb4ipC7xdNPXPM5pBRmUXfYEeS2N X-Proofpoint-GUID: -9YNGb4ipC7xdNPXPM5pBRmUXfYEeS2N X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI0MDE0OSBTYWx0ZWRfX5jdlSn6TrPOp rzRrWMzStkmpnzuKES392B32LlwatQ3nx1dudcuia8nhZEV76/w6R2bBxvebc7fEMTDI7XyHHtN k1U3Twn7CzxaLyulrcA0XbB8dJGjeuwHKpgC62l3exbp44IN18/7n+Cqpb/1Cs1I2R3sbaOjX6j 7aP4MdQmc1V8xzLTv0eYBtNPObAAsvPljNB3zGOKSQIZWjwTvH3D/r74gaBQJ8/z/TsANY4PsWd yWbF3nSWtr8PECDgBIs/IBVHlamdK2Wsaz0fiaT3BXanDzTEpu4yISHCGUA8TVMlpfa97qK0EyZ 4A2+RAiducFIsE8YGfDVEIuhjhiY20hyK7Ii64o1/rj6nEQb75NbLOKM0vd7TWw0MqXG3SUM95o 0dfHAO5W 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 | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 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..1289c6381419 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1717,6 +1717,77 @@ 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). + * + * on failure, returns an error code. + */ +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 Sun Feb 8 05:27:47 2026 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 A860C28F937; Thu, 24 Apr 2025 21:16:05 +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=1745529368; cv=fail; b=JOnKo4OiM2xiZ6bLWCGyS7Fa0TesJC1gSJ8wvoQofhhMfpU210jm3x4cAv+9pjPyp7nX5NsYotfeGg9NP96rodcZ4vy3G+FoLWIQezrSY55Tijhr8nNq4LqnWj99dQ3VEoxdCrQ2FzwDfPfd32AGBDSBDl6LWto8Dwo+4KnsmyY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745529368; c=relaxed/simple; bh=wRIklGps7osMNu1O9HzhWBZupoHOuyoh70XG26+ZYz0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=jBFcH4eg90Z8apUhPJm8Roz1fITqn8NB8bqbiHjxVDK1sKLgvfAtRh0x5QpoT4G2hrh561EIM75ydm7NACZSgiNI4EUo9wvlq2pjTw1f+ZuIIHddNRE9KHVfAGKpOE1z/44bDswGrqbVB34+lgBBdyZhA8PDukH5ld0PApbnW5A= 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=KggXawYf; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=dmBKUa0m; 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="KggXawYf"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="dmBKUa0m" 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 53OJgFc7012251; Thu, 24 Apr 2025 21:15:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=1WJwhaM3Ah6VxiU817bwU9dqKKHHLV6dhxQPqZs3Lxo=; b= KggXawYfdLDw56NdsoJi1tshnmfkVEWr5LUk3wklkS0SujGxt0jYg91s3JCAQVdS Ek31RX993QwBFf1n20PlyL3MuLK1DO34vOkw4cgyujGGm+uGmTTUcZevMmWT2nr+ tdGebXkQJzSJthyv120p2J39e+EwWQe59dMo7gfhu5vSEDc7CA0fdnpp1RzrfyF/ BDaD3Ty1aRScUX4e72xJ/woek8JtrYYGxdM5QXYj6PhGl0kvxgmh1d+9E3RvEQzd 5VKYFIx8I3tcwjxX6k+A28TmwSTxKcZawMc3cybkB4Vyx4O/jW9Ueny/JCJ55ET4 W48YVVlp0xp7rvCzYj9oHQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 467upe07hb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:48 +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 53OKp9eA031703; Thu, 24 Apr 2025 21:15:46 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2048.outbound.protection.outlook.com [104.47.70.48]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 467gfrxs02-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:46 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=u6BPvg5IYvpic+ap3dvwebyRhnlCFIJBvUCboTShQbl6/MNNeIT200PavuWz8v4VNyOerp6Gnx/mBTjQC4gTOTVMVTSK8tjQRpMVRURYlFTqqbQiHY1SFdKJ8FV2LoIKJM5ODYyMJwI3cpPEGEeNiELNCw9nOQlKcNXiGuexJbCzVvTEaysPTW8P50+7eXh8wRlzlxbC8VRfF99OZ9mvxGI4nIzmQ4JhytcRD2hqnZvbPdqGW9RnZXazFzr2ltDnqeai8vGF12jPAExHgeHcwZT2xDQ4hgd72YVNgoNic2LVlYffCeHkTkUpG9W8aeF/Yo3j4IDnk4epiUvrCmZCBA== 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=1WJwhaM3Ah6VxiU817bwU9dqKKHHLV6dhxQPqZs3Lxo=; b=qj0Rjfrh8hTmN+jRI8DxHi3V5Uq9+VdwqwopED1kF/ttY7cV06/ASSMLHYFwubKoVfpVgg6/aaKdUB+XgmtkPBdTtvt6A5Z7Oh2fWrfSezuZ2b6uxsk0NVSn0s4DKwD4StKHoD+WCUNDuHPd7sAWw2EgoOKZXgVGtMCTb0WM2yAWVX2mGx6F+6VY7j7cKCGePBkU5dg7ZmudR61UbuSDyHVtTwqztO96Ancc5Ce5u40QqOVwu86nFBPN6vXtfeXIzKZMSTjELnYg3JRVZ9UcfcQax1/he4VeUocnvX/RSeWx5BUvf+4Ke7bju2XkRuEaXs5fbWUzyqJvIV1B6jvYnQ== 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=1WJwhaM3Ah6VxiU817bwU9dqKKHHLV6dhxQPqZs3Lxo=; b=dmBKUa0mqDYCrLJ9zEpo+QIRsaUX95l7y5IVrTIxacT7YtSOT+00yNjcZ5CTEGWc9Z+NWFWjQJ9azMHzgP4R7WBAQW4XfyRG53J22QRev73ghvK27cidNjVQ7ijNd2B2h0t07eL6izgpLfZMMeohOo4otkglAteJkZ2feNaoT+E= Received: from BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) by PH7PR10MB6225.namprd10.prod.outlook.com (2603:10b6:510:1f2::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.40; Thu, 24 Apr 2025 21:15:44 +0000 Received: from BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582]) by BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582%3]) with mapi id 15.20.8678.025; Thu, 24 Apr 2025 21:15:43 +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 2/4] mm: perform VMA allocation, freeing, duplication in mm Date: Thu, 24 Apr 2025 22:15:27 +0100 Message-ID: <0f848d59f3eea3dd0c0cdc3920644222c40cffe6.1745528282.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0040.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2ac::9) To BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) 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: BL4PR10MB8229:EE_|PH7PR10MB6225:EE_ X-MS-Office365-Filtering-Correlation-Id: 239ab0c5-4416-4e0f-bcd5-08dd83752c3c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?X1F4qiVSjAHrgSaSTPm5rjIx/OG0Y0YFSElqEYV/lL1rPNU5MGtjZwHMdQWg?= =?us-ascii?Q?bi3mUCM9wg1qkZgV7ZAshCa/RoaL1LZp8i+9imM9KaRqli31Pf0RqFdKfU82?= =?us-ascii?Q?+1GMXFv6Cwuz3CSD35uSELpMSXhcShpvwQ6ZDml9W7fxSsrHlVKGpkjzio4T?= =?us-ascii?Q?MxiGR8IqmDMLX8KfaPKilOKktZ+z3W4+3ddtdovbKSgVtO0X0w+PYXkshkiw?= =?us-ascii?Q?wk+IU26GpyS3vK5bVgocQjKzvl2QcK7KTrt2NHSRPeaLyIqg8ZUoVDRuk/Zi?= =?us-ascii?Q?WdW7GQ0HWNbUoxb/KRxD950SsDqEKrxmU2BlwfG4215Ysqad4ppsb/G5yaul?= =?us-ascii?Q?uoiJpB4kFDHMAGx4/n8kjrq3rX8Y9BqEPf6bhB2JPhABMJ8mf4GHHlF/95zE?= =?us-ascii?Q?exJMskKsWz1ZIfgPK2L0oqjzm/WO0dCKMBK/uL1jHCgPmLz23dkHBue2I2/A?= =?us-ascii?Q?P8aXJ2widnsLP+9qfcXj4aVj7CK10MvwS+pOmmGma5WNGR30Da4KRSFOn9l2?= =?us-ascii?Q?AJI4jdKMzYtikOE9dEdHFtoyz64FWskbnlePcCldC/TkPMyft8iwVUQ4iCsQ?= =?us-ascii?Q?CzQbn20qQ3ROKlT0DBNGukTosEOhdmjqejBPYjIYi+wnyS/oxqoBVhPFU60A?= =?us-ascii?Q?v9WsqOKrHUHJXP9Rt2A4+XLDmhMEtkICtGv7Xj/YD+53lhsC1qDgUI2Rg194?= =?us-ascii?Q?r1VY9J9HdA5BPPjjDIFq/P4OMihP4lFiSYjqWDL3b0SN2Eh8v/dkJ0eIHNkx?= =?us-ascii?Q?uzJnbxI8n+FmxjW/HGLxxXhVxYVxBUjRXz1OYpwK0buqC0YORaMYDE9skHnv?= =?us-ascii?Q?8sVrhmw/wjWMur0+ON5TGFNtrfZ83PeHHgjC3me4BOQu3T3tqNyL2Ycr4xe6?= =?us-ascii?Q?b/SjFDkVdnymA4G8dVU6bNcshXaqIw0TeI0xk5EhH3VguCHft8zuvsAtui1a?= =?us-ascii?Q?uVR9P/6xVfrFRsokkICgjJPy0F1FGpoH+rzmgxZjlGnTm3g6OBXJ3hD5io94?= =?us-ascii?Q?enM1nYvNKQuAvzEPlppI/SEYJ/4PRKcVZwbbv4AN56XNIzmdYiXLTpCXQ6yu?= =?us-ascii?Q?w4D0tsebvhXwlQ4n4q+uyXDtCzFQIAP79qcaAGsIz21OzvwoKj2pRTGksUtc?= =?us-ascii?Q?Je9lplwRpNQitLvbhDce5e2cRZ0ptc/s1bXyZ3dytYJjDGP0GHHzCPCqtRgN?= =?us-ascii?Q?U3TrPhk3/ElMI5s5nqhvERyvFPeWGFmwL55Xhrgs4KGKhi2UpDC/YZuKKxPZ?= =?us-ascii?Q?4WiHakx2hHErWmcgidnuzGxDL4YceATXZ0E3do9W6fzQEF/PXJT0HhB04eDp?= =?us-ascii?Q?IGj174OvVOvqDV5r+dkcdZ8z2MH6GZ3Zy3P445yd1DOOObgApIRpY/9zw9UP?= =?us-ascii?Q?3AjRSDIP7PwAtsHnJThI/DHy7mAlqsdiQHdjHUn8bx+8sByutQE4zrjtcYE6?= =?us-ascii?Q?65BC78LTGIo=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL4PR10MB8229.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?JpBEhkxP12ZO+lMP3GFogTMJYEwvXumkLlW2hbACSWBv4wg991rQIs+AYsK0?= =?us-ascii?Q?14FJ7rtAUShONpwS33Paaiy+Lmh0xuvGuuhPHhWFAU+LRcGzcqHPL4F3gKN3?= =?us-ascii?Q?RhsQmhwrwEcRwstST3WVizTT3G0gkqyopI1C67kSa1kvJaKKXhH2M6ItBynu?= =?us-ascii?Q?/KD4dJs10+WG0e1MDQTuIPncQF6BBP4Lv6vEEV1pWnIc/5D/SIXzmTAyGPRf?= =?us-ascii?Q?6L5ffKwggkFuuCO8z/iarvos6D6C7La0tqZlEsRnBCcg5/0c69kaPKVjVKbL?= =?us-ascii?Q?q9WLb6TgYmBI0cF8eJycxiKQWMWGg9Pv/giKiYYmhUObBaTHMRTWDdtOQdxk?= =?us-ascii?Q?zvE0GybRy0UA/1B4rDPvcjHh0n8QTkxKdpdRzXkyCTNg/h0lvKB8o6MpoUz1?= =?us-ascii?Q?AvTf2S3bGNUwcKdTWiiL1jW8/4N52MDp9vV+VTGcfsE9j5rjA7i2tpc5owv/?= =?us-ascii?Q?CtxspR2dWenEikOc9KWo7zlVkEo41x8t/0nA/kKYwV6R9cA7oFC3f99SQFCW?= =?us-ascii?Q?qt/hserNXvSu9grTGlfwdisn2L/m1yBYl10Bm5QpSZuv/MPOWO06pVJgnmid?= =?us-ascii?Q?44KxEXykjzZSHYWkPL784kM/DA17Zsdj7XEQ1JW1w9+VO1RNYYe1MZvY1EEO?= =?us-ascii?Q?oguLXn6ShHnnx6ukQyaFq+KbJanDLKQLD/noVA/0Fdyd0z+PS7J9lZ1MNgfY?= =?us-ascii?Q?nOn1CSFNvNcOLp/j6RepVsTmCBd5EjwcndTwmmUdtVHiR3V7vkD9/CafRcWi?= =?us-ascii?Q?4vA9MzjFfqS0hG5fhhlO6sjlqbRgU278WekVd8z+aWvgkHFjUiA7MyeUWQ09?= =?us-ascii?Q?98EXbMXRzTbDk2G8IAdtfoeXc5bHTrOUbH1kE2bRVPxHaNkip/9xjFZuev7K?= =?us-ascii?Q?8E27zDZ1g/T+UQMLdlRhktR2AtRgKglnGwN53I2hC7/0/QPIs4qCw5mHQOOX?= =?us-ascii?Q?4Hn1pSavbkpmLa30VPs7Wk6zwBChEcnvsW6nC1tdRrbWoVTuWO7AJPx0eILW?= =?us-ascii?Q?Hu9vUouTgFJ+CjGrG4d4hADdVq/NG7mOjS3QNHNzq2EcHPlQSyrkKfjOdHMo?= =?us-ascii?Q?xHceARDYMn33xEw0VcInBrw0VDBSb5r1QFYKqLvN+7C1SDgbJXTYAXxvgUsQ?= =?us-ascii?Q?a1+0ETP/cLmVak32yyDLkS8AATsfziims+dvymNwxZfYsoaJI4LJ/1KaXW10?= =?us-ascii?Q?KfE04Q4Bfkq6YbguwKRS82u5ZstIqncZfzcF6KHT3ci+qJ1BF3Tmndsbe2Uq?= =?us-ascii?Q?oTHATZu2C7ffWXAi6XNVaJBk2ByIQWSOMWnG7aCNOpFZ0Av/slBLTrTxOYSI?= =?us-ascii?Q?xz6FVTnGkB/lJ3y3LbbXFHM1JEfHxb7tiuh99zKy0Wsk1NSzVUwMzODJEcbq?= =?us-ascii?Q?7p+54W+lCzWKOwXL5gxvRByYld62ONp6KXzfiQlRMptPv+gjwOBxDJSWwi8L?= =?us-ascii?Q?oLf63EMJyiim2fwBuIBZVxNYUK1t7JEr6BO3bKCojhWVv2FuX1bvPmRcb+zN?= =?us-ascii?Q?FH/Lm4QB59aWpxQ3bxp0p0mWeLm+2gbCDku7IOoCTZCjHrMoSnAK4prEene6?= =?us-ascii?Q?IWeTG/r95h26Zoq1PZDzcdXiSRetzPIDTR1WmRDgYviLMMiiBKaxP8EBRbAg?= =?us-ascii?Q?Vw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: D+FNR2w5YWKR9ENqix5WYl8VUu4lFr2F67EIw/AJ+p1b0KXFZIDSmY9BKXd8ystyYEJ4+k3GycHsvE8hIKh3Ok1WjBklbhP3VXyGLiLSbSgbiIjKuQOXUqOFouHM06dqobbf0NRfbJaNtYv11qJPiVf9NVFS4tnlq+zbHcsknD19YVCDysad8+akgj/keQgGVgJydxD4aQ2pb70dyTM3nq0PTunj2I/2w68FXnkYe1xSzQwYgeItkIH1qvvKNdXS4e+3P/SlnQbVHd0+iB7GRvQh8KqcCGogScFezvj+HrkT9ZbDluVVls3XorXeGL6nbzSKR4M0/EQDgRJYngfOYlj4xqH9PU9VHAFe/edOgwk78iDoZu5rCk+JjuqM7dz1TJdJmkfisMoNfgVYlMu88pKOXrVmaQ4yUKLIBRhsowXWI/eoT+qmq9/9fOWqa7hkTwLxYZbQtbYe+MXYjGZWLjvE6mymEH2HlH6/KGT+qSy8CTUKaijNgOgLbxpWXJqa849AgarBFlW4iggh75rG/+CHuoRAHgGG/0q5oHkrKkOBrQprjiiztu/igIVDqbKHfsPYUjS/cKXUX2emvfk9chvcEcnqkfKB4pok2xLgVtI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 239ab0c5-4416-4e0f-bcd5-08dd83752c3c X-MS-Exchange-CrossTenant-AuthSource: BL4PR10MB8229.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2025 21:15:43.4380 (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: 4kotbaGkdNqKSQFiYReb4AUc0X46iWGcR6YtEZG5VH+TLzhPY7ChYk81fHOOC2UIYb6RrDW22Kzxv9Z6F5UaVuD63pEouLJlprQWnu2E6As= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB6225 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-24_09,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-2504240149 X-Proofpoint-ORIG-GUID: i45UHAl-4ip0oAscoslgpZefBOYiEOQm X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI0MDE0OSBTYWx0ZWRfX7ABDMEWGW7EN +YDq08Qfc0skXzk/agtUPHxEN+GOFlTF6LAt+2luE3Rb4OyHohCCWfZRgLTB/18/+vq1nIrqrvH uZSPhj1g519cmAOADW2QYBXxqMa1rTu/Opr97PsPiO2b0qfiIa2UWYclIzDjoRGd/5sZzBPM5Qt Tackf22rsXKSjUG0DMjg0NdjSGPWDvGkrEXpBFIpkTex/3XHMPUuBfgEA38HhVRE3gOlwPZUYeF 1EIzRP9umDAPoqISb1wBVipqpG3ahzhU9mpmW3KD+alQLpNk6r1jt7wNCzNWe1GovJ2s8YZjSNm QeYKSvB0crBM4N1btdfqghoKfoyPEVNWHe5g//ftHih5dwfqphOB0foOCAYH4CsEhqQCO9aKTPc nM41Qq36 X-Proofpoint-GUID: i45UHAl-4ip0oAscoslgpZefBOYiEOQm 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 is not set, and there is no sensible place to put these outside of that, so we are put in the position of having to duplication some logic here. This isn't ideal, but since nommu is a niche use-case, already duplicates a great deal of mmu logic by its nature and we can eliminate code that is not applicable to nommu, it seems a worthwhile trade-off. The intent is to move all this logic to vma.c in a subsequent commit, rendering VMA allocation, freeing and duplication mm-internal-only and userland testable. Signed-off-by: Lorenzo Stoakes --- kernel/fork.c | 88 --------------------------------------------------- mm/mmap.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++ mm/nommu.c | 67 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 88 deletions(-) diff --git a/kernel/fork.c b/kernel/fork.c index 168681fc4b25..ebddc51624ec 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -428,88 +428,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)) { @@ -3214,11 +3135,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| @@ -3235,10 +3151,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/mmap.c b/mm/mmap.c index 1289c6381419..fbddcd082a93 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -77,6 +77,82 @@ int mmap_rnd_compat_bits __read_mostly =3D CONFIG_ARCH_M= MAP_RND_COMPAT_BITS; static bool ignore_rlimit_data; core_param(ignore_rlimit_data, ignore_rlimit_data, bool, 0644); =20 +/* SLAB cache for vm_area_struct structures */ +static struct kmem_cache *vm_area_cachep; + +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 +#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); +} + /* Update vma->vm_page_prot to reflect vma->vm_flags. */ void vma_set_page_prot(struct vm_area_struct *vma) { @@ -1601,9 +1677,17 @@ static const struct ctl_table mmap_table[] =3D { void __init mmap_init(void) { int ret; + struct kmem_cache_args args =3D { + .use_freeptr_offset =3D true, + .freeptr_offset =3D offsetof(struct vm_area_struct, vm_freeptr), + }; =20 ret =3D percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL); VM_BUG_ON(ret); + 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); #ifdef CONFIG_SYSCTL register_sysctl_init("vm", mmap_table); #endif diff --git a/mm/nommu.c b/mm/nommu.c index 2b4d304c6445..2b3722266222 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -53,6 +53,65 @@ static struct kmem_cache *vm_region_jar; struct rb_root nommu_region_tree =3D RB_ROOT; DECLARE_RWSEM(nommu_region_sem); =20 +/* SLAB cache for vm_area_struct structures */ +static struct kmem_cache *vm_area_cachep; + +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; +} + +void vm_area_free(struct vm_area_struct *vma) +{ + kmem_cache_free(vm_area_cachep, 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))); + + dest->vm_region =3D src->vm_region; +} + +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); + INIT_LIST_HEAD(&new->anon_vma_chain); + + return new; +} + const struct vm_operations_struct generic_file_vm_ops =3D { }; =20 @@ -404,10 +463,18 @@ static const struct ctl_table nommu_table[] =3D { void __init mmap_init(void) { int ret; + struct kmem_cache_args args =3D { + .use_freeptr_offset =3D true, + .freeptr_offset =3D offsetof(struct vm_area_struct, vm_freeptr), + }; =20 ret =3D percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL); VM_BUG_ON(ret); vm_region_jar =3D KMEM_CACHE(vm_region, SLAB_PANIC|SLAB_ACCOUNT); + 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); register_sysctl_init("vm", nommu_table); } =20 --=20 2.49.0 From nobody Sun Feb 8 05:27:47 2026 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 94F0584D34; Thu, 24 Apr 2025 21:16:02 +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=1745529364; cv=fail; b=I3Nu380uHzJ7aw/d/KE5GIFtZPQWxszwDTW5Gi0juX3EnhfFBh5Z/lD4HcWWVr+yNLv3WehtUgHWYiYZQNc5PtI3nMLXWoHq3/7Gvn6wpMKc033QM9F0fMq6Vxr5+istafQP/konbiKA97EXuBxAT9QcO/SFTlNIdqzFrOP7XEU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745529364; c=relaxed/simple; bh=om0YK6ULXuugTQuxY6gGES4mTlXySe8kmyxt9q0+1mM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=gIJlLm8DLLs5dvJ+re6imo1v6tvF50sCGZ7D38NJ3vdUR63MeIeL7/Z0hM88W4YXOkBu45jPan8WjGCePdGOnmrZJXU+A65tO/4XtqAbj6zvmVwQ3Z09HPsZq+BGOG/NtLcsHUeoqCvncmNwl+df3nuRGP8ffx/ZDhTEM/x0aT0= 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=ikid5Ntf; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Fydk75tB; 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="ikid5Ntf"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Fydk75tB" Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53OKvK8W015653; Thu, 24 Apr 2025 21:15:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=WsgagZrdIqTW34FFqI3g0y7LU3FlT1xris5bENdkJ7w=; b= ikid5NtfVcFhFOwvrQU9jf/gJG6wfLJpJ8x6x7fEdaOK0VUlOBJ3+HIgssO7RvU3 tT8qsLpd8Ai77DUA5ss3pmDm71Rc6zs3FYGbE7Xa1b7JBQSTLOJd4hRz3LFooEEj oLseYm0fILFCdGWM3jWkVjPzsImntjdFpUSrW/7+XLiomGeCFKiOhnMdH7owgNjR Ar60FHedRSvolzuoRSc8HYlYnONKlW8JCn4y55xVs32fjQShbyaMlG0ho/uNMi9P DpvQkn41iFONfbDd3Zkw1C3h0ugNnmZb/fFvEuIdjz733E8Hci26p6wPF4meHADQ F2xFBAk80sfvPRBp3SYdKQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 467vsg815w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:48 +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 53OKp9eB031703; Thu, 24 Apr 2025 21:15:47 GMT Received: from nam10-bn7-obe.outbound.protection.outlook.com (mail-bn7nam10lp2048.outbound.protection.outlook.com [104.47.70.48]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 467gfrxs02-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:47 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TawdrTj1iqcGWBms7Z+Qex7kgVVdQR/2VSJ1vU6bHuTIgW99v1EwWbzPc3WxRjydRpBnrSjaRKWY1ceQ9s0zChCZ8KDv+EbxT16dKrXxSXNDpLWgaPIKK/uYap27x8TSbK8VKVZ8d1S7OPo1VmYrSEW3YPN2xD++ShPR8R2J5SFnk3LKNyVf7O+VgJERzVxeCvxE6Z+Wtk6TyKiXqtLpq4nxvZwTvJyJdKxEt5IsmKJFCFuxp+sfUhhI4+/fAz5t8LGDNShUgxPyRtzFbPZpJ4EcgTo23kgv+sgdS5ovf+Wv+LFz4gOzcxBY72Hu06QrFEGrULUQa4z+D9K/6zNbdg== 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=WsgagZrdIqTW34FFqI3g0y7LU3FlT1xris5bENdkJ7w=; b=EOgbF+IbJdDuBq7qq36uXkW6T5/Cmkise0JEZeIWpJj8QRmxc89iPZzJtuL14mQSjpjCVAEDW+qt+IENu7/rxENFa2NWy7DcCHksSCF5ItMe2ri6jNA1DlRB04SwYnh5qFy+TjdKoZr7Ps+LdvKOXAywFZlo/GiTlJtbB1aPsQvT/w/ReoGIkAvzhactv6zgTNlUBYRj5SlDD1oGskDndw8hMGTKR+hpehHRdKH/oNo4Eluc6u9xaYoi0276jZ32Y9f6aQwgW03UNWJstnfU6FsVZ4RJXHA2b6gATOOcS0dLa+L4CXnmBpc/yJG3yKyNX+i8IgqlHhO4S0fx66xuBw== 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=WsgagZrdIqTW34FFqI3g0y7LU3FlT1xris5bENdkJ7w=; b=Fydk75tBoaBmsdQacd1u/AM33r6w0FtklU4cf4UGE4PnQLqcn1NMb05mEPs6yba4u6x0GLEkH0r5P1U5qkYNQYKyPs7zOgmZlDl2Ne8g0/Ct2NIO9eC9AI0x8+Z3OFwJ8ERri0q9Q3+aJWKNGzsBjbOpqS8IQ8tKhsgfH1P+wgM= Received: from BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) by PH7PR10MB6225.namprd10.prod.outlook.com (2603:10b6:510:1f2::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.40; Thu, 24 Apr 2025 21:15:45 +0000 Received: from BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582]) by BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582%3]) with mapi id 15.20.8678.025; Thu, 24 Apr 2025 21:15:45 +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 3/4] mm: move dup_mmap() to mm Date: Thu, 24 Apr 2025 22:15:28 +0100 Message-ID: <4ee8edd6e54445b8af6077e6961543df6a639418.1745528282.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0395.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18f::22) To BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) 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: BL4PR10MB8229:EE_|PH7PR10MB6225:EE_ X-MS-Office365-Filtering-Correlation-Id: c191d62b-ca6d-4718-83f0-08dd83752d52 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?F/SlhA30JC+yhAjz2XwZLnT9XfkVA2Mxcb002epqWmRi/lA8olP2LZP/PKoL?= =?us-ascii?Q?Ryy+lj++q5kmuLELDJ/l/+V4Lb/0PbPsmDQiPKACUsM75cYBdV000BHXjh/6?= =?us-ascii?Q?X+QhVqlKuXuj+ALl7VKAVhJI8C+oo8W0WGWL3JUKdintSwHQWdokmvzp6Tq1?= =?us-ascii?Q?bGo2fmywESyv9Foe+VI4ZXChqHo9H+xJHjtsiHmRr5Mq63lW2raiSHW5ZZYc?= =?us-ascii?Q?O5GAwNSMZM5mZz/JXGBeIaq3Yy0kVAuqCFLzz0lvr2VHcuOSIroGfM2wYv6J?= =?us-ascii?Q?8a2Bu7WEPNmDEMmRT5T9uLd62oRZqKJ799E4V3aOplGYg895+b/ax3jsdiK0?= =?us-ascii?Q?CbaDdcF6W8Mqq0rDNXuJaKqOkIO9QyM/h3wbGtMYG414K8YykBdhp6cSzz1K?= =?us-ascii?Q?w1ifwtDfbxRE3KyuM3Q/hm39CIsxQZjcSMoul+WVnoAoUuN0smkL1JcPOq/d?= =?us-ascii?Q?aFu/5f658ywVtz7ombD6ezJbAKv5/RooPh2NzTqUEmFM17f3fR67DKv3i0j0?= =?us-ascii?Q?B8DjymLAKa1jbqNE0B8as7rMb8H0e3FV9LW58/PPAVi1zxMt1Ey6ddmE/lUU?= =?us-ascii?Q?p2REeJTCmrRClM5Ft+SUQR/XjxZG97u7h05TQvyCY4HULe2tpt8XmQEOgb/u?= =?us-ascii?Q?V3n7lLxvCl7Iqq/RzNApw2MInU6ZkNzPLGbfwsbV/QGmZSCXDd8PwziqNf1l?= =?us-ascii?Q?clvcOWPwsnnV17tV+A/QKJ8k1CW7PLJe9vyE/I6HpdsO6SpQEtIcS6i51hNN?= =?us-ascii?Q?33qFAJIB9IGxYgrVFy6+pf6Zc2k6oBTOMjzzCHDNNpUtrzaAtRUo4krPmq0Q?= =?us-ascii?Q?sg+TKSP304JT0XYx7Va0whC+N1vyKbkjBqa1uC+A+NT7m/a6582J3FWAVPvI?= =?us-ascii?Q?Waoms8/+YY1ppW+xiVNymGBOOOLRStIQ7pb1FYPWlzfwTrwF8bwGM8IgccSP?= =?us-ascii?Q?OPkAJ0LwHNtF6PVJMhgpVx8I68gujRbx2WayS95HI23+lL6YwBRVutN5scFu?= =?us-ascii?Q?HG9/VmMGMC+mRcGOg1IqsObZYi+C7BW03n9NH03xOa+HnW83wtgmi63CiHoy?= =?us-ascii?Q?mB9mkaGNqStf4qv57du4txNNRmdgllS1djjMOSmbT6D6OqZscTCTU6aEP3Ri?= =?us-ascii?Q?R5P777VpSM/ye6BezCy/0sjenGPLG4DyBR36uS5fjsaRbbsMB+Fbw5zZNkfi?= =?us-ascii?Q?PHNRtqLcykRVchxs/9wMt86kk9JigoaTfYvGTFgNaHyMjy/wxdjmXqwW0s4z?= =?us-ascii?Q?r17H6mzPgjZyaP9qc8DfxVSJq8fuqnH9intLB+DSTD0cUcmqNP8Qpps8iG/9?= =?us-ascii?Q?bAImAGqntunGtSs8ZuPfvDDtymIAMfrW0ZP/URj5Xq8juXC/Uiyc5laRcC7l?= =?us-ascii?Q?6L68hqKpVZEykWy6SxkG5pRdeMyrxdQpOGMZ8YhzRKhNETZDAg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL4PR10MB8229.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?IvRGCwZ6X44rJHkirNBEuFwhQUJGMvtGz2mlvR9FKi+ahuAzzUL+yFLsVGf6?= =?us-ascii?Q?MEFBJJkVJmyd0UvaRKXw191geCmT9RTwa1JNdzbKyTusDFtpSf+xpp0hAKb+?= =?us-ascii?Q?D8IjYVQGtF7+v5af/3c0zSlBiS8f8CQX3k7YCkScJhWaSiOCaghFxL7Gp3PM?= =?us-ascii?Q?umyFuBI0qYOvuGu2enrBqBgIIy9nbKenqgDdglY5zJVfpZ6gZ5v64NDToHR4?= =?us-ascii?Q?zWlPnfKBsHFs982YjXq39QSNvV+giJAY0lr6ZxWds2tnq0zSh/fK3P4N1kQK?= =?us-ascii?Q?43+dgZGIPAyENAKCIt6HkpHsVaBAfoVae6SKfsoKb/nq1arlDek75kaLNiOS?= =?us-ascii?Q?u1OFLB6/DVPtLRdWkoriNkvqFnKe5/xDJ4gTpKaZeZDxCd/gcghW79ktijgB?= =?us-ascii?Q?lbb1o/jRp4YwyNWv+6IQXKlhpTDLSXccxR7U2HqjQ14Kp4KgLR37GEoXvRaH?= =?us-ascii?Q?ziQDycvGwyvl9GbWUGDI7cgTC3DHja/wGaThTobXEA6TCrqKhX6nvaBoAAA/?= =?us-ascii?Q?/svz0Jz8PI9jEEyDqf8CPEvOrffuNmXqFBc8A7QIMa7hcQVqn2urTQHZaWeG?= =?us-ascii?Q?snu9MIxmnUA54dJA9I8pbkEUHEvzypS9PjFELbZlMYTLo1Tz90Xb0LnX6O5j?= =?us-ascii?Q?VqRHdV+9vDpObAsftGzQtava9V/lceMvDvPTWgouLmgwpdPgCCMiBqQP0XYh?= =?us-ascii?Q?GlBgTvo7iPFPwgWNoQ9OeOgi3kpfhcBASsEYtxih5h32Kk30uTpPyOQrcSra?= =?us-ascii?Q?V3SeuyryH5hs99O1l5TbPeiSFKAO9x+cTBjw74nuWl8kHxYt1EeGkJAf0uXi?= =?us-ascii?Q?X2V+8rlOHZPMj2lcff7kVB9bBVFbtnlZYvcL6QuoTjgjQ1E1cuYp67/ECfBN?= =?us-ascii?Q?1RkOsYHGhpbhQQ3oyVH4gtROApbkzYB6ogiWmUET+c5KAlRCsQyvo46gF2wm?= =?us-ascii?Q?Tp7iM62VTIrEL1KW8t7pp2TGeG76pm0yF9mFUBDCckuoNUk+W8ix4Q13xqyT?= =?us-ascii?Q?IV1AkdKJcw08x7VsgLrVu8aWyrCqoWO7dsMutsyWQDuBRxWRC7uXsNmlO6b4?= =?us-ascii?Q?pfUO5BclxHDQ5dLmcXEEihIJOAScd1fQbIZSCsIhGubOEB73LticX8sHtdBI?= =?us-ascii?Q?z4GR4+ccVDC/chSxoFNp17J+Mgy3Z/LxHQMHjLnwBEojgKN5pOUSj47SqTfp?= =?us-ascii?Q?CoRCiSRC9sruJaTBkK3xPLtpmwbLY851gPm5l/MZCGPN4gQUY9OIwSqzXL5p?= =?us-ascii?Q?QKa5/lnBajsP8GtscSAGs03hb1rnBFcAtRuHk+7cd/sldFTAj1eXTxQvdutE?= =?us-ascii?Q?B+L1l8gZqpPOMpC+MrhAH0HWNh/MqKhaAaT1HxQJPZEBXXI9oli8UlHhaSV+?= =?us-ascii?Q?bIkO1x8wRmcn0faWlArwQCf4MXfIeDUclS77yOAJEgsnH+mD4KtCb9dfEv3m?= =?us-ascii?Q?xQSSCtI9/NH5tY4dJbzef1nQENEHJnG010vW8OV22+g7H/rqZMtDi1Dd4KtF?= =?us-ascii?Q?XZ0HfuXwLaPGLThH/CpNXcxNVfThkdO1eJjTfCyV1gOp3Uks+kuId1qk4yti?= =?us-ascii?Q?Q7E6RR/QQV0IECtvK0kqfGYKQjIfy/nN0JBcKaz/CADhhCwigRPHakMFxVrO?= =?us-ascii?Q?Hw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: JDi2SAmfSNCucU/iQie0WHi6Ro4QvLGqaeCB31J1ZQRBlvFPdkr/gGYEuZz94/6exwzjrvOAkIfvIzC17wGyTPS/n434zdikncYnl63ORV7NXF4/dq71zYPL/ajrTPhhisIhWkOWYRgwE1xmG2ckr63IFNHZ7GCZkPT3RsAaEqTuR2sO7Tg8AiXZtpc46y4PcGs2Mlct7uUbDEyFOPHdfrHZ7q9w2RBrRcaHQRwNJhOONE3JoqGHEVhRv1ua5gzYUCJLsEt+rEHt43GI0fFYgg4cNoEg6mXFKJwE/uOW6AWdU6sNPDkReYjrgdhoXsgP4ma4YvwH0im1eHsH4RmvI0xybMORyn4GvHR5wUSbT3gXPhkzsbChsoWNJRnTmEovv79Wfvnm6OSP2WYQIggKh0jxt3XG4F7r45er3d7b796p1zjHffMg1oxZ/+dPb4Ud02HmJQMTjY+sRcZpZpaCLTPBcstQEO5BGHJkrmgQsFd+uh7bkLfZXNYSrw26nyd/bwU38qdL3pJEJ4JhFs1gfq/G+lVTXMSIc2OLmkWEi2iHigJ03eK8BFNBoIS6jYfklXLzYpiuDOfJAs5J50w1dLNU9Y3HTiPy7AWWUdmcrvg= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c191d62b-ca6d-4718-83f0-08dd83752d52 X-MS-Exchange-CrossTenant-AuthSource: BL4PR10MB8229.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2025 21:15:45.3102 (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: ZfQDkqg+AnB/2rWqUVLJU/VP82phh66Q76MqKKImRgfSotLMSBL2m1GFEOpyw7MXarTyOUe+j8DEBuluM74zgOArgEu0Ip8N8Uxob9AET1s= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB6225 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-24_09,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-2504240149 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI0MDE0OSBTYWx0ZWRfXxW0BVxbpq0e2 7EjzEpKnF1Yh45WwEOlTGstf9zkGilCGb5FLWNoXUDRbJP/UnLD+NJpjTJ849sgv8KyJyYzIMFC Kk6mYomcfWE/fiW2f/FDysa+4hRoGzO2R3FGWqRjBVPeo8AV2XYaTrLm1aHdqVmYTiJOTcOh6ep VyfK9alwawuQ40MrloG5T1GBTC3iJ2pKTfu+yH6OgkO36mRqJvbAxELrqtccunmv9hOY6wRBvJ+ GE3LHW76UF6CPfD2xkrlKCk30Uf9mnBbXcz2iCkAlrKCwizoZWUFkFiUlFg9gc1M/0GID/1f3bo LB+DZYoiDWNyLwnDWTW3ptvCckf1Rw+nXgnw8lbv732eHtlyz112tt+rjzGYx/sRVM+u2Bud+qr zLgJ3ykr X-Proofpoint-GUID: UsUNTBojG4-ctcAob9amp4axOg_RJJtZ X-Proofpoint-ORIG-GUID: UsUNTBojG4-ctcAob9amp4axOg_RJJtZ 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. Suggested-by: Pedro Falcato Signed-off-by: Lorenzo Stoakes 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 ebddc51624ec..9e4616dacd82 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 @@ -510,7 +513,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 @@ -525,183 +528,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); @@ -715,13 +541,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 fbddcd082a93..31d2aa690fcc 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1955,7 +1955,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 @@ -1999,10 +1998,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 2b3722266222..79a6b0460622 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -1941,3 +1941,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 Sun Feb 8 05:27:47 2026 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 062F428D850; Thu, 24 Apr 2025 21:16:05 +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=1745529369; cv=fail; b=hZlfxiHF/n4lQR86rJrphUIJv5oPF0HIfwSzVrFghaXQvit2JLZZgYD5lvTK0EBZNmDEs9xx7gsHVhMRkwrHPgbpJ/YLhds1AmH6Sq+/MwQ8n1ikletVL1b1iy0RLW6mFgTPf+uEyyk7SecC592CPYxfZWQL06gUwGRDldz6Hs8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745529369; c=relaxed/simple; bh=foki663qi9ihuyciolzzihuPRgNxLl8dCa5F8CjO8Yg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=uTHjnikWFsca68eKCBidxCirL9B1H/RQEh+KGh9v7+Nr/+pnOfQRfZ6qfjC84JvX+LL3rnU31Bm8tAydmdFsoB8OleAlGhIWFGJrFgVpKUE+u/QfwAtEhTKkADyZnAFE10+T0BT8cZvyfQJ9OBekY/OkPOsywxKtdM4CizMKl/I= 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=TQwBvg3O; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=LRF+6UMp; 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="TQwBvg3O"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="LRF+6UMp" Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53OKl165013425; Thu, 24 Apr 2025 21:15:51 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=IEiaYndK23eOuuImiTFANnKez1X3qLslCdnygODfcPc=; b= TQwBvg3Om/WXbCeCfz3AZlrng+Yf2yXVdyU/lDgf1mMLpAhXjHDEIuuyMBSmRrDg L8wxnrSk1m/63eXqSlCPO4fWi3KQ9IHVf0WbgABxBHCWkJ+GYZj52fDpVHzvZ/dx D4yGNI5DpE1EMHQsncVAoBkyQWhoCcfXFG19K+6T3+2YRrC/OKHMOdj7cDvL3W// CjdjrTnN+fbpK+1CwBTZubFOLj/ffquMfqb5ZzMk779AC8XE4rUtkj5U2hzUSH7E z9oCMldvlUqwei813DPQJEVDwZarkzVagq6q/03ycNZ6GNiahha1Ay6mjmtzwLQT pPTTnTUzjf92n9uFb2MTsQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 467vmur1v3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:50 +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 53OKrY4t031643; Thu, 24 Apr 2025 21:15:50 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10lp2046.outbound.protection.outlook.com [104.47.55.46]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 467gfrxs0u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 24 Apr 2025 21:15:50 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tF6wNk4P+iRF+QHP10U/4F0TslzD5fD1ZUG9/Edoi9O2OEEpDfBRqQcCXbLUt/DyPt2Ik5Jx9HIIwtr7goYCUOLBf7dSIR4f9Tui+2Fq2Wt0M/Gj3UrPseG0UagG3g5ADIALfcUs6fOxc3e7K/uDTReVZWim1jZuxahg9MXoDVJMAVc1gqdicLn1IdzV2Dk0ajBLVdN6trnUKXPRpN8cFjo9VP7H+eN+G/3Pc/RQ9As4JAW1wFaui46z218KoR/Tsj9mgpFYbwWM5URT1nF1W7R7szklheaooeEZ2pGjvkikxngwu8amwwVQTB63UyYA4Wh3HEbBdKsAmgc4E/SyaA== 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=IEiaYndK23eOuuImiTFANnKez1X3qLslCdnygODfcPc=; b=bJyo8lrLZjf9uTg//P9fy4qNJ0XSMHrmvXaqVkwYapNHOt77m2bwYjhJcR/x9LFE/Ap0nFPswghUlnuu7aDHTBLSfPxxVKbU+Qpt/M+w1MnDIiNSjYl6xHwOHzk/lhPvLonIsCKauoro44Tssk/nVyH5CKB6P6GOevyC1BCWy9bpEw//MZqWE/93et0SH0ZdHK5NffEobo2BdK+yeMQDyrDg1zadrPCCS7IdOgk1dgzWMXTDCJbCbZhbjBwoKYOCVkuHUoMW02abfww1yk7AIAVFanmZ1EdRXyyddrpou9w7+BM3MTjxyypE/Lv52LW1WPV4R4jY1c75XMJDIlSKkw== 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=IEiaYndK23eOuuImiTFANnKez1X3qLslCdnygODfcPc=; b=LRF+6UMpMfAv7H5ZWaGQZ8vGu+McjQknA96acBPtyYiQxHURBWJ8JaS4nfW2/UxE0jLa7djomiT8WUBbrVUXzmDikl/Is9jIrvNsfeeBeP6Zp2jjYHKfpzqgNjdISB2ZkXk76qxrve8MGrxUA2C20rCJczqt7RFetkqSVhAwOFQ= Received: from BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) by PH7PR10MB6225.namprd10.prod.outlook.com (2603:10b6:510:1f2::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.40; Thu, 24 Apr 2025 21:15:47 +0000 Received: from BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582]) by BL4PR10MB8229.namprd10.prod.outlook.com ([fe80::552b:16d2:af:c582%3]) with mapi id 15.20.8678.025; Thu, 24 Apr 2025 21:15:47 +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 4/4] mm: move vm_area_alloc,dup,free() functions to vma.c Date: Thu, 24 Apr 2025 22:15:29 +0100 Message-ID: <2c0036a3678d9cf55045cd215e9959aa92e32cfc.1745528282.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0323.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a4::23) To BL4PR10MB8229.namprd10.prod.outlook.com (2603:10b6:208:4e6::14) 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: BL4PR10MB8229:EE_|PH7PR10MB6225:EE_ X-MS-Office365-Filtering-Correlation-Id: 0f966e34-42f6-45e7-d7c0-08dd83752e7b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|376014|7416014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?vZA07GfagvkVb8dF4oVndZ/ZFlnX/EsmleiBsUuSzUBpOUt35TGE1pmH4Pdu?= =?us-ascii?Q?PXVglUhkersoqSt9mKTbHhYRqvqMKJxtcMrfyBeOG1Y/4FnzIp5YrW0NscnJ?= =?us-ascii?Q?Q35j7fSzm9VY52ROfv11QLerIkVVvanOV8ip7FA2G6xiAcV/fkhbZaQgizDB?= =?us-ascii?Q?iwrM3LC7GwREep/y2AMPgCMG6jzDBGCClzYb6fMumFBGvab0GT8xT287Acfo?= =?us-ascii?Q?baVzjO0SPzdgJTlDltVl9cDj0oOCvefSUIQFhqVNxiFxvczuWW8cTCdMCiuG?= =?us-ascii?Q?dbu+jqAO1r+o4fGCH9/r92OZlUZPlRaPfcsc4szTO0ndPbvOBBpmuwJgPf3I?= =?us-ascii?Q?MRkndpItBFzso+4BUPhcgsxA7lnUjsYPPZToPB3XKmyz227aszm2jV0HXgoQ?= =?us-ascii?Q?RBPm25k8ppn6jcTBqNwKRCYsVnSYZn2coOgVzNquHwKnIAzRNHMv1rZyVfwv?= =?us-ascii?Q?cDStJtPEn4809vtTskid4YBUhyT9Cx3RPeS1CMnzX4vhApovd9FFbgxYb9hE?= =?us-ascii?Q?qhhHQmpgBUdV9bOZnsAul6T33Nv1GpSD5E7qQ+7bXgOTq1Xdw8KeQ8Kh99f2?= =?us-ascii?Q?MOUWIyVBB4dijuIyze5LSy12VPYJJDd797wHmmAtZeJNtrPmf4+wFS0wOZ38?= =?us-ascii?Q?u7wrYfs+qzF5LSW1k/cXc1Bhr7rAMhUUuLH6/BmYUXGybDILHnFes97m7Oef?= =?us-ascii?Q?LvN0U8uYIWlAJnxVRydSgxOsa6LzhmM6M10SAJ0gY8fqaCQ4yec5BTTN0c6K?= =?us-ascii?Q?KwUqCCb0xEp6X6GVHqQQ+alQDw9AwOg1jolnoKB0slGOQfROhUnXL4dLhWV5?= =?us-ascii?Q?UcPcZMdL1ddBMU8dFaWQRN9iaqEaH5PnpQYvd75nCI6vVNg7pEh0OFoqnqd7?= =?us-ascii?Q?tSrb0q4ysROO46KO/YbI4/0RFdtcX66unJPnrMqZFWGq0QRjY0lcSYtIOG2t?= =?us-ascii?Q?vnL3b54rrEdy+uBdK8Ta6kFxm0g9PdhfofdTiVuwYQ7FRDqdHM8+NQ19qagB?= =?us-ascii?Q?mB1JoIgr/uKhviNp4LBFdrZ6cJjmGNxi6B+xPc7fRbRB3VZLg4/FxoeOme0D?= =?us-ascii?Q?AY+kBAeDBSQolucOg5DSI3qYqyO0tKKN0OXOboDWofUZBvvpVwo29Z8H0kVq?= =?us-ascii?Q?rhgqVLH6vaAmzTBgJP4qIDa7uIalvPiLgtNXl2EmzZbTM6lOOCuK0w3E5SJq?= =?us-ascii?Q?TvIqFbfoJ4iDC+RqY8J3d5aFaHvUUIU+TpY2tYzkiCkCryfj6Ql2+64b99JI?= =?us-ascii?Q?O/DTZVbW52PaO2X9LW4+aCctZi8uGllIdryhVRoM/zsvi+oYkacad6cSVI7T?= =?us-ascii?Q?WZLrtVEVaE52GUe4757XGxvS9ngyjqQMr5foQHp56pk5IuyBD7vb9t1aVQ0n?= =?us-ascii?Q?ol86xXcLHdM1T+tarhu3oIYGhQxTUxXBNNiUAlZeQ0I6N4O+TMRHaAv15Ksc?= =?us-ascii?Q?OfYldKtCM+4=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL4PR10MB8229.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(376014)(7416014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?HHkSjx1vDrxN5oqWR5x4NObE0LgyZ562QXC849RhXauWOvQ9NDvnXcUk9vqa?= =?us-ascii?Q?SLR1JFExJ8BaBLdZ38k2clAauBn1aGjkuXhOeLNkPHqMxP8xuNThCvwMaaZr?= =?us-ascii?Q?u6b6evBLJrEn3njRH00VqFJPcoaEyXn9IjWXIbkI+2kLYRATgESMpY8yeroH?= =?us-ascii?Q?zdCN/nvAhsgiYa5JxZAswYdmh7UkWa/7huc5M4vb4gQGZl9z3qsRMd8cydsm?= =?us-ascii?Q?SvftKAKPAqxcXNhqRTxTP5qZLYi9XpzKXu+XLbav8ZwX34wqh4I6L7JBQ1VF?= =?us-ascii?Q?nRC3shP2CoB7IJ2gYtDICanXDDau/e7ktRLO13s6Db2ZCucyMijexxke11Oe?= =?us-ascii?Q?ayZiaxChsIEPbQtrgCraJqhuJcqeGUdnOH3bEMnQ2tHNV5lBu0OFvPHUgY/T?= =?us-ascii?Q?N+FU9FxFam30ToYs57gVdBl5zSr+IPl7eWDWQEVnCplWgo/BufeJgnfeLffd?= =?us-ascii?Q?jvVZ6DpPMdqxCtEh0HqKfwJLoYaauIn8MOe0llotyO0gOy1dJ5+vfg/1AUtd?= =?us-ascii?Q?0PF+L4jkmcyfgZEGHrrnlEDxuCBekyv8pSuB/fPf77E9cfYtwHaIxLG1txaD?= =?us-ascii?Q?qkzTxFiUzYI1TxwT1uKt1C/3PeBFvGF4HuGRKx8jREaFdsJiV+1GqDLEh+B6?= =?us-ascii?Q?YD7uQ7f7xmWH2j64A7P1N9ddYINn62fgJ+yS5wQpb2uO9C3cgLguFAMBFGgB?= =?us-ascii?Q?HTHKsBUiiNARVpb03rJSxmbw4InnSIMKn8R2WEojT9za9jvxr28wme02qZJC?= =?us-ascii?Q?CtmE+hmROn1ZotDnNIfpAp40vE6G71tPEoIQq3ntM/DsjTp6v/JlOwHLZLy9?= =?us-ascii?Q?cTK40kupkEKE1lVDNEsWb/A4DxBCPMLzJgE9WwShVy0R1YY3k0hnNhM3BRmB?= =?us-ascii?Q?v3UAd4GBBTfONbswO2W31ISdl3AbklTdsbVeS18dRjISmnaidgizZvtNy9KY?= =?us-ascii?Q?IW2TrT1z1QN75QtKT+OF9aAwYhgR7yMUhvIp3zkOuW2iCDIFhT9pw6oH74l4?= =?us-ascii?Q?eUmSBpoE/yGjHb5AUUGT+/dTATiP0eal1yG2L/U1Jt4O3iclz2ofyOo9mbQd?= =?us-ascii?Q?h3dxoO13+iU36w7xJ95I0fKu4hcrOZB8It6ude8fF/R203icK4yZs0SrDAXM?= =?us-ascii?Q?30GR5bRaIGnQKUqMD2PLM9M2YQLmlk+QWP8jQ+j3ExMVuMeKmB5GEI76vLCg?= =?us-ascii?Q?b8XHUMJQHyQUPCK6W2YaF41dJusG0RWGYkgEJ3Rj1Mk+y8w9tV+B2bx2+ILJ?= =?us-ascii?Q?Gc5IZl1N5RbjSfj1SA/7SLhM6zNZ84T6W947dE/+hgRBlvD8fX68kFNq9+v9?= =?us-ascii?Q?BtW1VdNda4lQnmRRWmWS9fwtG1kmsXzlnRjsztNv4aQAY5rQfxEtNtbxWuV7?= =?us-ascii?Q?Q7HrdSkTY/5rJs5ttDPt1tnYV8iHUJd746xJzjF3IEpBVY86NJuu7Mj+800g?= =?us-ascii?Q?3Q6iD0ykJJkm+ET0HsBmIH2XcjTaj5GFCxX6/g8K5bRCF4DQKQrjduWcyzsz?= =?us-ascii?Q?oSH4cIGeKzwjud6hkHq5OopbUIumn0Mi5Po+5h1E7y7BxzfaI7628uARi4U8?= =?us-ascii?Q?Rm9im9LzlsJP/3St/G1CgGUIQR/iMc6iHu7U91NPUuVhladbqUEH6H8JwLqx?= =?us-ascii?Q?3w=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: z6RhjWI5FuNLYdUYvF3tmoPndAyEoOwcluhrKjFbOrD/OJI3LzP9/xlHy98FVQLJmyVStBZzU+95rKNocMZIucUi4OSrUAtsvMPEnNxLmda9X3jy8uUaJXHJ5HKNeJedl4cuwVuqReREjrmXtWitPwbnECFIf25AAvqgabjwFA0nWfzW6fW3qc3vb+/oBBHfJMuxo/V2ZoPKxVCClp17t7E7hqB5QiXOEBseQHM0/fpC42jJM0qkTeJe+M/8hfDuZSae10EwI5IHry3hbvH7lmVL9IPat+2Rdm5rArAxop8QalFSZTQ3tCC6pKci0nf2kSG6kVKb1vGdCzeDutTDt558wxTFJxMLZUWXKnM1uMR46rg7rCuClcyKvwI9LRXUo2mcgJClMJU94KYryEHuE+I1HvemHvk/73lGgKigDFx0hAHio1Jfr7sfP2hIVWMafLhKDjROGd12eEeWXFJTq6A38AXZdoDsM+mgQGFeMvSvw0ixrvU++8auz4IC30rnodcNYwlrjOUd5Gu2Qn9D19Q0ZmuNbJnv4Gys2I98mrCBdqSCyPPtdWV0vA93ZjTNeUkkISJnR9lfo2DEhkDihvt1kppC0/DRTds5mI7NzSo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0f966e34-42f6-45e7-d7c0-08dd83752e7b X-MS-Exchange-CrossTenant-AuthSource: BL4PR10MB8229.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Apr 2025 21:15:47.2380 (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: Z4GsYYy4+tqtdNc7tXL12thsE7RTkciCnWM5/7SxU98M77dejZNGrpEHNuNwrm6a1zRSYS1qOSDk1j61nbjUazYnjB4Quc1KVeIT83MpGH0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB6225 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-24_09,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-2504240149 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNDI0MDE0OSBTYWx0ZWRfX+/wB73BgG4jr L6yIErx8x5/TcJcXVaCxpx6l5nnwh1CieCrsbQfXDUxU0U2+Duj0GfWy+J3HwOmxyq0X6auVldg 7jLU0Zj7Wbm1Lj1Ow/A4mR9SUIYfDkcQm62pPxeV3KgSAGZ8Jxbct3r7miCuAzA7ptbS0JMuHgj vBv+OCRqad7wBKBKXk3YyCPVY/QvDwFYVENOHIxXT4yI43/0C/Tw6dh2S3qs9UzlBF7gfP6SFb7 hcJiwvTvL4yB/iHuml+Z99tU1GgW8L5KLmy+LY+Dz+WbfA5JlA/Gx7zjF17nfgQtV0NXJx/R0d0 e4DsS0YynRA3uu8TdUfhHtPs70jLybDH3Lyx9MV8LrhUXVQhhMuvc10jj3Uhyzp7R3BqVqktg70 pD8M46xB X-Proofpoint-ORIG-GUID: U4xk9mF44__mX5b04UXWwsfpRyyAGGpP X-Proofpoint-GUID: U4xk9mF44__mX5b04UXWwsfpRyyAGGpP Content-Type: text/plain; charset="utf-8" Place the core VMA allocation, duplication, and freeing functions in vma.c where we can isolate them to mm only providing proper encapsulation, and add have the ability to integrate userland tests. The only users of these functions are now either in mmap.c, vma.c or nommu.c, the former two not being compiled for nommu so we need not make any changes for nommu here. Update the tools/testing/vma/* testing code appropriately to keep the tests passing. Signed-off-by: Lorenzo Stoakes --- include/linux/mm.h | 13 --- mm/debug_vm_pgtable.c | 2 + mm/mmap.c | 86 +----------------- mm/nommu.c | 2 +- mm/vma.c | 89 ++++++++++++++++++ mm/vma.h | 8 ++ tools/testing/vma/vma.c | 1 + tools/testing/vma/vma_internal.h | 151 ++++++++++++++++++++++++------- 8 files changed, 221 insertions(+), 131 deletions(-) diff --git a/include/linux/mm.h b/include/linux/mm.h index fa84e59a99bb..683df06e4a18 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -222,19 +222,6 @@ static inline struct folio *lru_to_folio(struct list_h= ead *head) void setup_initial_init_mm(void *start_code, void *end_code, void *end_data, void *brk); =20 -/* - * Linux kernel virtual memory manager primitives. - * The idea being to have a "virtual" mm in the same way - * we have a virtual fs - giving a cleaner interface to the - * mm details, and allowing different kinds of memory mappings - * (from shared memory to executable loading to arbitrary - * mmap() functions). - */ - -struct vm_area_struct *vm_area_alloc(struct mm_struct *); -struct vm_area_struct *vm_area_dup(struct vm_area_struct *); -void vm_area_free(struct vm_area_struct *); - #ifndef CONFIG_MMU extern struct rb_root nommu_region_tree; extern struct rw_semaphore nommu_region_sem; diff --git a/mm/debug_vm_pgtable.c b/mm/debug_vm_pgtable.c index 7731b238b534..556c3f204d1b 100644 --- a/mm/debug_vm_pgtable.c +++ b/mm/debug_vm_pgtable.c @@ -36,6 +36,8 @@ #include #include =20 +#include "vma.h" + /* * Please refer Documentation/mm/arch_pgtable_helpers.rst for the semantics * expectations that are being validated here. All future changes in here diff --git a/mm/mmap.c b/mm/mmap.c index 31d2aa690fcc..0059a791cb7d 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -77,82 +77,6 @@ int mmap_rnd_compat_bits __read_mostly =3D CONFIG_ARCH_M= MAP_RND_COMPAT_BITS; static bool ignore_rlimit_data; core_param(ignore_rlimit_data, ignore_rlimit_data, bool, 0644); =20 -/* SLAB cache for vm_area_struct structures */ -static struct kmem_cache *vm_area_cachep; - -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 -#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); -} - /* Update vma->vm_page_prot to reflect vma->vm_flags. */ void vma_set_page_prot(struct vm_area_struct *vma) { @@ -1677,17 +1601,11 @@ static const struct ctl_table mmap_table[] =3D { void __init mmap_init(void) { int ret; - struct kmem_cache_args args =3D { - .use_freeptr_offset =3D true, - .freeptr_offset =3D offsetof(struct vm_area_struct, vm_freeptr), - }; =20 ret =3D percpu_counter_init(&vm_committed_as, 0, GFP_KERNEL); VM_BUG_ON(ret); - 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); + + vma_state_init(); #ifdef CONFIG_SYSCTL register_sysctl_init("vm", mmap_table); #endif diff --git a/mm/nommu.c b/mm/nommu.c index 79a6b0460622..7d1ced10e08b 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -97,7 +97,7 @@ static void vm_area_init_from(const struct vm_area_struct= *src, dest->vm_region =3D src->vm_region; } =20 -struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig) +static 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); =20 diff --git a/mm/vma.c b/mm/vma.c index 8a6c5e835759..65507f12b8d3 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -57,6 +57,9 @@ struct mmap_state { .state =3D VMA_MERGE_START, \ } =20 +/* SLAB cache for vm_area_struct structures */ +static struct kmem_cache *vm_area_cachep; + /* * If, at any point, the VMA had unCoW'd mappings from parents, it will ma= intain * more than one anon_vma_chain connecting it to more than one anon_vma. A= merge @@ -3052,3 +3055,89 @@ int __vm_munmap(unsigned long start, size_t len, boo= l unlock) userfaultfd_unmap_complete(mm, &uf); return ret; } + +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 +#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); +} + +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); +} diff --git a/mm/vma.h b/mm/vma.h index 149926e8a6d1..be8597a85b07 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -548,4 +548,12 @@ 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 +#ifdef CONFIG_MMU +struct vm_area_struct *vm_area_alloc(struct mm_struct *); +void vm_area_free(struct vm_area_struct *); +struct vm_area_struct *vm_area_dup(struct vm_area_struct *orig); +#endif + +extern void __init vma_state_init(void); + #endif /* __MM_VMA_H */ diff --git a/tools/testing/vma/vma.c b/tools/testing/vma/vma.c index 7cfd6e31db10..9932ceb2e4b9 100644 --- a/tools/testing/vma/vma.c +++ b/tools/testing/vma/vma.c @@ -1667,6 +1667,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..fbd0412571fb 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); @@ -496,40 +559,39 @@ extern const struct vm_operations_struct vma_dummy_vm= _ops; =20 extern unsigned long rlimit(unsigned int limit); =20 -static inline void vma_init(struct vm_area_struct *vma, struct mm_struct *= mm) -{ - memset(vma, 0, sizeof(*vma)); - vma->vm_mm =3D mm; - vma->vm_ops =3D &vma_dummy_vm_ops; - INIT_LIST_HEAD(&vma->anon_vma_chain); - 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 +758,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 +1297,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