From nobody Mon Feb 9 20:37:00 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 42A071632D3 for ; Mon, 27 Jan 2025 15:51:23 +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=1737993086; cv=fail; b=LWU8OylIz5p5o4GPioJFCG7vqFmeJ93JHELDpmUmw/y16eAwNB+KzhRi0p/7Xg15FQUzfoAoylqYOrVLSw/KUXwlHw/C4YkTn+0AMUESSvlivcm7Im1F3gWoY47F+BXXiFOFDBmQ02E1oF51fJpCoCty4ZhNZErN/aaUszTI3Rg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737993086; c=relaxed/simple; bh=YGecYKdmPGz/H5Xxa7prpHZBkvzk9y7LY/wV+iVyEhY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BRoFL/z40W/i8vfubXgswcqjOQLEPgH8ORpzyCkV/rVsicrMS6w9dg/V96wnmq+SiObKf5lcbjWOJHmFATfPxqdJEfAyuwuOkxCzsahEwB11EmH9do5NyUNHPC8TvE3gUWUfQUJr/oI20GTOsku4rmqoJls2gBf/5DINKKM5LJ8= 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=mI4FqxgK; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=GpEd4AR3; 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="mI4FqxgK"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="GpEd4AR3" 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 50RFVhVg028428; Mon, 27 Jan 2025 15:51:16 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=yYt6stsxYImVpnilc4jHtHIA4DfFcWVogY7BkE17NV4=; b= mI4FqxgK8Hsd2uLXcvK1Bn2K5tmAmBmGTTgoqBaB38ZWnFY+6sCbnkygPzkzYv0G /bjcRNnOETiUm3pkQug0wtLV7O5LkYZouN0iDSR/zKt0qjj3zpgFvoRUMJKv/Ry+ 6/ImzzvxFcPUJYrCQDuwsiabqGxSyQigK/ZSZvVk9GQFppo8Y9GtP9ePlTc2SVxU OnIUoPw0SqcYlge/596Ef0GklcZl6z7ojkIbtai/JjTFWgycB1XbMJOB/iWM3Y8e 7Z4bcR6HwQyXXcHSKLZ9RBSlEU5K/xDfoB6cyFbKjDShT+C3SuMBsOCSIefJFCQc tm9HSIVsKIk3/LPCRgi7yQ== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 44ecv581ku-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 27 Jan 2025 15:51:16 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 50REwTt2035833; Mon, 27 Jan 2025 15:51:15 GMT Received: from nam02-bn1-obe.outbound.protection.outlook.com (mail-bn1nam02lp2040.outbound.protection.outlook.com [104.47.51.40]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 44cpdd4vuq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 27 Jan 2025 15:51:15 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nwOeG5lpoPaN+h0wcsD5wRN7eY99SW9EJVWfkiJxytsNEy82ogvpkNYn5W8V38R+Nx8pee+qgnHsyhqU7dgtzpID2snRZ9GBWMs1skY1tBD2wrDRJ34X3fT++Iggs3rtH9fPlM7QW3x1XOItOjvoxqgHtNelmxCFIviv1HB9zsgCW6FGE1VBEX/afywS8FYjoJpb+K0SX+uknIPd2v09dNwBZxt3sfffuIFT02Dq6fCxNQxRbhICMv/9HrBtAkOX8G05C474nvuM8YjEMfBf2qCQkujpQV3yhEwU2xCHKepdDaohyNX0zY2K5p/swdpbD0E62IPAvbPpCjA/LGbA/g== 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=yYt6stsxYImVpnilc4jHtHIA4DfFcWVogY7BkE17NV4=; b=bSPu5FLk5KEZGruOFsYjhY1qIWX1xwA7S/J54UE6jU/Zmz60O68QmQS6bPPYCLwywCZYd0H5qJVjkArg9YaWB06W95oziUZhdjxSRY3CKB1Ert0T+JfABCY/jVzvlZ874VZkQi5VSgbm4yUTT4lDEeK83jRm1aVC4eQFP3lbtb41jp/epX5Ie83OlfQwvyYsQy0ZDTVowU0zhSpFoB2jpuHtSoJAWJcDrX8PslWmcWK/8dBFYH7ZmolKPHFZGjOOUCMnvAlQa1gbT1kQU1VHa1Tn+XYlPlDn3KKO01G8Cx63KiCLKvQeEr+hI934+myXPONILoQghpwlUKocX9sRaw== 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=yYt6stsxYImVpnilc4jHtHIA4DfFcWVogY7BkE17NV4=; b=GpEd4AR38CrNFs6/q3zGc223idN8cwrlEfBbOJJLd8CU/Hu8mOzNMfMGlSfLGDM4pYLuf3WtyhPNiHdAhDxkct9S2BDh6ndy4fAOy8cPBeA8lJ2iZGpgNF32ivn4SSJomVaqTNwODGO1RFEUiVYjbvNZLC7EA7pwMd4UNT/3cNU= Received: from MN2PR10MB3374.namprd10.prod.outlook.com (2603:10b6:208:12b::29) by PH8PR10MB6339.namprd10.prod.outlook.com (2603:10b6:510:1ce::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8377.19; Mon, 27 Jan 2025 15:51:12 +0000 Received: from MN2PR10MB3374.namprd10.prod.outlook.com ([fe80::eab5:3c8c:1b35:4348]) by MN2PR10MB3374.namprd10.prod.outlook.com ([fe80::eab5:3c8c:1b35:4348%3]) with mapi id 15.20.8377.021; Mon, 27 Jan 2025 15:51:12 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: "Liam R . Howlett" , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/5] mm: make vmg->target consistent and further simplify commit_merge() Date: Mon, 27 Jan 2025 15:50:43 +0000 Message-ID: <829048d075d18dd34572f330d17af66b8cff8441.1737929364.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0191.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::19) To MN2PR10MB3374.namprd10.prod.outlook.com (2603:10b6:208:12b::29) 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: MN2PR10MB3374:EE_|PH8PR10MB6339:EE_ X-MS-Office365-Filtering-Correlation-Id: ba52fbe6-036b-46d4-f849-08dd3eea6ccc X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?wBs+8UhJaPIdRHU8PXpirdLxcrXBapCmrhu1f8yCfliuheFIDsvvqnb76ZLN?= =?us-ascii?Q?UxO5uaWHnWGyS4/LnC5vdY0XN05zFrXpMM3/00DXr5T4YXegKl7Vd+7q7a0e?= =?us-ascii?Q?GlzdPpZ2KDefOoe3elbYMuy08GZatMww53amZjs4gbo9I7w4LxioBLVCgcYD?= =?us-ascii?Q?82uYKcGydvWq67p2ZjHlDGaFMDlbbuIhk6aKJN5iMg3xWaS9o7MseRfhYf0E?= =?us-ascii?Q?Vja1C3JT+3vLRphk3XAvTNbwR9ZQ4lHnBB6NvkK6J1IbjtN1RUNkrRndewfD?= =?us-ascii?Q?1Ddb8qep4imJglF8I8XcVWAEkaoYAJ0+IKkaYq0KehM9skjqSTl4n10Ouv0h?= =?us-ascii?Q?YoBwN5MNd+4Lu8hFLBiPbPBxLj7QllzVnZSUPmlmAqubAWtYztWLBILfZtp7?= =?us-ascii?Q?6/e4xdpiLgPEAeRT0VO7BRGXFyhKd0gxN2ff2kxP/dJ5iEmG4LdSZ/osqLtD?= =?us-ascii?Q?yVALfspXPSIRU1CACAoc1P3V3+zgUt5jpiUZPlt4tsPDsYqaxj9USQoMfSwh?= =?us-ascii?Q?vYkfUF0P79cvm+mpKnOs06RD0Z9gvJvcQJMkrN/VhLwUnhOj0Erp5TeFnceQ?= =?us-ascii?Q?fR4yPKC/BopN4DoSY7rMoISVOf0sAFqm1GNoLaW7lxRNdecew7/cI/kH/KzN?= =?us-ascii?Q?jcRvg78T+4gMZrixz2KTh3FVtvEJSkPAcdmgaW/br3i5KW3aa7w/QLSiZplK?= =?us-ascii?Q?MibjmohwVObcJCNTuPpVFuOOrYhWFuKCyW4h8mPyryR1F4ToO/eZ218GtTWE?= =?us-ascii?Q?20wly/ZqMj77AE3rA4w/c1CRmhUo7L/cNUKUcBbdHcBiDs9GqQ40Qb8VkMb5?= =?us-ascii?Q?v384b2nUrb63nWi5aa1vJGTBiloC5gasRKHaDo07xpPR0trppz4PD1CAaO7j?= =?us-ascii?Q?ND+P2IQinwNclMBs7YZ/8W516saHWqz0GJGVaUpNg57Mfbw5V6XtPBUspC0v?= =?us-ascii?Q?lmP55GAECum2M9uV8AiNQiOdyErmIUOeTi4RtTItei1JGp7d5MX2Hb348GyS?= =?us-ascii?Q?LOdCvizJnI7eZM1b1GLW6QSy8K9apzCcQzNn+a2ht2h3wVjOyvF7vTOfTAPE?= =?us-ascii?Q?4rj1ctEgoYYdwvmOalXIIXg9DL+CWyk9eC23x7xnMTtZIS7pxN3gD2BPL2jp?= =?us-ascii?Q?JCBPoIR/xgPX2sbhW6qSZA6Yf4hJchjz4pjvDwSDku/2d7Dr/DL64sQIIVAl?= =?us-ascii?Q?sc4+lCdZ3253dlrgP40fY8WZIJaY928VCZQjxnDcYPF2anCA7qbk8qxV7t1V?= =?us-ascii?Q?/qZ0Yuh73g8IPv0Gic8OK6KyKCRaobeGCZdftu9QI45RHiy3lraLGrPCdJWD?= =?us-ascii?Q?RhR/dYuvGzZGOEov4LJm+GlQVZehz8/ZM1ovTpBcmsgChfuRW0Rd8wbR1VYk?= =?us-ascii?Q?4Dnojq6+2EFT6GGAi5K41NJS67R2?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:MN2PR10MB3374.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0oY/exZg46M7Pb4poOQunHp28PjOMcn3Pmj/UToIZlj7CzDXB7+NfvZxV96a?= =?us-ascii?Q?Gk4R4aM849NY0yNQ+sDcrT7vjE9xoGvabixN2JxwOkQ5wXDKYdnhpk9pDwPJ?= =?us-ascii?Q?pqKWd/9tRI73W7y2NB7oA/ZAYU2dR0YXOAnOWPdGu0ugpCwjEDWdAzqhnLsz?= =?us-ascii?Q?kCHkz/KSg7dClCJhYGsgJFHT5rqU32l/5NN4kHUJyI5qTEaPg9d7Sz30aic3?= =?us-ascii?Q?l+FchHRWubKTpPA+cohdSAOdEAG3Rwwz/8d0dZFtauzLR0jFm1qudnacwssi?= =?us-ascii?Q?9+Z5mULvVjrytmNxFYNDiJQLULxe6L9q1cUDFgTBtShS0XtAETHJD8TbiA1R?= =?us-ascii?Q?B/aBuoMvSBfUPeTnQ+WYJj3IGb2AtmTsemTmabsREDLZPvEoAxjVC17y0Jqo?= =?us-ascii?Q?8fn8B2H0Usq14R3z8oqqU+RHeZO/guercvOc/Dj4vbpqZYsm7s4hzkg3Dk+v?= =?us-ascii?Q?+q/R2VMUGgszcpqHFzhHXSOEAG/lxca3AzkWZsRx9iuyK8k4v8D5SxMb7wJ5?= =?us-ascii?Q?gAzD4YxsLXG7SmJECFkvX/KbWG7lb+0ZJ0J4mu6XxEfoYgmiqTlPhBulhN3I?= =?us-ascii?Q?j9xkNgFSXXKutzi6MSglYumT5KwskRTzyOygooVpC1VkdvCJwxvnLBWS+bkC?= =?us-ascii?Q?IOqS2T4CU1wrfYm/SQ4xH1eNKHqkR5n38SJjOhryXQt34z+VUkEIORd+dFBO?= =?us-ascii?Q?Tt0cAzzTLmCrIhn0jBusnQL2eLVH8+fRfUFzM9Ub+kKknke55w5FxpLacWYr?= =?us-ascii?Q?chw/8mCD65fFwSArKyegmYjT2aivjEcnBwRv+ZXVO7YrgSwZTyNQCIkUAqLK?= =?us-ascii?Q?0Mk2UVtLy7gLxDU/iEFS/TN61kETuaM9/IMmfbF7MGCxQZ5l59RdYbDeVJJt?= =?us-ascii?Q?7bD2f5U4AYouODiuVLHevzt1fZ+kGr1QIfb7+WM2FkmGHkliyvKQh3m6F1KI?= =?us-ascii?Q?/jFEgqzxrmvkgP+BPEwbIOg4R6u8K/Lzua4zOZSluSO8LCV2ywtgZzzDm+dR?= =?us-ascii?Q?bu3Z/DTJCKDq8QJwhGKrlZejRO+wTuTvx4tIIGhxYWAUFSCmJLlVdms0L4zY?= =?us-ascii?Q?jqMtbnPF4GVr2UcEmruHg1gj92BKJmL8FRGBSf2wlFRhlc+Afm33MWNZ2b7U?= =?us-ascii?Q?eFqjJTSF5wmz+1iOTLN+aAVyS+qdcZQDj5oc2T/sVvNR2x9+Pimrex6+HD+a?= =?us-ascii?Q?O2EeQTQ3bqtAp/YZQiW3ytSHOW91TLpQkAzc5HsK9Z8JasxlaJg5j0eFs70I?= =?us-ascii?Q?mZApx1UULaCLKfoBGMD7fQjjQKNqxC08PeODRxcidXCy4+QDWdVzdqSdtB5O?= =?us-ascii?Q?rYmlt6bKVWzMKOglsb6+07pXJN/MD6UmhQD4ZzLfisb6gr0ZRNWpalVv8Tat?= =?us-ascii?Q?mc/Gvg9Rh6NYM+VN0oSE6OR+4q60V+n7q0xhc2WuHnRVvxtJVVxNASJ9cgPH?= =?us-ascii?Q?xSQQe/WHlhkkHLqtHPw2CtmCO57vX6hgkp9/20qXP5i12++qu6QehmyM+cGd?= =?us-ascii?Q?30F1T8P1fB90o6inHckPI2DbDXPqtERiHxeEOT/YOQxv54zK5yBiC4zSlg25?= =?us-ascii?Q?DcksNcrJKKt6JRGe9jKx0+fp3QqT3/VegbADNftMztGg4nOwSpVsOeeFahja?= =?us-ascii?Q?nQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Ep61TUuYyFL1RQzXUvT/SZA5ga5qfkz+mRcJ0DFhkkuByxZyYOnLHK8S8PDl8jx/IY49qccI5+dmsGyc0Y1BHyOxbrVZ8sdbxqs7THkI+K28ng/Kc+1tbmL9Zm1AupljhoGjr5rBZ49kQ4LM4CSyRnjqWjVNvByIytA6XdPl91yOoU++c1FUrTeQJezDBVFOtoUiloovDvZaupG4+HlkvUT/8GRv/9NVvyW0aAOhmK3FtjELsdwU7C8HmkDPdBiTw7R3Dc+Tw47+fXvGgK41TkPQ7dN1wpqYy+rGq+6m0U3ndIPO9G0AdSste4VJUdL2GloSEZ/lxKygxR3LFpiMCq4KgtG0028+0vCD15q5/6K8g3EzUlo+Ab8qUWXEamXZTREZK+5CuD/8grTFLrjqriuZ+Ut6fwQGG5/H+UCTdN8DNWYgTc3UmcsJyoHWlRG7EqEki45uuehdwWdyxiv/X4rr8pnOIvGGfT7CIP3dVFgZprB7qdvYu1zUJUQGY7qiw65DibEeAupz9BRiSSve+GfX3H98vkTh1CibexsMBdWUOIymFgFde+AFR9m1kpz3C/LG1CZoj1/X7AvYTNYgOwzKL8oC+vHBm8CRPSzUSxo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: ba52fbe6-036b-46d4-f849-08dd3eea6ccc X-MS-Exchange-CrossTenant-AuthSource: MN2PR10MB3374.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2025 15:51:12.6898 (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: FG2fWeUhD7OGjQnjT8lkdFrEpkHqt78tAn+gRIlaHSDm1YiKrfUJGG2uLOu4+FkYsH9TYeXukRIiq3N5sGPrc1abxv6nxc/lNksTg/d6D+U= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR10MB6339 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-01-27_07,2025-01-27_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 bulkscore=0 phishscore=0 suspectscore=0 adultscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2411120000 definitions=main-2501270126 X-Proofpoint-ORIG-GUID: nmxaFjJfenhCpPO_-RXR807U4uOcaFYX X-Proofpoint-GUID: nmxaFjJfenhCpPO_-RXR807U4uOcaFYX Content-Type: text/plain; charset="utf-8" It is confusing for vmg->target to sometimes be the target merged VMA and in one case not. Fix this by having commit_merge() use its awareness of the __VMG_FLAG_ADJUST_NEXT_START case to know that it is manipulating a separate vma, abstracted in the 'vma' local variable. Place removal and adjust VMA determination logic into init_multi_vma_prep(), as the flags give us enough information to do so, and since this is the function that sets up the vma_prepare struct it makes sense to do so here. Doing this significantly simplifies commit_merge(), allowing us to eliminate the 'merge_target' handling, initialise the VMA iterator in a more sensible place and simply return vmg->target consistently. This also allows us to simplify setting vmg->target in vma_merge_existing_range() since we are then left only with two cases - merge left (or both) where the target is vmg->prev or merge right in which the target is vmg->next. This makes it easy for somebody reading the code to know what VMA will actually be the one returned and merged into and removes a great deal of the confusing 'adjust' nonsense. This patch has no change in functional behaviour. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- mm/vma.c | 122 ++++++++++++++++++++++++++++--------------------------- mm/vma.h | 6 +-- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/mm/vma.c b/mm/vma.c index e78d65de734b..cfcadca7b116 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -107,24 +107,41 @@ static inline bool are_anon_vmas_compatible(struct vm= _area_struct *vma1, * init_multi_vma_prep() - Initializer for struct vma_prepare * @vp: The vma_prepare struct * @vma: The vma that will be altered once locked - * @next: The next vma if it is to be adjusted - * @remove: The first vma to be removed - * @remove2: The second vma to be removed + * @vmg: The merge state that will be used to determine adjustment and VMA + * removal. */ static void init_multi_vma_prep(struct vma_prepare *vp, struct vm_area_struct *vma, - struct vm_area_struct *next, - struct vm_area_struct *remove, - struct vm_area_struct *remove2) + struct vma_merge_struct *vmg) { + struct vm_area_struct *adjust; + struct vm_area_struct **remove =3D &vp->remove; + unsigned long flags =3D vmg ? vmg->merge_flags : 0; + memset(vp, 0, sizeof(struct vma_prepare)); vp->vma =3D vma; vp->anon_vma =3D vma->anon_vma; - vp->remove =3D remove ? remove : remove2; - vp->remove2 =3D remove ? remove2 : NULL; - vp->adj_next =3D next; - if (!vp->anon_vma && next) - vp->anon_vma =3D next->anon_vma; + + if (flags & __VMG_FLAG_REMOVE_MIDDLE) { + *remove =3D vmg->middle; + remove =3D &vp->remove2; + } + if (flags & __VMG_FLAG_REMOVE_NEXT) + *remove =3D vmg->next; + + if (flags & __VMG_FLAG_ADJUST_MIDDLE_START) + adjust =3D vmg->middle; + else if (flags & __VMG_FLAG_ADJUST_NEXT_START) + adjust =3D vmg->next; + else + adjust =3D NULL; + + vp->adj_next =3D adjust; + if (!vp->anon_vma && adjust) + vp->anon_vma =3D adjust->anon_vma; + + VM_WARN_ON(vp->anon_vma && adjust && adjust->anon_vma && + vp->anon_vma !=3D adjust->anon_vma); =20 vp->file =3D vma->vm_file; if (vp->file) @@ -361,7 +378,7 @@ static void vma_complete(struct vma_prepare *vp, struct= vma_iterator *vmi, */ static void init_vma_prep(struct vma_prepare *vp, struct vm_area_struct *v= ma) { - init_multi_vma_prep(vp, vma, NULL, NULL, NULL); + init_multi_vma_prep(vp, vma, NULL); } =20 /* @@ -635,77 +652,64 @@ void validate_mm(struct mm_struct *mm) */ static struct vm_area_struct *commit_merge(struct vma_merge_struct *vmg) { - struct vm_area_struct *remove =3D NULL; - struct vm_area_struct *remove2 =3D NULL; - unsigned long flags =3D vmg->merge_flags; + struct vm_area_struct *vma; struct vma_prepare vp; - struct vm_area_struct *adjust =3D NULL; + struct vm_area_struct *adjust; long adj_start; - bool merge_target; + unsigned long flags =3D vmg->merge_flags; =20 /* * If modifying an existing VMA and we don't remove vmg->middle, then we * shrink the adjacent VMA. */ if (flags & __VMG_FLAG_ADJUST_MIDDLE_START) { + vma =3D vmg->target; adjust =3D vmg->middle; /* The POSITIVE value by which we offset vmg->middle->vm_start. */ adj_start =3D vmg->end - vmg->middle->vm_start; - merge_target =3D true; + + /* Note: vma iterator must be pointing to 'start'. */ + vma_iter_config(vmg->vmi, vmg->start, vmg->end); } else if (flags & __VMG_FLAG_ADJUST_NEXT_START) { + /* + * In this case alone, the VMA we manipulate is vmg->middle, but + * we ultimately return vmg->next. + */ + vma =3D vmg->middle; adjust =3D vmg->next; /* The NEGATIVE value by which we offset vmg->next->vm_start. */ adj_start =3D -(vmg->middle->vm_end - vmg->end); - /* - * In all cases but this - merge right, shrink next - we write - * vmg->target to the maple tree and return this as the merged VMA. - */ - merge_target =3D false; + + vma_iter_config(vmg->vmi, vmg->next->vm_start + adj_start, + vmg->next->vm_end); } else { + vma =3D vmg->target; adjust =3D NULL; adj_start =3D 0; - merge_target =3D true; - } - - if (flags & __VMG_FLAG_REMOVE_MIDDLE) - remove =3D vmg->middle; - if (vmg->merge_flags & __VMG_FLAG_REMOVE_NEXT) - remove2 =3D vmg->next; - - init_multi_vma_prep(&vp, vmg->target, adjust, remove, remove2); - - VM_WARN_ON(vp.anon_vma && adjust && adjust->anon_vma && - vp.anon_vma !=3D adjust->anon_vma); =20 - if (merge_target) { - /* Note: vma iterator must be pointing to 'start'. */ + /* Note: vma iterator must be pointing to 'start'. */ vma_iter_config(vmg->vmi, vmg->start, vmg->end); - } else { - vma_iter_config(vmg->vmi, adjust->vm_start + adj_start, - adjust->vm_end); } =20 - if (vma_iter_prealloc(vmg->vmi, vmg->target)) + init_multi_vma_prep(&vp, vma, vmg); + + if (vma_iter_prealloc(vmg->vmi, vma)) return NULL; =20 vma_prepare(&vp); - vma_adjust_trans_huge(vmg->target, vmg->start, vmg->end, adj_start); - vma_set_range(vmg->target, vmg->start, vmg->end, vmg->pgoff); - - if (merge_target) - vma_iter_store(vmg->vmi, vmg->target); + vma_adjust_trans_huge(vma, vmg->start, vmg->end, adj_start); + vma_set_range(vma, vmg->start, vmg->end, vmg->pgoff); =20 if (adj_start) { adjust->vm_start +=3D adj_start; adjust->vm_pgoff +=3D PHYS_PFN(adj_start); - - if (!merge_target) - vma_iter_store(vmg->vmi, adjust); } =20 - vma_complete(&vp, vmg->vmi, vmg->target->vm_mm); + vma_iter_store(vmg->vmi, vmg->target); + + vma_complete(&vp, vmg->vmi, vma->vm_mm); =20 - return merge_target ? vmg->target : vmg->next; + return vmg->target; } =20 /* We can only remove VMAs when merging if they do not have a close hook. = */ @@ -836,11 +840,15 @@ static __must_check struct vm_area_struct *vma_merge_= existing_range( /* No matter what happens, we will be adjusting middle. */ vma_start_write(middle); =20 - if (merge_left) - vma_start_write(prev); - - if (merge_right) + if (merge_right) { vma_start_write(next); + vmg->target =3D next; + } + + if (merge_left) { + vma_start_write(prev); + vmg->target =3D prev; + } =20 if (merge_both) { /* @@ -850,7 +858,6 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( * extend delete delete */ =20 - vmg->target =3D prev; vmg->start =3D prev->vm_start; vmg->end =3D next->vm_end; vmg->pgoff =3D prev->vm_pgoff; @@ -871,7 +878,6 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( * extend shrink/delete */ =20 - vmg->target =3D prev; vmg->start =3D prev->vm_start; vmg->pgoff =3D prev->vm_pgoff; =20 @@ -895,7 +901,6 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( VM_WARN_ON_VMG(vmg->start > middle->vm_start && prev && middle !=3D prev= , vmg); =20 if (merge_will_delete_middle) { - vmg->target =3D next; vmg->end =3D next->vm_end; vmg->pgoff =3D next->vm_pgoff - pglen; } else { @@ -906,7 +911,6 @@ static __must_check struct vm_area_struct *vma_merge_ex= isting_range( * merged VMA is NOT vmg->target, but rather vmg->next. */ vmg->merge_flags |=3D __VMG_FLAG_ADJUST_NEXT_START; - vmg->target =3D middle; vmg->start =3D middle->vm_start; vmg->end =3D start; vmg->pgoff =3D middle->vm_pgoff; diff --git a/mm/vma.h b/mm/vma.h index ddf567359880..5be43e2bba3f 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -113,11 +113,7 @@ struct vma_merge_struct { struct vm_area_struct *prev; struct vm_area_struct *middle; struct vm_area_struct *next; - /* - * This is the VMA we ultimately target to become the merged VMA, except - * for the one exception of merge right, shrink next (for details of - * this scenario see vma_merge_existing_range()). - */ + /* This is the VMA we ultimately target to become the merged VMA. */ struct vm_area_struct *target; /* * Initially, the start, end, pgoff fields are provided by the caller --=20 2.48.0