From nobody Thu Oct 9 04:43:22 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C690F255F31 for ; Thu, 19 Jun 2025 20:27:27 +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=1750364849; cv=fail; b=Rq3fkamD9/XFsz4sq3KcIZO132GxPip2uMhg3WvrXXcws3ySFV3gTRknoJtnZdrG49mWz1axXhZvbYW4eUDwyB/83B0p3k+PZNe1j1ciNJs5WhiHA8F6QmGNN1Iij/TJs0U7nxBueLnDtCIxSLlPRPkms2JMlT8+eWMBaivVuc4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750364849; c=relaxed/simple; bh=40PP3TWxOaVYdZ4RgzaVTyeu5IHS9Nrp4Sc6fMyX1tM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=TVd/HD7tbVMluuPnIFslZuE/paVi5P7rbKEbC2YY1y/m9ugeVGV0eqiOWud1fWJyRjDB2cbAFQEgBj+vga5iC8cmDCKcNg/gYizkH66lvQsOnwIcv17Pu+tSJwz59+49EZlgsNCwENBBMWS9TuHgIO99plUiKXDNFhOSEHysftQ= 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=FsO6aYTc; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=ETAzG9ZX; 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="FsO6aYTc"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="ETAzG9ZX" 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 55JIfgMt016807; Thu, 19 Jun 2025 20:27:05 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-2025-04-25; bh=H5TIg29Y81p/1tflp/ior2+vrAVBLjw9uGr9Dm5QyR4=; b= FsO6aYTc57tI9H/irBbgs4jKuTAAhKZ+JxE3qp6ZTmvV2seDW6xXkhdSgNQya24x dOTf0N+tB1FdQg2p/gmKVCxJKiJ/t1cL2decdkh+AkywcQAzkH5DTAFSf0/EUEjy 0R6ae8ChpCaEToTdGfUVlbd0uEAxYXYkEBj+yww8vOJ1aEZNWlNPAnhd41wtfiG4 XwrZ9lzVf6nATTlwuUikJIXYXPy1j8Dyd6bWH7hbtYzjk8ZFSzAofYCrNVkfRY8W h61ndLRUPVR2H3DyVxBwypYM7ycxHYU5ROFx5vrThpjI8A0PTbvjQf4gymnJCJ5Y oEdFsIKjRaoWW5/Lvf2w0A== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47b23xx21w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:04 +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 55JIOMaB022847; Thu, 19 Jun 2025 20:27:03 GMT Received: from bn1pr04cu002.outbound.protection.outlook.com (mail-eastus2azon11010016.outbound.protection.outlook.com [52.101.56.16]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhjg14q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:03 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JTLn17yqaiC+dsjA4owNB4U4QOzsP8pRuIb04Fpnk487vwbJ9Hc6jp3pd+VXK6ond140cnfSk7UANmd1PocOfdXKFnpVEDNScd41yG/3pfFUh6qZyXs8l7bcmLNCcowRb3VDgyRsFGw1JjSiN8gl6zpCbI1AvXmZ3uH2TtYs0bIxfGzy+eSSEov2nS/DatNtLRnvPns4Ov3tMR+VHj1whVncQ6VORqDdM87QP/Q5HQdO91hGcca3d8MzA9Ru5E3YTsn9w3uI6elrXfViA12Q7qrJEdbpMtE5Tn2m5yRrCEufY3QWtSSzeZqlZTvkIEQRZueR6HJbRkmvcR5fx0Rrmw== 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=H5TIg29Y81p/1tflp/ior2+vrAVBLjw9uGr9Dm5QyR4=; b=apyiy2zsEAtWIkYrph5POFVeFzQi28ir5Uu9QB4Nx+mMfEBejKqthG4H3BXiPa/Ojgdg5N1uSUQJuli0OABU1ODHgw/P8dCELrQVzpIq+2EXx4cUrClnOxylm/Z0RJz3CFn13/9N5eNByYtO6Q3Nh/951A1tpOoioRDukjNqxKf+TbyWSXHkNhkqhw7Eju6oAcUPbmgY90GqSxj90QwETJYjFQ4GrNh2S6V4nrmQRIhj9W5yY5HF4ELJt6i9gciqWRq85oRIfnTv998B7EBNhCOomI/Hcc2s+8V2bW/4VTcJRn7YH7XOvOOV6NryWS6djbp/1KLQUpr0VGn7FLpxag== 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=H5TIg29Y81p/1tflp/ior2+vrAVBLjw9uGr9Dm5QyR4=; b=ETAzG9ZXWC8sjMnM4cLE3v/MTswFIug3sZWshl7CmdcEBe+fU7DbX6eU5MCPoC+ZrpJEdzQ9xfMPX4BTETEPxKkd9UuVwJDDA8RFtHX2MaH3Bote4bf0Ofqt/BiHjRXT0A7xka8XIQRA0jyJB1QrVlNFO1AE3RKouce4S7g3Yng= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CO6PR10MB5791.namprd10.prod.outlook.com (2603:10b6:303:14c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.26; Thu, 19 Jun 2025 20:27:00 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%6]) with mapi id 15.20.8857.019; Thu, 19 Jun 2025 20:27:00 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: David Hildenbrand , Zi Yan , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Lance Yang , SeongJae Park , Suren Baghdasaryan Subject: [PATCH 1/5] mm/madvise: remove the visitor pattern and thread anon_vma state Date: Thu, 19 Jun 2025 21:26:26 +0100 Message-ID: <4239e727b98763856b86cbd9eeaa0ba792eb2394.1750363557.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO3P265CA0033.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:387::16) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CO6PR10MB5791:EE_ X-MS-Office365-Filtering-Correlation-Id: 65d0dbb5-1495-4e2e-0795-08ddaf6fa54a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PDP2dwGrOZTd7RhOHpomYUuiXHswJss5pPYhzD2oiQhXxFzeNeqNDhOQ6f9e?= =?us-ascii?Q?Nv5xgh9SiB4ImehMeIIs9t/1mvYhtyWBf1bdQFE04JU7lPJD2tnsovdQFGDh?= =?us-ascii?Q?kdjgLwrMwWq5CyVK45g/R6HYTreAUtfisBlpcZr71MV4HQXsQwHaRp3noZiv?= =?us-ascii?Q?U26GERrRJpV4wM2ocbAF6r230n2UL99kq9iAqcM3e/O/6BiH3NebOnao3CXx?= =?us-ascii?Q?b8qhmApT/la+q9DfSG3R0hNpI4cMtmVZVLhanl17TU3Zt/Sh9v49ssxixecU?= =?us-ascii?Q?WX1HfDtK4VjdZe6j9x1mVrsF5eEeDSflChyxmbi30uJdzg1GBrJVP7UEZOat?= =?us-ascii?Q?0XxCWqLnEmEYE39MaQrNc4V4vzyCEr1ihKzf5yYpaLJ2ssmToecraSmgrglw?= =?us-ascii?Q?FxfLHz44IunN98AVMzKt52V8G7XmlyWDcFmQDRsossVEvNkeNA4yrMX8Dfvt?= =?us-ascii?Q?tga9Marpwtm1E0CUzVq+dda2teTFcy+Fi6UN2uxXqq4H+Fkrgj9+/pqDpMWH?= =?us-ascii?Q?CTn5lP/8OGbN7a5KTJVYrLOzIVyFpXo923i5/noSPmEv9qwuMcyBp+j5QQQC?= =?us-ascii?Q?MHiP8XabuOZwvKSbgbZcDljb8EJwjENDUi+Y45fRKPgrn0SE6S95cdj/NG41?= =?us-ascii?Q?4/YpYRXlbyu9MqqwRZlVZjxBqk/uIc/hv33R7gm3YtRj9piuqw9gezt6Xqxq?= =?us-ascii?Q?qezxAniju0TqylURUrUOJ5/Rvee3cJw9v2KoggtavxYnocxNJUNHwHoOVL+D?= =?us-ascii?Q?14mQ0rx1Lq5Nx1Lzo0HNO7n8L5ZIk9S3woPVaT4gjvXVg+avUbEp3DSWwW+J?= =?us-ascii?Q?iK4XdvdYIYTa669jWl8gugM7sryweMDLSLTzaTvNX9uUsmP+XU9dkbHeSPU2?= =?us-ascii?Q?feXcbd3e9iOltEsjLppBmu8TOME7jegbAmIpv/Uhd4rT4+TduWufhnrJ3Pdj?= =?us-ascii?Q?9QIe0Rry5Rbi5RAwFCYsmL+MSxsR6OKu/YNjVjwR1dHezICnSR7AWMSpmorq?= =?us-ascii?Q?qj/Pw1cDQjEj4JzVj2yvYJZaSTT+ooe4WB6/GR6L7fX2A4+L1x9QUIA3roRE?= =?us-ascii?Q?+OcVThOTNrxjNkkeSe8K777FGQ5YPzQInY54ec4mF7iwwTeR0qihpQfjTHyY?= =?us-ascii?Q?4uPwTVLUHf26eRVog6uLbOfwdGlBiYu42kxyooC8Z9XUdKXI3PxoPIRmeuFx?= =?us-ascii?Q?GmUwV02Czi2Gg1uwOPaIHPbeFakT9Yfh3ERVoiwW/8wJljHcJDxdyfG3xEoL?= =?us-ascii?Q?ZENvWtMI/zyDQZxc+KAod7Te0zXTFnoOX46o5onPVBLPqNEyKplS2ur29W4D?= =?us-ascii?Q?Dz46732QnMKfqmr7MAd83E4Itm86d7q6pC80j0Cxhf9uKzb4kmNjQPqHp2BB?= =?us-ascii?Q?Awvu7A8jXnJ9RGTDb3ABiuHLHF16ZQoNcRDezOx8NfhEPhKh3j1m+0E+3okG?= =?us-ascii?Q?idi6KoSy7xk=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?f+FEJPuo8yIUCjkmnoAlU+S1m4y8MEUOptJUwE/SQcavQd463pLLKjvlJTjF?= =?us-ascii?Q?hxEwcWdpSYqf2AkZdf86uAiiH0zvBEAAEgivUVO6ms9pOIH6XyHjVpRAGSYu?= =?us-ascii?Q?kknk4QwnRTdd/KH4ESUSYa9HKM3lj2QbLRWrOtUS0CnHZWa3VsB7hklT05JM?= =?us-ascii?Q?OwNBmQeKaVc7sNqncRf4f00DzhNW50K6HDTriDh99E2Mp5+uKR2MIgYoZUtO?= =?us-ascii?Q?et9EcRo/ExDZJwdpmIwOfwKNSGB1Wv6rsBVrGGtaiJlKY2Thz1SdKng2DjVx?= =?us-ascii?Q?5SISzxtdp6DXbmLvZGQj7DLZdL5SbwNvCPSFS3A7Uiaj/XJ/tl2jd+1dmnqI?= =?us-ascii?Q?brIswJzcQ2MWOEhFXeYMvRR3G+Nf7wu/55W/1x3lJjxntYWACyIr8WRXC7pL?= =?us-ascii?Q?4w4WT5Ibuffjplf+1s/DzAIdmxzKYLx4Cy5ZTQXX38fCynU4tD8cO2yLLbWe?= =?us-ascii?Q?xz6ROh3FWGuI+BucbCWvLJEjFKR4jJOJ8ny89D1cFzZXX8VukbT3rNgD4rEC?= =?us-ascii?Q?Wj/e6GBoMQeQejh7XwioP0KqPMWuSzEaA3E58n/87I5doodhEO68PrkDN83V?= =?us-ascii?Q?sJHWfyha26RasWOX27cY1IhRUDp/WR/qL8mIRl5/v3Zcf8NY2tzBByPLVIxQ?= =?us-ascii?Q?ihCfFofUUIiSmkVVLfpELqSmXEVJ3LHuNJQ+aif3hfiS9z7Q+UvPCR1KGI+R?= =?us-ascii?Q?8EA6IPcjpJsw8oLIQmDC4+EFRvgWtDuuIh6o8BkgZG9KMJ7AMo7aSGOQolv0?= =?us-ascii?Q?UByB+Lyzinf/J6C6lswjnCMYCpdlATjM8D857hDUs1cIoq1SRn3ujOGeRLH5?= =?us-ascii?Q?8XdpS5iOLueGtp/AGfNJ2yWl0YQCmq6YiiZq+tZGYYd/pq6ky/2+CkIO0q2r?= =?us-ascii?Q?jbz0ILYrvdDR2lGVVncK/hwx2UAyzcy3eyhGq8LbTTKq5FlLdP+UbANYXQHF?= =?us-ascii?Q?FMGf2ut1YbmrZrFhb8jrnyY4kIYQXQTefIj0bdoAD1YMGq9x5FKIeoyuOIf8?= =?us-ascii?Q?UkAT82zwMzS0qGcbkQkoFg+dZ3XHZjQIEgtll4zskdzL18z5MEnbuQgBi8IE?= =?us-ascii?Q?d91raz5i53E0OL/+5cNVwBR4o+7lDWkcH7rM9/tdrX7QfkMcTnPt6uy24XFy?= =?us-ascii?Q?hDC4v7len60ja8twDTX5+o+4IDh0fZpzACycBIatIstE/u2ZGamvocGWkMkB?= =?us-ascii?Q?77RaMzZW+gqxJj51qk/tKHSgdkn8YXjfEcyoTyc5M8crdXheOWIG26Om+rGc?= =?us-ascii?Q?mEDa7XOfiVB9OwQJ+H68qJ9Pnf8i6yrtexembsnXwVrFMKvQale9TjI7hBGh?= =?us-ascii?Q?MTsrXh5rCjq80C6dD/0z6xT7YH1ov1munTAbVY6LwQqsu5DJXEMlXW9hEtoD?= =?us-ascii?Q?MZ0xHQi4mQ1UiVWUHwcFucc4FDoyHzCA/XPFE55qOb62JqdSMcRg/NOVhpHi?= =?us-ascii?Q?oghiujNa4qUrXqt0O/CP9lteTXkbMFQ1P5TPNjqJCblbrRJ/C11X4WJLUn8H?= =?us-ascii?Q?eEbGjTribZE9pGmwldBWhujeczhZ2cCtxtJpF1gexb9wYCv9Kgi+M3hdMAEB?= =?us-ascii?Q?iS6jrqZxglAgTNqbUTuwcOzQXsVXj3UXLoK9jJNMndXWxCZ8blRq2Zupvk8x?= =?us-ascii?Q?Dw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: qcONtQ8qiiAK0P0TzYBg2+0s0g2xb+ffyM2DXZ/inkd+gjcB6GJyDGVs8wMTdmsLlSb0bbOe2TLNGfrIg7kZE0+HeTqVWmlCN26c/+IRbsYtFwYGJi/0WWIiLr+SrQNcKFVlKAfJugOPDza6rrDeagN5YLVfuz9jcr+mYtjtZvs4++W/8AR97Jd8JNM/Y/0YWd5BbeIpUvabecPYe4weTZi/3/nBmZHCZVB+YRid7cLRWPKwbbM+tofV+6Ax4YsfvA6W+b9ouW46Od/ABzU2xxnjcZV2Wewcy6kNTF9xE0IyEAi4oUyhjGaInzJ5Uxi/npX6usAlKNeYMrGNqM/SH6wfnEbhj0xr0+K67xqN9MwFa36prYRLTBbICeS8feXYqwA3EFMGFgKuhMEtaVsVs7/rQqkZZiRAImvIPK/DYd16O9Byh0spvy3MHCfjQXz1Mqe4X7ppOLyMuN5XsaOz6Z40TNzHLpy5C0GLZHVFxydQahDmxnBVSKVepQE1ygIl8lb+uOMiIorAKMDTfAR8jMlhO7AjvHlmb2AnaY4PXSD0kCu5Y7Ehnfy3n4QqpoWDW3HQKGmzJ9Itb4DB/pM+DXuCdmu6UdFEKnDQbRulXGk= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 65d0dbb5-1495-4e2e-0795-08ddaf6fa54a X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 20:27:00.7739 (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: 454MnqcpWGL2pWOrnhfTPzI3DEn+XAkIQg71vy82Xqa5oNFUSAAAgJDAUbXVR7yJTTz4kK4fY9G7EvkhhVOglBxmTi4i24+44ih8fIS+1nA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR10MB5791 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-06-19_07,2025-06-18_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 spamscore=0 phishscore=0 adultscore=0 suspectscore=0 mlxscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506190167 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjE5MDE2OCBTYWx0ZWRfXz026WnJPyUd4 DmUcd6/tCOTW6eT2Mh9u3e/z85FehsLxceaz1cdRXChjdTC7omd8whxTHeZxQenYyzU3wvQQwyL qeYMGmbNImfuqJR4S99PEWx2O38GQc4SYuLtnTwhbJg/cy9INDHzkWn0I581nGSIE3btrtSgA2i PR9LhorPRTt8FnZD/Vj6G0vznSclrNjBFr/nR8pPOrKn0BXbFHFSxobN3WDlqi3LP4j2BXc0VQp a87Kzjh3GLcxRDIO0+k20HxjQAzMd+t/TrgA52dop8tKijj7ciJxzttOGsfhxnNOgjjkAnqan1r NMgh1B99ct0bzEyfkzX/5gbqjgFSiX10VOFm2TBkWRZy31hauf07C1LicwAUvE9fygsqY6TVIco PcOMMpaeB2+Ciq3u+7iuL+d/ZdveLvbZXbSEavtD+fbo4Zkjj3r5fb3SP6BI6fuboNsroRup X-Authority-Analysis: v=2.4 cv=DM2P4zNb c=1 sm=1 tr=0 ts=68547298 b=1 cx=c_pps a=qoll8+KPOyaMroiJ2sR5sw==:117 a=qoll8+KPOyaMroiJ2sR5sw==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=GoEa3M9JfhUA:10 a=yPCof4ZbAAAA:8 a=YxKqSm6MmbSmlWEyA50A:9 cc=ntf awl=host:13207 X-Proofpoint-GUID: KiPVxWkZWy1KeE0m_fRPbo0IfJl_47kC X-Proofpoint-ORIG-GUID: KiPVxWkZWy1KeE0m_fRPbo0IfJl_47kC Content-Type: text/plain; charset="utf-8" Now we have the madvise_behavior helper struct we no longer need to mess around with void* pointers in order to propagate anon_vma_name, and this means we can get rid of the confusing and inconsistent visitor pattern implementation in madvise_vma_anon_name(). This means we now have a single state object that threads through most of madvise()'s logic and a single code path which executes the majority of madvise() behaviour (we maintain separate logic for failure injection and memory population for the time being). Note that users cannot inadvertently cause this behaviour to occur, as madvise_behavior_valid() would reject it. Doing this results in a can_modify_vma_madv() check for anonymous VMA name changes, however this will cause no issues as this operation is not prohibited. We can also then reuse more code and drop the redundant madvise_vma_anon_name() function altogether. Additionally separate out behaviours that update VMAs from those that do not. Signed-off-by: Lorenzo Stoakes --- mm/madvise.c | 167 +++++++++++++++++++++++++++------------------------ 1 file changed, 90 insertions(+), 77 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 070132f9842b..9dd935d64692 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -37,6 +37,9 @@ #include "internal.h" #include "swap.h" =20 +#define __MADV_SET_ANON_VMA_NAME (-1) +#define __MADV_CLEAR_ANON_VMA_NAME (-2) + /* * Maximum number of attempts we make to install guard pages before we giv= e up * and return -ERESTARTNOINTR to have userspace try again. @@ -59,9 +62,13 @@ struct madvise_behavior { int behavior; struct mmu_gather *tlb; enum madvise_lock_mode lock_mode; + struct anon_vma_name *anon_name; }; =20 #ifdef CONFIG_ANON_VMA_NAME +static int madvise_walk_vmas(struct mm_struct *mm, unsigned long start, + unsigned long end, struct madvise_behavior *madv_behavior); + struct anon_vma_name *anon_vma_name_alloc(const char *name) { struct anon_vma_name *anon_name; @@ -112,6 +119,48 @@ static int replace_anon_vma_name(struct vm_area_struct= *vma, =20 return 0; } + +int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, + unsigned long len_in, struct anon_vma_name *anon_name) +{ + unsigned long end; + unsigned long len; + struct madvise_behavior madv_behavior =3D { + .lock_mode =3D MADVISE_MMAP_WRITE_LOCK, + .anon_name =3D anon_name, + }; + + if (start & ~PAGE_MASK) + return -EINVAL; + len =3D (len_in + ~PAGE_MASK) & PAGE_MASK; + + /* Check to see whether len was rounded up from small -ve to zero */ + if (len_in && !len) + return -EINVAL; + + end =3D start + len; + if (end < start) + return -EINVAL; + + if (end =3D=3D start) + return 0; + + madv_behavior.behavior =3D + anon_name ? __MADV_SET_ANON_VMA_NAME : __MADV_CLEAR_ANON_VMA_NAME; + + return madvise_walk_vmas(mm, start, end, &madv_behavior); +} + +static bool is_anon_vma_name(int behavior) +{ + switch (behavior) { + case __MADV_SET_ANON_VMA_NAME: + case __MADV_CLEAR_ANON_VMA_NAME: + return true; + default: + return false; + } +} #else /* CONFIG_ANON_VMA_NAME */ static int replace_anon_vma_name(struct vm_area_struct *vma, struct anon_vma_name *anon_name) @@ -121,6 +170,11 @@ static int replace_anon_vma_name(struct vm_area_struct= *vma, =20 return 0; } + +static bool is_anon_vma_name(int behavior) +{ + return false; +} #endif /* CONFIG_ANON_VMA_NAME */ /* * Update the vm_flags on region of a vma, splitting it or merging it as @@ -1252,13 +1306,12 @@ static long madvise_guard_remove(struct vm_area_str= uct *vma, static int madvise_vma_behavior(struct vm_area_struct *vma, struct vm_area_struct **prev, unsigned long start, unsigned long end, - void *behavior_arg) + struct madvise_behavior *madv_behavior) { - struct madvise_behavior *arg =3D behavior_arg; - int behavior =3D arg->behavior; - int error; - struct anon_vma_name *anon_name; + int behavior =3D madv_behavior->behavior; + struct anon_vma_name *anon_name =3D madv_behavior->anon_name; vm_flags_t new_flags =3D vma->vm_flags; + int error; =20 if (unlikely(!can_modify_vma_madv(vma, behavior))) return -EPERM; @@ -1275,7 +1328,17 @@ static int madvise_vma_behavior(struct vm_area_struc= t *vma, case MADV_FREE: case MADV_DONTNEED: case MADV_DONTNEED_LOCKED: - return madvise_dontneed_free(vma, prev, start, end, arg); + return madvise_dontneed_free(vma, prev, start, end, + madv_behavior); + case MADV_COLLAPSE: + return madvise_collapse(vma, prev, start, end); + case MADV_GUARD_INSTALL: + return madvise_guard_install(vma, prev, start, end); + case MADV_GUARD_REMOVE: + return madvise_guard_remove(vma, prev, start, end); + + /* The below behaviours update VMAs via madvise_update_vma(). */ + case MADV_NORMAL: new_flags =3D new_flags & ~VM_RAND_READ & ~VM_SEQ_READ; break; @@ -1325,21 +1388,25 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, if (error) goto out; break; - case MADV_COLLAPSE: - return madvise_collapse(vma, prev, start, end); - case MADV_GUARD_INSTALL: - return madvise_guard_install(vma, prev, start, end); - case MADV_GUARD_REMOVE: - return madvise_guard_remove(vma, prev, start, end); + case __MADV_SET_ANON_VMA_NAME: + case __MADV_CLEAR_ANON_VMA_NAME: + /* Only anonymous mappings can be named */ + if (vma->vm_file && !vma_is_anon_shmem(vma)) + return -EBADF; + break; } =20 /* We cannot provide prev in this lock mode. */ - VM_WARN_ON_ONCE(arg->lock_mode =3D=3D MADVISE_VMA_READ_LOCK); - anon_name =3D anon_vma_name(vma); - anon_vma_name_get(anon_name); + VM_WARN_ON_ONCE(madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK); + + if (!is_anon_vma_name(behavior)) { + anon_name =3D anon_vma_name(vma); + anon_vma_name_get(anon_name); + } error =3D madvise_update_vma(vma, prev, start, end, new_flags, anon_name); - anon_vma_name_put(anon_name); + if (!is_anon_vma_name(behavior)) + anon_vma_name_put(anon_name); =20 out: /* @@ -1532,11 +1599,7 @@ static struct vm_area_struct *try_vma_read_lock(stru= ct mm_struct *mm, */ static int madvise_walk_vmas(struct mm_struct *mm, unsigned long start, - unsigned long end, struct madvise_behavior *madv_behavior, - void *arg, - int (*visit)(struct vm_area_struct *vma, - struct vm_area_struct **prev, unsigned long start, - unsigned long end, void *arg)) + unsigned long end, struct madvise_behavior *madv_behavior) { struct vm_area_struct *vma; struct vm_area_struct *prev; @@ -1548,11 +1611,12 @@ int madvise_walk_vmas(struct mm_struct *mm, unsigne= d long start, * If VMA read lock is supported, apply madvise to a single VMA * tentatively, avoiding walking VMAs. */ - if (madv_behavior && madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOC= K) { + if (madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK) { vma =3D try_vma_read_lock(mm, madv_behavior, start, end); if (vma) { prev =3D vma; - error =3D visit(vma, &prev, start, end, arg); + error =3D madvise_vma_behavior(vma, &prev, start, end, + madv_behavior); vma_end_read(vma); return error; } @@ -1586,7 +1650,8 @@ int madvise_walk_vmas(struct mm_struct *mm, unsigned = long start, tmp =3D end; =20 /* Here vma->vm_start <=3D start < tmp <=3D (end|vma->vm_end). */ - error =3D visit(vma, &prev, start, tmp, arg); + error =3D madvise_vma_behavior(vma, &prev, start, tmp, + madv_behavior); if (error) return error; start =3D tmp; @@ -1603,57 +1668,6 @@ int madvise_walk_vmas(struct mm_struct *mm, unsigned= long start, return unmapped_error; } =20 -#ifdef CONFIG_ANON_VMA_NAME -static int madvise_vma_anon_name(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end, - void *anon_name) -{ - int error; - - /* Only anonymous mappings can be named */ - if (vma->vm_file && !vma_is_anon_shmem(vma)) - return -EBADF; - - error =3D madvise_update_vma(vma, prev, start, end, vma->vm_flags, - anon_name); - - /* - * madvise() returns EAGAIN if kernel resources, such as - * slab, are temporarily unavailable. - */ - if (error =3D=3D -ENOMEM) - error =3D -EAGAIN; - return error; -} - -int madvise_set_anon_name(struct mm_struct *mm, unsigned long start, - unsigned long len_in, struct anon_vma_name *anon_name) -{ - unsigned long end; - unsigned long len; - - if (start & ~PAGE_MASK) - return -EINVAL; - len =3D (len_in + ~PAGE_MASK) & PAGE_MASK; - - /* Check to see whether len was rounded up from small -ve to zero */ - if (len_in && !len) - return -EINVAL; - - end =3D start + len; - if (end < start) - return -EINVAL; - - if (end =3D=3D start) - return 0; - - return madvise_walk_vmas(mm, start, end, NULL, anon_name, - madvise_vma_anon_name); -} -#endif /* CONFIG_ANON_VMA_NAME */ - - /* * Any behaviour which results in changes to the vma->vm_flags needs to * take mmap_lock for writing. Others, which simply traverse vmas, need @@ -1845,8 +1859,7 @@ static int madvise_do_behavior(struct mm_struct *mm, if (is_madvise_populate(behavior)) error =3D madvise_populate(mm, start, end, behavior); else - error =3D madvise_walk_vmas(mm, start, end, madv_behavior, - madv_behavior, madvise_vma_behavior); + error =3D madvise_walk_vmas(mm, start, end, madv_behavior); blk_finish_plug(&plug); return error; } --=20 2.49.0 From nobody Thu Oct 9 04:43:22 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D2EDC23BCF2 for ; Thu, 19 Jun 2025 20:27:25 +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=1750364847; cv=fail; b=UgcY+TjnPkPPkLf81hsVwWUgSzqTTDGnNyL2Fw4Uttlo8JZqdrEIK8WXktYJtqtqe4dc3O4y4mRirNoehiQLl2zU5CoFr8cyBZlO7FXO4Aqs1hDBy+RQbDsJVwSmdO8TW6ZHOBjmaayu7fpTd+8NTFf+TeNATXKZ+mdjkV7fR9U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750364847; c=relaxed/simple; bh=KGqFFyYQ1QsMxyzWDF+W2JBxmigGZmBp3ilN/AJDN/E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Iheatiqsd5wwoCXj0G98th55rBG90PA2+c1L9PnofeVChAMuxejwo0I54d6PjlRWvQCmzUX7sIsLxSd3Y/wsomcPUgZzyHEiqTv3Sub7bnPeM91MDiPoYP5iB7au1AXwxM4oi+px1XH49TkQA7eXsDDO/LMX4dwgaNRPC65yg80= 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=QgzDFFUt; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=D6fxJ/Qq; 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="QgzDFFUt"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="D6fxJ/Qq" 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 55JIfgMu016807; Thu, 19 Jun 2025 20:27:07 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-2025-04-25; bh=p7R0fg4+xqLDcTdZ58xDYS8x5FJINy7YkFTN1rFRqjY=; b= QgzDFFUt0IFbbNhvVYvHzW1xYKR8XqvYjHqE9wJfnCbV2WNt3u5/6E4XlqBRJRcQ P+2ONzlFCb9aT+fS0NboE5FaqMkEfQS38PrMc8MastKZdkVC+/KjOA0v3MQoLXVa ejiSlDzN9l3OsQaUBk6FHoSLUUmmLTMYjXR5rg1xHl/buXUpnCzZ3DVC4lvXRLNn i77sw1YwgUJ6IUjFMbm/8X+96SCXZYAVEigOaHF1CULggvnReOIPcTgWn1e58Lb5 cA8eBgbvLjNaVxmA5yaqSoZ/yLM/Ls0iLONdv+z6Q9LwYM2n8FtBV+36MXOnN/ua 61pOXwRjDu5uU/5NRyjKcw== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47b23xx221-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:07 +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 55JIeTtH037480; Thu, 19 Jun 2025 20:27:06 GMT Received: from bn8pr05cu002.outbound.protection.outlook.com (mail-eastus2azon11011016.outbound.protection.outlook.com [52.101.57.16]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 478yhbywv3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gUA3nmAbF8sWT377Z6CVGFPOcWGyZ8N9F38QhCdFok5f52kSbCy0i1xDa6bZe+S3ntlq3hb0JLMUb/5Fsa3/lgw/JalCb3yyg8B4tAYo28TzRx5h9muZwdqAnTrNjVqLAXJLZp8z7kQpaC6W77svPLq+ridIlhBnmcNhDoP08IABgyorUdXmMy10PgC4rsQu0GJG5YSPCqdi5HriMbsNgnci6+7m88MaCNRbWm+VaTtNblO1zwiij7JxznEPkNFedTv7IJRbhgyPMaDXKN0d8mtW9K/CpRwf7Kv4sgOYnhXwrNiBGHO+0uuRPWPwtv8hqUPpR8ymM5O/do2RY989uQ== 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=p7R0fg4+xqLDcTdZ58xDYS8x5FJINy7YkFTN1rFRqjY=; b=WRQO0+jLNWV8tFkNKtOtcJtxVFmxgDL2zlW7higAKZbJJjxD8GETXQZECIhpbeUkudVrpzEJ+D8/Ma+9YfgiHWe+FtuEA8SA7sUb2+6d7XA1wGdX4YfoYLxXxqz7JnFv/s3KL+ivxl4wOMesDgWhb0Pa5bGAtKxZfmrUKZnXfwEP7eRNUnjWTSoCXhVpHlfzfglc8l+rhaWRyvHYFTIiSwxdJd55c/MevGZu/UCG5BAiL80dHsBs2Pf38/ogoB4vkvcxkI0hCSzb7alYFnTDJYWZLK1xXXa0El+g2WMui7hT7ut22y4gCBgLDXNU2Ojp/FIAbU1jO4uwgojuKxfk1Q== 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=p7R0fg4+xqLDcTdZ58xDYS8x5FJINy7YkFTN1rFRqjY=; b=D6fxJ/Qqk1Y+17+lFyIw3GgnCWgcFGlL8v6guX2pJeaUA48b9pizTlAUmqbLNz+faMfYs4xU+KEH/NlD5R26VChUNjcl/WXfYYyTrE6YUdsJx/YZsM9eSpwcLyhf1CsdlY48SvhqZ6dC0WAx6VDG1jv7J3t5RIxG8/naPErFojs= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CO6PR10MB5791.namprd10.prod.outlook.com (2603:10b6:303:14c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.26; Thu, 19 Jun 2025 20:27:03 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%6]) with mapi id 15.20.8857.019; Thu, 19 Jun 2025 20:27:03 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: David Hildenbrand , Zi Yan , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Lance Yang , SeongJae Park , Suren Baghdasaryan Subject: [PATCH 2/5] mm/madvise: thread mm_struct through madvise_behavior Date: Thu, 19 Jun 2025 21:26:27 +0100 Message-ID: <1be4352e1d414712e876cff4b5d982cc24dc7692.1750363557.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0092.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2bc::13) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CO6PR10MB5791:EE_ X-MS-Office365-Filtering-Correlation-Id: c31e543d-7cf7-4378-296b-08ddaf6fa6b6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?4qrH3DhmBb0PatyLMu5rGHqvBxIUDHUUhYv1JHWOCgkFR01UwRwy9JfEnoWm?= =?us-ascii?Q?ag3u5uK3LlrI6v15rtBm7stpr+mnHlDwSyXdJQGJpLTfcwuFwKP+aXgnNMPM?= =?us-ascii?Q?h9UA+muQUS/5hZoxc49QhcVMF6UB71yb52NoCdVa5nxUQyUEy50SXT7hMYh4?= =?us-ascii?Q?9mQuHbIVyj5nT4sO4quUNFbdF/DkbMqoxrHKVeHr/F43SU6jB5U/lbRmKPBx?= =?us-ascii?Q?/uDDAD/Uh8g6DTcIi8k+1CGBiuLpHNTB9nbTaxDEAIP585CrQzdOqNDaXyFf?= =?us-ascii?Q?zMs+BzjGepbjIN7Gl1YT6/23SFugHjn+r23Om+GGwV5QCMpipZpPtvicToSu?= =?us-ascii?Q?8MMjhb+i8Gg+rVToN+zcVVd/a2gaofKaMWpcCQdiLNhMdbQAfNjfOcUy8LVF?= =?us-ascii?Q?zfpiLgg4FRgwlm4XYVpu5nAZEG/ewKYzY5LaOAlAbfF3SUIaxMT10GZS5dFB?= =?us-ascii?Q?BEvKdcmgzQQGHnkO6p8lo9FnA5pJFM3WK9HNmBlXkxC1mxw/eoAQXbt0E5zf?= =?us-ascii?Q?7LUVBMI+WFTza54omAXgW+hgw1W0pKQLJTc0aY6nztQ4OQC7Ncu1AuCYj3Cn?= =?us-ascii?Q?v+Ymfh5tVSORJ003gCkZopNjms+glNhNsEzbbrJGw2SePKD+MbMgH6za4596?= =?us-ascii?Q?J9r2eqAeC2lDFL+bnkpXwN84kZt3dxwkpdOlJRKvwXt0yyeF+tkDBMuqwwXe?= =?us-ascii?Q?MZuOkmiwo6X9FFBiIcRp379ainpK+sxeOsWjjhZog6676S3n9ZQVRn+oM8YC?= =?us-ascii?Q?z1RMzvTrCADfFiCMHBRKJi+NaTetbHsjaVuzDdrzzM6vzsuUv4yoS1RHEDOT?= =?us-ascii?Q?oZoE44bDgBn0PZOM5f30Y1wdJnfhHtysuPGPeIdgoIt+h5r2+IXjcE6Q1ETx?= =?us-ascii?Q?Miv5GIQ30NyUgciHqMzl0J9uf8rN/z7zGUsaPJFP4iohIxbX+EuEv/yZV511?= =?us-ascii?Q?a+frZ+Ozup3WNVh1oRcI8LaN/UsPnhrj0AP4HbvkQUDkxnKGeckucVxEIAc7?= =?us-ascii?Q?Mv+jtJ3NutJBIrK2Ps13o5Gk7XnIhBRLZJGogypZwubYRH400lxtanFTHnNL?= =?us-ascii?Q?YQwxwEDlKY2qz5OFQEpNd4UNuA+GsnHgg5wbLGcvifCDegjoA+7DgqWeit1o?= =?us-ascii?Q?4OlrtfH+pqpZAhuP9/8L4gjUjM/L0Hga47Oplp+7HyURQRaRHBfoLMKNFILi?= =?us-ascii?Q?noXqthUKDK7ziWYgBztKdrxb5ridv07yYVLptk8egoe6iDdnIFBdvcDXU8a1?= =?us-ascii?Q?6o7fc/xj/yzxVrtcVIvgwbxXsbp5EDYcT0pzAH7LV1Z3B3Ai7IjLcTIevvxb?= =?us-ascii?Q?NxLtVB6wOT4MGS+KEJ2wlfTlxHUat2xLBDc/GGXpRZasEIEtaA8ZGdewDGm1?= =?us-ascii?Q?dK/1XCEDmUGgePUTFmtIXZQMeZYm/Fx2wRFlnCbF4gID5Ra5K/+6DOIiOJgO?= =?us-ascii?Q?w1dn6NHWQ4A=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?KgmObhJxpCC0jQbg8s7/g4ksJJvNDIK9TQxY8bIjNHTzQ2iM0tgtqe49bdss?= =?us-ascii?Q?MRa8FBFgYRESkjf92pVVOO+kZzOVxc6jhXjC6bJOBstu7ddR4rnS0OwAUx8h?= =?us-ascii?Q?A0/SZonGhQkU7OIu1Y1Boia8qAZ+KN+dZ8DGvhFJD7VLVpLwP0mppF5/OYou?= =?us-ascii?Q?oHsKxX/zuSkir7iwxulmq1DJDLmo1FiiCbBOMYi6SRCbDqab9Bu6ctDjUS7f?= =?us-ascii?Q?CtkZFnZjD9LfwmK8+1Bmjr4CuuK61U4xpHzyKgcM8NJXpnsVpzz/6BgQML/Y?= =?us-ascii?Q?TeOBX0DcomXU0jnurwB2PHn6w5PcPg0ADtX+hjis7lUvEhtm3/MZvszuqhSH?= =?us-ascii?Q?1D4L428jYDrALTlORVNXYRaSTA3Fb1jSBOVSrWmcVyU3cCXkzHaVJTKUHvoi?= =?us-ascii?Q?zc1QRVjpM5lNp8fLpsnnERnthsDWmci16ORTpQXnvggN0wneNNiAy96jUbXr?= =?us-ascii?Q?gJiUxIg1mEjFMf0ogoeW6R2BH+orRyZuVPyTq7UTjdzeEhY+jGumjCRC/63c?= =?us-ascii?Q?2EoiL2fJ16PHVA6Y0+Dq2BRKW26mUZLsl8MQtLBwP5PSlvh4rAnfLgGJDoCb?= =?us-ascii?Q?mxtbv/Vn7qwPQshXGWmZsG2+wJ2/rzbElp+yigjxkSSO2YJDMKRAhZeji/dZ?= =?us-ascii?Q?E0TrR3cl9dicGpJ1entpRvkMoVb7kuoOthm0dyPmnbWT4JzSiIfm/SprXDzk?= =?us-ascii?Q?FmMKAZP8DJaryxrjjMphD4WsnsobgO8hetB9LxfcEwIcwxHs8mKH/TONgoCX?= =?us-ascii?Q?4eHVBGfl0QWqYP4TMmhekx+9ZB6H+ff2osfq9+FctYTV7STC1YeI05a3SV06?= =?us-ascii?Q?p/S54goJXXU5VQtv8Yt0hawggSzNw9gnJRKukCmGUEA8Cup9YiEN0ZxEry46?= =?us-ascii?Q?zCsLOH3DcwOyFdyIRnEl3vWvg40dsHc2Fz+np09ehWV0bf7Ca890exDFneIo?= =?us-ascii?Q?O3bI4Sz21bgJQPzigQiFH2ps1FYxPLUaj/nM+4onsLztMUJoiGb4DYb1gwaz?= =?us-ascii?Q?8mrk/qrf4bHTjj5SLPQlZokem9+AQJFhijGzhkKwn2aDtBuBuQKtKXNY3rZz?= =?us-ascii?Q?PCKNOzHTJ67olTKiHtSSFcIAgQsVCLikLCbqoOVx7Dp984XiaM6RskXKdwDH?= =?us-ascii?Q?H3FtNJQfSba8+yj3WjYdLUiLdAoDRjFFmgJgc6fqq28DdNu5tO/tvQyw3PnT?= =?us-ascii?Q?gNn+Qa5i0UBxK1xY3XhObCGFRnYRt0Awog1bJllzBFJ0eeUeu9KqzpqZIt+X?= =?us-ascii?Q?+ldRtp41nueBR/Hh6RFW/ELsDhtVUgI11qTuIkOmB5BvqRnp16RevW+KQcg1?= =?us-ascii?Q?uijcBOyetEmKIkisKgu7J2nhWuFggXUN+qnvF8k/iZjiEbuxpUpwo6x1AgJ+?= =?us-ascii?Q?zooXX4w1az8nSw+0eoF08vVQNEXOdRRpeiMJLIu08VSVCN5PTTw8WyNYipJr?= =?us-ascii?Q?yABpDlX6ME/bTnG0c/Qo9Ts6xkAntHdNQWT2ptj8CIgVW4ANrInprjSU4d/s?= =?us-ascii?Q?8YO9T+Yp8rtMwCt4JDFbdisfsBr+H1u2E2ytA5OSZE/go0Z85wjhjAcTR0WH?= =?us-ascii?Q?/0AIkZGnW1KGOydZEEFzzQurIVzhRBBsXgk8a91vAeCSvky6vyR8Th6T87rC?= =?us-ascii?Q?EQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: l5x4thKY0XvG9TzIDJj0kbqWuUEnacMMPsCUkgaY6d6M7OhgWOWUIdg49kQZAk6aSZwOdfabe/pnGb9U55MKzxPVkK5/a2ANOvCRXFREyv0ufbHw4DFnmf20WR07LaOAeN1ZtuUmjheRSwZd40hKu/uSNV0vQQiBYuPnb0/+vnQX02lQnj3dJFf61zdW8jBTTTFQPdlrWnI5cE3Qr7/l0YnzAcuXKZ+SzWcae55dcGNQmNqMqSaWamSM/hPAgeh8/aCikRdgqaTFZaKFD+NtLWVwZp3q86vw0xvMd8MSahWTWtNGfIqWF4bFi2RA8mL9VQtxKIQc4Wp4Nc/xoTFqOZid4ZzD4QRq+xvpkdLMxdi1sdp/15hdlrvy0nzzaS9fwcUq9n8+MPovOmzGAWA1zID/22ifB32PGOMcHb4+o/g56KlwanJ5J6h2TO9j8tRjbarxePf50WwmzrVPso1rasltY8YME/UT9Ix12FQn6qUd77Kh7FNCcSwolVh5aOfqLVNQtcSRJhb6iVdVIkOEOB/Q2bnFloaeFslvLOUymmqwARtHW7r+nwCD/Zu8ORcsGqDsk8qTnlJtobDI2mDAVzFu5paTx/3/pPN4Neh03w4= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: c31e543d-7cf7-4378-296b-08ddaf6fa6b6 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 20:27:03.1315 (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: JBz9CrW8g3NWFQZwqdV2QGLtYaEY9LbeGS/52AZOX65nud5yvefuK0IIDmP2XAaFV3POAHddJwk2ChMMa9TxpaZYBu553hU29HCxXmqKIEg= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR10MB5791 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-06-19_07,2025-06-18_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 adultscore=0 mlxlogscore=999 spamscore=0 mlxscore=0 phishscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506190167 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjE5MDE2OCBTYWx0ZWRfXwST1/Hw5S337 C0vttWXKbr3ccbMnrH/IEuXYX4bpD37bntR2UfsFUj+lj4d5LKJvQPpgAveI79iFDk4/KDS75uE r/IlwyyS3pqijliezOFGxuaUEoBLjykCy3BYMsxrU7M+IdgNj+IOWSO+hS+npfEXzeu82ukkwcR DYtnh24ABxdHyVkaQ43+aOJTKyDVM5Zu/LXkdm/3prEYrCvPd6vIJKxeyawwPEz4I02Pq0+Gfry 1fr5534bMCP4c9o65DT59r+8kjEQfpaYJ7vB9O6QqHF1fCDizwVK/bL2NTwrOvLwODO4deT4liJ YasPYKruA9S2UcT9unn6FvduQ9L+/L4VILnLbhd3TkN3ac6scTSsbuGpMiiIznQdl6gOvQnPjEE DtiTQ3KPa9nbj6AVLuKH0/oVWZavoRGMAUk9pMP+rO32x+zRRMpNVfx7r2R4+VaqH609C/8L X-Authority-Analysis: v=2.4 cv=DM2P4zNb c=1 sm=1 tr=0 ts=6854729b cx=c_pps a=XiAAW1AwiKB2Y8Wsi+sD2Q==:117 a=XiAAW1AwiKB2Y8Wsi+sD2Q==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=GoEa3M9JfhUA:10 a=yPCof4ZbAAAA:8 a=HdukbOKCL_F7UDQY8x4A:9 X-Proofpoint-GUID: aVrWkyxuIm4-rrgv-MZh-0bITpD9XxV9 X-Proofpoint-ORIG-GUID: aVrWkyxuIm4-rrgv-MZh-0bITpD9XxV9 Content-Type: text/plain; charset="utf-8" There's no need to thread a pointer to the mm_struct nor have different functions signatures for each behaviour, instead store state in the struct madvise_behavior object consistently and use it for all madvise() actions. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- mm/madvise.c | 105 ++++++++++++++++++++++++++------------------------- 1 file changed, 54 insertions(+), 51 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 9dd935d64692..47485653c2a1 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -59,6 +59,7 @@ enum madvise_lock_mode { }; =20 struct madvise_behavior { + struct mm_struct *mm; int behavior; struct mmu_gather *tlb; enum madvise_lock_mode lock_mode; @@ -66,8 +67,8 @@ struct madvise_behavior { }; =20 #ifdef CONFIG_ANON_VMA_NAME -static int madvise_walk_vmas(struct mm_struct *mm, unsigned long start, - unsigned long end, struct madvise_behavior *madv_behavior); +static int madvise_walk_vmas(unsigned long start, unsigned long end, + struct madvise_behavior *madv_behavior); =20 struct anon_vma_name *anon_vma_name_alloc(const char *name) { @@ -126,6 +127,7 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigne= d long start, unsigned long end; unsigned long len; struct madvise_behavior madv_behavior =3D { + .mm =3D mm, .lock_mode =3D MADVISE_MMAP_WRITE_LOCK, .anon_name =3D anon_name, }; @@ -148,7 +150,7 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigne= d long start, madv_behavior.behavior =3D anon_name ? __MADV_SET_ANON_VMA_NAME : __MADV_CLEAR_ANON_VMA_NAME; =20 - return madvise_walk_vmas(mm, start, end, &madv_behavior); + return madvise_walk_vmas(start, end, &madv_behavior); } =20 static bool is_anon_vma_name(int behavior) @@ -1010,10 +1012,11 @@ static long madvise_dontneed_free(struct vm_area_st= ruct *vma, return -EINVAL; } =20 -static long madvise_populate(struct mm_struct *mm, unsigned long start, - unsigned long end, int behavior) +static long madvise_populate(unsigned long start, unsigned long end, + struct madvise_behavior *madv_behavior) { - const bool write =3D behavior =3D=3D MADV_POPULATE_WRITE; + struct mm_struct *mm =3D madv_behavior->mm; + const bool write =3D madv_behavior->behavior =3D=3D MADV_POPULATE_WRITE; int locked =3D 1; long pages; =20 @@ -1422,15 +1425,14 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, /* * Error injection support for memory error handling. */ -static int madvise_inject_error(int behavior, - unsigned long start, unsigned long end) +static int madvise_inject_error(unsigned long start, unsigned long end, + struct madvise_behavior *madv_behavior) { unsigned long size; =20 if (!capable(CAP_SYS_ADMIN)) return -EPERM; =20 - for (; start < end; start +=3D size) { unsigned long pfn; struct page *page; @@ -1448,7 +1450,7 @@ static int madvise_inject_error(int behavior, */ size =3D page_size(compound_head(page)); =20 - if (behavior =3D=3D MADV_SOFT_OFFLINE) { + if (madv_behavior->behavior =3D=3D MADV_SOFT_OFFLINE) { pr_info("Soft offlining pfn %#lx at process virtual address %#lx\n", pfn, start); ret =3D soft_offline_page(pfn, MF_COUNT_INCREASED); @@ -1467,9 +1469,9 @@ static int madvise_inject_error(int behavior, return 0; } =20 -static bool is_memory_failure(int behavior) +static bool is_memory_failure(struct madvise_behavior *madv_behavior) { - switch (behavior) { + switch (madv_behavior->behavior) { case MADV_HWPOISON: case MADV_SOFT_OFFLINE: return true; @@ -1480,13 +1482,13 @@ static bool is_memory_failure(int behavior) =20 #else =20 -static int madvise_inject_error(int behavior, - unsigned long start, unsigned long end) +static int madvise_inject_error(unsigned long start, unsigned long end, + struct madvise_behavior *madv_behavior) { return 0; } =20 -static bool is_memory_failure(int behavior) +static bool is_memory_failure(struct madvise_behavior *madv_behavior) { return false; } @@ -1598,9 +1600,10 @@ static struct vm_area_struct *try_vma_read_lock(stru= ct mm_struct *mm, * Must be called with the mmap_lock held for reading or writing. */ static -int madvise_walk_vmas(struct mm_struct *mm, unsigned long start, - unsigned long end, struct madvise_behavior *madv_behavior) +int madvise_walk_vmas(unsigned long start, unsigned long end, + struct madvise_behavior *madv_behavior) { + struct mm_struct *mm =3D madv_behavior->mm; struct vm_area_struct *vma; struct vm_area_struct *prev; unsigned long tmp; @@ -1675,12 +1678,10 @@ int madvise_walk_vmas(struct mm_struct *mm, unsigne= d long start, */ static enum madvise_lock_mode get_lock_mode(struct madvise_behavior *madv_= behavior) { - int behavior =3D madv_behavior->behavior; - - if (is_memory_failure(behavior)) + if (is_memory_failure(madv_behavior)) return MADVISE_NO_LOCK; =20 - switch (behavior) { + switch (madv_behavior->behavior) { case MADV_REMOVE: case MADV_WILLNEED: case MADV_COLD: @@ -1700,9 +1701,9 @@ static enum madvise_lock_mode get_lock_mode(struct ma= dvise_behavior *madv_behavi } } =20 -static int madvise_lock(struct mm_struct *mm, - struct madvise_behavior *madv_behavior) +static int madvise_lock(struct madvise_behavior *madv_behavior) { + struct mm_struct *mm =3D madv_behavior->mm; enum madvise_lock_mode lock_mode =3D get_lock_mode(madv_behavior); =20 switch (lock_mode) { @@ -1724,9 +1725,10 @@ static int madvise_lock(struct mm_struct *mm, return 0; } =20 -static void madvise_unlock(struct mm_struct *mm, - struct madvise_behavior *madv_behavior) +static void madvise_unlock(struct madvise_behavior *madv_behavior) { + struct mm_struct *mm =3D madv_behavior->mm; + switch (madv_behavior->lock_mode) { case MADVISE_NO_LOCK: return; @@ -1756,11 +1758,10 @@ static bool madvise_batch_tlb_flush(int behavior) } } =20 -static void madvise_init_tlb(struct madvise_behavior *madv_behavior, - struct mm_struct *mm) +static void madvise_init_tlb(struct madvise_behavior *madv_behavior) { if (madvise_batch_tlb_flush(madv_behavior->behavior)) - tlb_gather_mmu(madv_behavior->tlb, mm); + tlb_gather_mmu(madv_behavior->tlb, madv_behavior->mm); } =20 static void madvise_finish_tlb(struct madvise_behavior *madv_behavior) @@ -1815,9 +1816,9 @@ static bool madvise_should_skip(unsigned long start, = size_t len_in, return false; } =20 -static bool is_madvise_populate(int behavior) +static bool is_madvise_populate(struct madvise_behavior *madv_behavior) { - switch (behavior) { + switch (madv_behavior->behavior) { case MADV_POPULATE_READ: case MADV_POPULATE_WRITE: return true; @@ -1841,25 +1842,26 @@ static inline unsigned long get_untagged_addr(struc= t mm_struct *mm, untagged_addr_remote(mm, start); } =20 -static int madvise_do_behavior(struct mm_struct *mm, - unsigned long start, size_t len_in, +static int madvise_do_behavior(unsigned long start, size_t len_in, struct madvise_behavior *madv_behavior) { - int behavior =3D madv_behavior->behavior; struct blk_plug plug; unsigned long end; int error; =20 - if (is_memory_failure(behavior)) - return madvise_inject_error(behavior, start, start + len_in); - start =3D get_untagged_addr(mm, start); + if (is_memory_failure(madv_behavior)) { + end =3D start + len_in; + return madvise_inject_error(start, end, madv_behavior); + } + + start =3D get_untagged_addr(madv_behavior->mm, start); end =3D start + PAGE_ALIGN(len_in); =20 blk_start_plug(&plug); - if (is_madvise_populate(behavior)) - error =3D madvise_populate(mm, start, end, behavior); + if (is_madvise_populate(madv_behavior)) + error =3D madvise_populate(start, end, madv_behavior); else - error =3D madvise_walk_vmas(mm, start, end, madv_behavior); + error =3D madvise_walk_vmas(start, end, madv_behavior); blk_finish_plug(&plug); return error; } @@ -1941,19 +1943,20 @@ int do_madvise(struct mm_struct *mm, unsigned long = start, size_t len_in, int beh int error; struct mmu_gather tlb; struct madvise_behavior madv_behavior =3D { + .mm =3D mm, .behavior =3D behavior, .tlb =3D &tlb, }; =20 if (madvise_should_skip(start, len_in, behavior, &error)) return error; - error =3D madvise_lock(mm, &madv_behavior); + error =3D madvise_lock(&madv_behavior); if (error) return error; - madvise_init_tlb(&madv_behavior, mm); - error =3D madvise_do_behavior(mm, start, len_in, &madv_behavior); + madvise_init_tlb(&madv_behavior); + error =3D madvise_do_behavior(start, len_in, &madv_behavior); madvise_finish_tlb(&madv_behavior); - madvise_unlock(mm, &madv_behavior); + madvise_unlock(&madv_behavior); =20 return error; } @@ -1971,16 +1974,17 @@ static ssize_t vector_madvise(struct mm_struct *mm,= struct iov_iter *iter, size_t total_len; struct mmu_gather tlb; struct madvise_behavior madv_behavior =3D { + .mm =3D mm, .behavior =3D behavior, .tlb =3D &tlb, }; =20 total_len =3D iov_iter_count(iter); =20 - ret =3D madvise_lock(mm, &madv_behavior); + ret =3D madvise_lock(&madv_behavior); if (ret) return ret; - madvise_init_tlb(&madv_behavior, mm); + madvise_init_tlb(&madv_behavior); =20 while (iov_iter_count(iter)) { unsigned long start =3D (unsigned long)iter_iov_addr(iter); @@ -1990,8 +1994,7 @@ static ssize_t vector_madvise(struct mm_struct *mm, s= truct iov_iter *iter, if (madvise_should_skip(start, len_in, behavior, &error)) ret =3D error; else - ret =3D madvise_do_behavior(mm, start, len_in, - &madv_behavior); + ret =3D madvise_do_behavior(start, len_in, &madv_behavior); /* * An madvise operation is attempting to restart the syscall, * but we cannot proceed as it would not be correct to repeat @@ -2010,11 +2013,11 @@ static ssize_t vector_madvise(struct mm_struct *mm,= struct iov_iter *iter, =20 /* Drop and reacquire lock to unwind race. */ madvise_finish_tlb(&madv_behavior); - madvise_unlock(mm, &madv_behavior); - ret =3D madvise_lock(mm, &madv_behavior); + madvise_unlock(&madv_behavior); + ret =3D madvise_lock(&madv_behavior); if (ret) goto out; - madvise_init_tlb(&madv_behavior, mm); + madvise_init_tlb(&madv_behavior); continue; } if (ret < 0) @@ -2022,7 +2025,7 @@ static ssize_t vector_madvise(struct mm_struct *mm, s= truct iov_iter *iter, iov_iter_advance(iter, iter_iov_len(iter)); } madvise_finish_tlb(&madv_behavior); - madvise_unlock(mm, &madv_behavior); + madvise_unlock(&madv_behavior); =20 out: ret =3D (total_len - iov_iter_count(iter)) ? : ret; --=20 2.49.0 From nobody Thu Oct 9 04:43:22 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8606C28DB5C for ; Thu, 19 Jun 2025 20:27:31 +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=1750364854; cv=fail; b=d6nzuxvzqRuy6vkM0d4ZvT9JyV8z/qy/AaFGAhAUvsMdsdj1B6DUFh1ZB+aMfyGlJiU9OYf0JRWbHiIKIqjzlEbMj2yS6JenoqNE5htbEB7J5NqeF14ta1Wokz54mEmhdFeSQjNxGPFAmzf21p2zsYvDXaQrChGuFZNfYW19OZU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750364854; c=relaxed/simple; bh=xM6Vye2sZKDPZaEZoatHBF/HyI1DqQorVjO8+dZXIj4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=mJEO3rrxBsj/8UZPTPKJaOcLOkFweJZWll2q0kJmlqZE7Bt6t4hHdaLtpXT/Q2VS21VGkFSH/Ln3v8BWAjOZ3r7LSoFvOm3jFsSmAM7EdLcdKQPcLjpTVXNY6bHhRAW96oNp3lwR4g7XJN0DeffjJJqsVdNd1+dZQ/nfNYLLafQ= 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=mkLophPz; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=q446hBWv; 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="mkLophPz"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="q446hBWv" 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 55JIfdeI002021; Thu, 19 Jun 2025 20:27:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=flA5bHnaQEo0QyxD2X0SNRJvrJofnevNw0E5qvrZZpI=; b= mkLophPzpmmozi2MCIBR0K5WX/DSSwH17NPAsSNiUoN+hA0ud8qSc2SXOw6NPrPc UMYFwS7fwIOmoN06vgTNBcw1Sgr2HPP+p6T986sRKDTFihiCPV8kXPkcvxTw7SEk RSwrOiywfJxxVxjG2xdK5LYIt4HdbkipISsZVu8UasSwjU59jQr7f1BH0eRVZqUi Uf1kr5Z8zZ+5R5jeABLJ9PfJzaJ9Gr1yLjb+fuNotu4fbz2p11cUgMs/YiXLHRCm FMqH8LvblOobUHsE+Q0vFA7MOWBwshBA8W7Fldf3FD0YW1oITqREijafJFEOFk8g VTiUoXneyqkfDQEExPVbHg== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 478yp4tk8b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:09 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 55JITFuJ018373; Thu, 19 Jun 2025 20:27:08 GMT Received: from bn8pr05cu002.outbound.protection.outlook.com (mail-eastus2azon11011057.outbound.protection.outlook.com [52.101.57.57]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 478yhc7p2v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bwks3jJS5yRNvvlbx4JsGn7HQHBRz49KcMZ5Yzx0djHp2B9dHfODytRZXF2GzdbCB4+bKNmX6iG+OA2q9TJd6bG7y2WLiwXdsE8HAkikd1qXBBz71rqXC7Y+3/hAeXtfdhHp1vCBtf7sgyU3MV93p2XeHJv9jTgEzOYpAzY33WEthnmO7mvuU+s1mUOdAC0sRm6Jez3pYUIgiFTQOGm9elS4pNLlyh/IxVqp26Eltexi6BRj2KBFWbj1BBbkR4ctfhgZ3nm+KbMvdZ3Mp7tRPye9jD6aAPTmvPlKz9thKM14pSiGbo92kh0QleetC9XPwssyHfn5T8JxYiPpHYEN9Q== 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=flA5bHnaQEo0QyxD2X0SNRJvrJofnevNw0E5qvrZZpI=; b=AHNi0rOcWkGUw+fQwktPQO7C8fsvotloPxhZn4z6qBeGaGRExqKlMQEcHXw1vfNZJYSfN1A93pLfd+2uFnnqzEEUBWGC/+svNVEjiYtrgDmc2Zn7KdGcn0SyEQq9GIXAEEKXNEsglSHTER0oXP3JH/8atQ5Rbk0UDTV1gShOjmWVDYSe5dmHOciDve4RDRqKVJz2iw4L7S63DX9v6QNudPu2DaBSuQazyYezFg0G+O0ehTMMySWeXcvJSw3iu89vDWv4lsFOQjyB7HHmaJNc6gLJGi9UX7hrRPVcG+Tmd8dHLS3UdjC992pCf3UJmZJjTlysu/f3MvIUz4ScM0MrSg== 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=flA5bHnaQEo0QyxD2X0SNRJvrJofnevNw0E5qvrZZpI=; b=q446hBWv2ACX1HPepYB0BxPyFYp0qUzb2He+57oVPmFiHorKQEnowumrzxcU0Ix/3LF8aMyJGaARKzZvmGBU0f+B82zZMLHfCVMSw8GhGVGOkqfr25eE9lgvcCcDnOuFYgLRC0MwlipzPidwYsSx6FUIYUu/4N1kTzw40cMt1nc= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CO6PR10MB5791.namprd10.prod.outlook.com (2603:10b6:303:14c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.26; Thu, 19 Jun 2025 20:27:05 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%6]) with mapi id 15.20.8857.019; Thu, 19 Jun 2025 20:27:05 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: David Hildenbrand , Zi Yan , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Lance Yang , SeongJae Park , Suren Baghdasaryan Subject: [PATCH 3/5] mm/madvise: thread VMA range state through madvise_behavior Date: Thu, 19 Jun 2025 21:26:28 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0296.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a5::20) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CO6PR10MB5791:EE_ X-MS-Office365-Filtering-Correlation-Id: 9529d3a0-eaa4-4e15-717f-08ddaf6fa814 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?FKd6j4OGYzivhKGwd9yUVOLyfwmx/c34b8hSklaEdc9z0pl00fwl0FGMCCUs?= =?us-ascii?Q?CVxV4B5zje5eQ+DsAKNaa3VcCXIoiQskbFig73Hwjo+ObDFctzcWJ/LZCGjI?= =?us-ascii?Q?0x2JfByROYD3CXWfGj7H2NLB/YbP0qRpk92fL8aY5pViICbe6tOwk77mcd++?= =?us-ascii?Q?TYaqCEXdDTUrVfjx6tcCWjYjvaOtKiLn23w7JLoiCDrxDCZP8PzJX56U6Bcw?= =?us-ascii?Q?umhPS3t6gd9Zz5CYKtzdtp/1P6Ewz+/az3fRYxZa+rrzG+nls8uCEK+GFd0o?= =?us-ascii?Q?SCjeS5r+wpuiD7HX2pfbTAh52K/ZOYtRCbNaIclLbkBFbSWfjEVSGf/yE8t7?= =?us-ascii?Q?45Ly6C3rmsgqIOgeJFYCx3C2/01OaG6YQRWfp/4KJ3xHvEtKZRIetjfbyCyb?= =?us-ascii?Q?ESpkO8aC8h88KT/gg93gfuyVYgDt3Ze1pIl2KtejmKS4ohzWZsNZzN2FP+PP?= =?us-ascii?Q?kJfrtgcR6Mhu1h3Ek1P06+b4uDSor6OZEHlt7OIjjIjgn/M7PSZ8FpGTbU0Z?= =?us-ascii?Q?2N0XWP+n9D2Pxt1CU6UHvCO5gCvUmzW2O5Xl7vSLke3uTuGT/ppTW8F8JtPd?= =?us-ascii?Q?LKSKpROAuZFA3BQoyaSg7tG5c9eItfYl8jBAStctKAVdmat8hqoemTsJm/ht?= =?us-ascii?Q?q90CzoR22mmAzPVh91Ug2ukXkWZN+zbAeTWEbcPFwIMzwGvSpcizQq9xOBF7?= =?us-ascii?Q?i5OzDs2Mvq6I2XLPodR07qA/wrLjT6lyIvVdHt7IAgBarwQznmqwuLf1mbGr?= =?us-ascii?Q?JAOtYUKuKMQPq6cWuWntDWKpQyjI4gcKDRNXHf/tfXzWbwhCziMZglCqXVTz?= =?us-ascii?Q?Bdd8fxhI9kfHhl6XFN1a0Sw+JUt2jwyQi1NKR+i6VrMWh+0FTeppEgxsRGzt?= =?us-ascii?Q?MAocMrjJTU3epNfS87FQO5jT9rFmBHc0AjeMXIVTyR7sPC4KxwhXKrqIYBL6?= =?us-ascii?Q?SHxW5KXLEO2Vft+wgrTy1dU0DcgXn2fGMxCUDV/h3FedAJFrSHMggGgHty3p?= =?us-ascii?Q?5zn5ckyjv55Nw+EKLHdOu52n3QFYTGwdbk2hxRPirsHQBT/74KV1OTJbj8Zp?= =?us-ascii?Q?4+Sf/6qEu1XxMpe3v/czTu7UK0NigzZNzgBKLzB2tE8EYkLzM8/ZSATqcrUu?= =?us-ascii?Q?ADP5XEu7/SKh1M5fu59cr4UBtzcdx6BWprHcgBf9300OTqzT1H4oQNeXw8jd?= =?us-ascii?Q?fc8dc1OKRe5apTbUU4HJ1LvZI4aklNU9mBq43DnTw+BGdeOs4b8/sYHy5f1y?= =?us-ascii?Q?EiFBoADkDBOGj/zludUBew0d4Oev9rAC7sqa3dilNp1Ko0QJto1dIbYL0fEr?= =?us-ascii?Q?BBLOhG3kreCwSZuEx1ZUtTYhCsWfUa5Ocjaj1lh+4BB1pGdOWvLE4GuLJD0f?= =?us-ascii?Q?xu2g/I5QipNLEAiItFYqtLIGkOoZjpYYMOh0Ng5vkBVOF+gGqCaZ+KCGxL/s?= =?us-ascii?Q?QgJ79PBB/0E=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?C41q2LcBZ50i6PFlelUPZ14HwaJ7CT5MVC7kMR5MbomPP9VjYQPKSxwyEzvR?= =?us-ascii?Q?i5HkcVstInApcTyIOLeY2IEEUGJkoEj//yhRLrtDV7q7Cxqh4EocNzXxec+b?= =?us-ascii?Q?ox8l70a+tplhy9wb4d0lZNWXFX2o6SRJY95A9XHK+RpLExDMMMbd30mB6Vfk?= =?us-ascii?Q?ES4jACdkSwPOoW/fDCmC7FFae+3P6bHk643+Nm9vxlE8p2xA2vbD9aGSOvCn?= =?us-ascii?Q?PyY8JEOq+D+PjbVid5DPJtcLfhEEgTckbXCX1eIQ06Qm6Z7NjCUb9iJkU0BG?= =?us-ascii?Q?CSOpCD7CXgey4J85+e/rI+A6m+Okn9Oq3cBfHIMM7udEi3awL87rHAiOY0P+?= =?us-ascii?Q?fv8HVa0ndpnrMgL8ChGlixu0SH6hinNDCHuNcT3d8qKQQpRg0CiU4eP0A9ql?= =?us-ascii?Q?zZ6bhqRQ8wm2+pGeeYTdKFwZZQFEcL1+hps6HTk12MSDYjZ9ERWGrZSp1+ey?= =?us-ascii?Q?RndzfFnxQ9J49m9WgVOXRU2CX/Uw/jybezNLXMt0lSLeCwSchXpTLdC9Yx8Z?= =?us-ascii?Q?CukSvCdHHcR21n8QNhvjwj7catWmY9iHuOMxkvXb5dxfwdOtekgvnY+7gUN+?= =?us-ascii?Q?p3XWJgnydXSJEB1Dj5kcO2n9vlxaREn9+Ftj4ptuWA1zE1hJs1mPtSvE3TgS?= =?us-ascii?Q?c2KLKS/9wcBHa8zvLv7or8CREfoOzLk82aFYjKFKeXGf+SpqPQwE9PYPsiXu?= =?us-ascii?Q?GXhyjK1ErViS7f8bDOHuy7RSRq4d2m9MjgWOWcXmpg8fvcF2qWzkSqDvsb+4?= =?us-ascii?Q?lmZGIr5f6kXoSLMLTMvO6BbjRkRbey8V/5Z7hPvyGKrCUa99gN/mA00Uzepo?= =?us-ascii?Q?6kEfoaEnfQkVnysJ/VwLqj9cZef4gpZlug896VknQEMWyOyIiXg+lOlTszYU?= =?us-ascii?Q?s5eqo8NgmIeKELqaEgO8T2DXwmX24g7Dumx1PIdT+HpvWbbOH6ccZn5xJ7Mq?= =?us-ascii?Q?DB+Hu5SfZSu5k0p8gukGEjGhMM7jA/byrqKhH7BTRCv0LK6kUZZbx1kmaI78?= =?us-ascii?Q?rarOy2czgZJwr7EsMtTyIUPKCw4TVbunmgzbH89QbrFNwxFbsI4tdLrLbWxG?= =?us-ascii?Q?fIxt+h5wUMxLip+xn5ete/UByf1CjfEupM4gkoD5I9aSaHMaLOu0BZLIn2pw?= =?us-ascii?Q?C800vVxOVU/NIbLWTp8zNqJ1JFVSIZuHMaHkhCJuiH/NmRSHpOG6zh+XZHIV?= =?us-ascii?Q?amH+Cesf8CaNs9HNDBQIW1vR4tQMSxSXrcqouGKkUmKyUoGmXLvVhGG/R6db?= =?us-ascii?Q?Oe7ji7ckU6Rh+nlWDB8H2SEKTMNuY72U6bN3z1bCmRr7SsG5KuAdMjmLs+5g?= =?us-ascii?Q?QCoySclXD2HlCdd3VGrNMAiVD+uiyKme+/ZThHbLr9qFddVPFHGNa/NAz7eb?= =?us-ascii?Q?YTgHX2ZBilS9O2WQRx12nJGXjh+s81SJr8Af9JbipnOMDcSboOdGOqvEBwix?= =?us-ascii?Q?ySYWCK1kpXpmbD7/vi3fuVXcesLqoWUkIPCvzLQK4rpP2mqETXzt/hBCh6aN?= =?us-ascii?Q?Xka5Q/0OVIpZNob6pNZdO4K667GEMvGN0vv/yaxVw2Nnk9yYun6VPEgu+FST?= =?us-ascii?Q?oRHpz1ByEldE9CXl/McRR009XqykRu/5jOxEJ0nFg8ZufU1b+Fj5jFJo/Ejd?= =?us-ascii?Q?Pg=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: BNJOTeRKErybIv+ktXxHFiicSTMfebhONroyDRXX5tfBXazjdgxfh4gluaGFREwg5PScYFrz/j2CX9HQhkqkxbOEIqfnp0xvZ9odPTGHg8QwuQO158/YReJHmai8D2dvOmFVVtKiSGk54ZAqkVSEB4q6X9n1go1F/xELaPbdn5jrRWG0y42ZksRsnwupD7ZKmC6WwA2IaQ4agd9W24GVQSh0MvGevPcZEW2r/jR/KX55D7UD5bWDYmZm6roS/mHzUPl09P2VwMYSYkLBMups/O5z75KwXLttU/W+f0wfqI4c/wNjfkdqbjXFxRIeTAf1LewdINkIEVtm9k9vMY67GO8Iqx1MFiifLS/eTvrlt1ZfnJFHRftzZImpr0z/C7NX718oN+fwomFNHFMxKV5UAk65s5KfbI22nCWIzOCz5MabvD6aQjKSDdnDL/+fwmTiI9NisjNI8cOlwIS7cVwnoWqjqSqfn5xKPHz2hGFoMA7t/2wqoqJ9yS9+6X7YldMwcAR5QTP6bZmE3e151lFyVCMKtyNykX4hHztX6cPf6eSp4m8SybZtfuAMy8amOgzlBere7mZ5GpsCTOuO9UBMSnZpmOmNm0DrF9vn0FBYs2Q= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9529d3a0-eaa4-4e15-717f-08ddaf6fa814 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 20:27:05.4297 (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: dUZ72Br3f/+8+2OFsFXbTWv+UfXynoCLMmnQMemjz+cw2ruhTs1rHdnI5VekMFIWiPuEnqpiUTuAsMJ/bSu6RBasx0z/zMIyLdiA7uD2EJ0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR10MB5791 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-06-19_07,2025-06-18_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxlogscore=999 mlxscore=0 spamscore=0 malwarescore=0 adultscore=0 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506190167 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjE5MDE2OCBTYWx0ZWRfX54Iw5N+L3vKu 1YMWDpJ69k8CyHeATqXq4yKxmwh47Ueq/HxqDwBwYytEamV6zCTBw7x9cBg8V3BMd7zKos+hSMT yvSmFJRkhHAWPGbdygMsIdiLO2YPd/enrfTrp6o4jXRBYsRXeQzbL1zOsD/YHQ9zGIDUl0glKX0 Y2t9ApCshuFeU6jbs7ZWlOxnFjl1NduKC8tnghrdYXDhkdQbS6heySlhs6XDQ5gr6ErKfejh0Li BVu4RR1ovFWLUT/gxBwnex6TwkiP4XJjCa73bgJ9eWh1o+4KwqZtQnIwxmozbu16PyQDctQxOth sima5kZDSiOwyyGzvxy8/F5Etsq5ZFn65htODX/cwqnfxWh2BtuV4394qVXZKQ8jYdTnK6CbxP0 ljikzzq7ld6bsT3YFB9zZV8QISo7heVt2VplS4Di78l0DOmXCcddVk8yHuQu3ZgHsqgTDN00 X-Authority-Analysis: v=2.4 cv=K5EiHzWI c=1 sm=1 tr=0 ts=6854729d b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=GoEa3M9JfhUA:10 a=yPCof4ZbAAAA:8 a=06d9jRpDxHQBZIvN52cA:9 X-Proofpoint-GUID: WocHfbnH8aSqTUGDMZrQWqNUZ4vmN-bV X-Proofpoint-ORIG-GUID: WocHfbnH8aSqTUGDMZrQWqNUZ4vmN-bV Content-Type: text/plain; charset="utf-8" Rather than updating start and a confusing local parameter 'tmp' in madvise_walk_vmas(), instead store the current range being operated upon in the struct madvise_behavior helper object in a range pair and use this consistently in all operations. This makes it clearer what is going on and opens the door to further cleanup now we store state regarding what is currently being operated upon here. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- mm/madvise.c | 101 ++++++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 47485653c2a1..6faa38b92111 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -58,17 +58,26 @@ enum madvise_lock_mode { MADVISE_VMA_READ_LOCK, }; =20 +struct madvise_behavior_range { + unsigned long start, end; +}; + struct madvise_behavior { struct mm_struct *mm; int behavior; struct mmu_gather *tlb; enum madvise_lock_mode lock_mode; struct anon_vma_name *anon_name; + + /* + * The range over which the behaviour is currently being applied. If + * traversing multiple VMAs, this is updated for each. + */ + struct madvise_behavior_range range; }; =20 #ifdef CONFIG_ANON_VMA_NAME -static int madvise_walk_vmas(unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior); +static int madvise_walk_vmas(struct madvise_behavior *madv_behavior); =20 struct anon_vma_name *anon_vma_name_alloc(const char *name) { @@ -149,8 +158,9 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigne= d long start, =20 madv_behavior.behavior =3D anon_name ? __MADV_SET_ANON_VMA_NAME : __MADV_CLEAR_ANON_VMA_NAME; - - return madvise_walk_vmas(start, end, &madv_behavior); + madv_behavior.range.start =3D start; + madv_behavior.range.end =3D end; + return madvise_walk_vmas(&madv_behavior); } =20 static bool is_anon_vma_name(int behavior) @@ -1012,12 +1022,13 @@ static long madvise_dontneed_free(struct vm_area_st= ruct *vma, return -EINVAL; } =20 -static long madvise_populate(unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior) +static long madvise_populate(struct madvise_behavior *madv_behavior) { struct mm_struct *mm =3D madv_behavior->mm; const bool write =3D madv_behavior->behavior =3D=3D MADV_POPULATE_WRITE; int locked =3D 1; + unsigned long start =3D madv_behavior->range.start; + unsigned long end =3D madv_behavior->range.end; long pages; =20 while (start < end) { @@ -1308,12 +1319,13 @@ static long madvise_guard_remove(struct vm_area_str= uct *vma, */ static int madvise_vma_behavior(struct vm_area_struct *vma, struct vm_area_struct **prev, - unsigned long start, unsigned long end, struct madvise_behavior *madv_behavior) { int behavior =3D madv_behavior->behavior; struct anon_vma_name *anon_name =3D madv_behavior->anon_name; vm_flags_t new_flags =3D vma->vm_flags; + unsigned long start =3D madv_behavior->range.start; + unsigned long end =3D madv_behavior->range.end; int error; =20 if (unlikely(!can_modify_vma_madv(vma, behavior))) @@ -1425,10 +1437,11 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, /* * Error injection support for memory error handling. */ -static int madvise_inject_error(unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior) +static int madvise_inject_error(struct madvise_behavior *madv_behavior) { unsigned long size; + unsigned long start =3D madv_behavior->range.start; + unsigned long end =3D madv_behavior->range.end; =20 if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -1482,8 +1495,7 @@ static bool is_memory_failure(struct madvise_behavior= *madv_behavior) =20 #else =20 -static int madvise_inject_error(unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior) +static int madvise_inject_error(struct madvise_behavior *madv_behavior) { return 0; } @@ -1565,20 +1577,20 @@ static bool process_madvise_remote_valid(int behavi= or) * If a VMA read lock could not be acquired, we return NULL and expect cal= ler to * fallback to mmap lock behaviour. */ -static struct vm_area_struct *try_vma_read_lock(struct mm_struct *mm, - struct madvise_behavior *madv_behavior, - unsigned long start, unsigned long end) +static +struct vm_area_struct *try_vma_read_lock(struct madvise_behavior *madv_beh= avior) { + struct mm_struct *mm =3D madv_behavior->mm; struct vm_area_struct *vma; =20 - vma =3D lock_vma_under_rcu(mm, start); + vma =3D lock_vma_under_rcu(mm, madv_behavior->range.start); if (!vma) goto take_mmap_read_lock; /* * Must span only a single VMA; uffd and remote processes are * unsupported. */ - if (end > vma->vm_end || current->mm !=3D mm || + if (madv_behavior->range.end > vma->vm_end || current->mm !=3D mm || userfaultfd_armed(vma)) { vma_end_read(vma); goto take_mmap_read_lock; @@ -1600,13 +1612,13 @@ static struct vm_area_struct *try_vma_read_lock(str= uct mm_struct *mm, * Must be called with the mmap_lock held for reading or writing. */ static -int madvise_walk_vmas(unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior) +int madvise_walk_vmas(struct madvise_behavior *madv_behavior) { struct mm_struct *mm =3D madv_behavior->mm; + struct madvise_behavior_range *range =3D &madv_behavior->range; + unsigned long end =3D range->end; struct vm_area_struct *vma; struct vm_area_struct *prev; - unsigned long tmp; int unmapped_error =3D 0; int error; =20 @@ -1615,11 +1627,10 @@ int madvise_walk_vmas(unsigned long start, unsigned= long end, * tentatively, avoiding walking VMAs. */ if (madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK) { - vma =3D try_vma_read_lock(mm, madv_behavior, start, end); + vma =3D try_vma_read_lock(madv_behavior); if (vma) { prev =3D vma; - error =3D madvise_vma_behavior(vma, &prev, start, end, - madv_behavior); + error =3D madvise_vma_behavior(vma, &prev, madv_behavior); vma_end_read(vma); return error; } @@ -1630,8 +1641,8 @@ int madvise_walk_vmas(unsigned long start, unsigned l= ong end, * ranges, just ignore them, but return -ENOMEM at the end. * - different from the way of handling in mlock etc. */ - vma =3D find_vma_prev(mm, start, &prev); - if (vma && start > vma->vm_start) + vma =3D find_vma_prev(mm, range->start, &prev); + if (vma && range->start > vma->vm_start) prev =3D vma; =20 for (;;) { @@ -1640,32 +1651,29 @@ int madvise_walk_vmas(unsigned long start, unsigned= long end, return -ENOMEM; =20 /* Here start < (end|vma->vm_end). */ - if (start < vma->vm_start) { + if (range->start < vma->vm_start) { unmapped_error =3D -ENOMEM; - start =3D vma->vm_start; - if (start >=3D end) + range->start =3D vma->vm_start; + if (range->start >=3D end) break; } =20 - /* Here vma->vm_start <=3D start < (end|vma->vm_end) */ - tmp =3D vma->vm_end; - if (end < tmp) - tmp =3D end; + /* Here vma->vm_start <=3D range->start < (end|vma->vm_end) */ + range->end =3D min(vma->vm_end, end); =20 - /* Here vma->vm_start <=3D start < tmp <=3D (end|vma->vm_end). */ - error =3D madvise_vma_behavior(vma, &prev, start, tmp, - madv_behavior); + /* Here vma->vm_start <=3D range->start < range->end <=3D (end|vma->vm_e= nd). */ + error =3D madvise_vma_behavior(vma, &prev, madv_behavior); if (error) return error; - start =3D tmp; - if (prev && start < prev->vm_end) - start =3D prev->vm_end; - if (start >=3D end) + range->start =3D range->end; + if (prev && range->start < prev->vm_end) + range->start =3D prev->vm_end; + if (range->start >=3D range->end) break; if (prev) vma =3D find_vma(mm, prev->vm_end); else /* madvise_remove dropped mmap_lock */ - vma =3D find_vma(mm, start); + vma =3D find_vma(mm, range->start); } =20 return unmapped_error; @@ -1846,22 +1854,23 @@ static int madvise_do_behavior(unsigned long start,= size_t len_in, struct madvise_behavior *madv_behavior) { struct blk_plug plug; - unsigned long end; int error; + struct madvise_behavior_range *range =3D &madv_behavior->range; =20 if (is_memory_failure(madv_behavior)) { - end =3D start + len_in; - return madvise_inject_error(start, end, madv_behavior); + range->start =3D start; + range->end =3D start + len_in; + return madvise_inject_error(madv_behavior); } =20 - start =3D get_untagged_addr(madv_behavior->mm, start); - end =3D start + PAGE_ALIGN(len_in); + range->start =3D get_untagged_addr(madv_behavior->mm, start); + range->end =3D range->start + PAGE_ALIGN(len_in); =20 blk_start_plug(&plug); if (is_madvise_populate(madv_behavior)) - error =3D madvise_populate(start, end, madv_behavior); + error =3D madvise_populate(madv_behavior); else - error =3D madvise_walk_vmas(start, end, madv_behavior); + error =3D madvise_walk_vmas(madv_behavior); blk_finish_plug(&plug); return error; } --=20 2.49.0 From nobody Thu Oct 9 04:43:22 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AAC0728C020 for ; Thu, 19 Jun 2025 20:27:39 +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=1750364861; cv=fail; b=anBh5ZzYrHS3QOdVDGKt0qKxny+AGXPXNxH1RQ2M0GapCwkY2s/5r3bnemmaACq4Hel+58SkWTu3AMTWJGs3lFGSG8HDWc3lIlDJanKP+lB+KSBWpo7hoEOOWWzZ9+2WpbpXlpJitu7CPe2Sh5Tc+XbBL0oGKxLefH9Yclcfrm4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750364861; c=relaxed/simple; bh=qt6SC03XVMrHDelV+VGEdVST+NwA2m+1JVHLicIJ7OE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=IzBX47zTS0Sf7KP/Xu35/N1LFPkmGWJqmOadeJbFIuamcN/HQ7yuvKSL+hE+weSxerUZsI7v7TByqVeLuLxmY0ysPDxhv6NDRRhLQhUMC9A5ekxkHZdru+tzm87zyn9V7rGQ4jEWih0VEh5xVvm48TFxP582gONA1mk83+dMmXM= 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=MuR5t5Nb; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=wPUvp9EZ; 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="MuR5t5Nb"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="wPUvp9EZ" Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55JIfcdD024029; Thu, 19 Jun 2025 20:27:18 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-2025-04-25; bh=BLNjzKfOtqQbmhieFH2UfsuRD7cBNC89f2+1XhpaX7A=; b= MuR5t5NbLxT2Y4Gs8LsuVCDNGtVyY3RMiGRqfQBjlsq2PEo3KV4+OfUGZLMjN2tS pAzT0OgAARTv4w+pB1DQ7c+TGTeoVWVws0h1mvWi+iUV1muA7+njyTi70Ep044kq Dcj9NJaL1Y/TGzS392EPh7qAMuL5kGE4gbhHPexJdgdTXdzUFONEv4Z38mdBtyUy M2SNZvTIlvkKzV/oor7O0KOH3Eiw8Vf7jvtZXt31f5WaeJ+7EGzbKD5S0wv4yFF5 AwRzfSrcKYcsCJxwt01QQzqqDqPrMHQua5rsOBHNCQ4225sa2T8VoGLiRjkmVj81 6ICHBCK0mtLe+h+KaAy//Q== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4790ydag25-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:17 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 55JIO74J018273; Thu, 19 Jun 2025 20:27:16 GMT Received: from bn8pr05cu002.outbound.protection.outlook.com (mail-eastus2azon11011065.outbound.protection.outlook.com [52.101.57.65]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 478yhc7p3a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:16 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Z2IUSfLUqa20rtxTvwpxid0CEfFXoWOxSfoiJFti/hbC4duChjudVLVU3BzIDOJ+AoKvI1hw3vsoomrp8YjUEc8OhkdL/90H1RzEDai6nnoo2WDacSCBGL8NyuN9hFJSJeBH1jHni3z6Mu7e1a79qXA8F25Bh8QS2WwQAXzIh+0JhhFOPXihCNOcG5r4DZgbPOVZNRRWuwvC22nmk1nJPDGrnJ/BcOE+P+91XFjlidhNx8UokICDRxzEl7un8oM/CBEa9dvR9vJhE6m4PY+aW6yZXx3cdu3Ep8HZFpSAtXD9CseBTIj4hgJC56Vk+HCltZs2fugfca3u1mjACMkQZQ== 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=BLNjzKfOtqQbmhieFH2UfsuRD7cBNC89f2+1XhpaX7A=; b=x+LJK8KXYyt+oXJvXT2mG4m+nzcrrpxMnfVy/kvCSJ7HLtp+MMz3ekbb2rADXCGLOYPj4lUKCs0d6aMsu9cwVtimviVGJH3akTu3k9+2FSDz0GLlet8TPE+tUhoHYdNfxuu7na7hvHxW6yEHfrGLu7+UoKHkvwYJM6CHA2iS7LExlRF2Irfssu+OLwZJ6ycIQeSoS6AryZSDbjjoHB7LSGS7Sxa+lK23gKMnsrFW+eYq/h/FwO6/dg00q37C9TbE/Q+rG6L1bgglUq1aeKGQ8pWnxHrEJzS4sX3u5Dh4wt+kJZW+r/w8tvaMF4nCByo8nCSlGkcp0HkBdta9gr2DQg== 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=BLNjzKfOtqQbmhieFH2UfsuRD7cBNC89f2+1XhpaX7A=; b=wPUvp9EZUAEb+pYA6KQZeFR8evbE2XBBYCx9qrUITeTHyrLRi18naLRSEw6lPjsrOexSAs2Rbk30O6OycnFe8BMJGYx2NRfC6/t92twLGWxffWQJxsEGs1eIkZfivJn2xXbv9LOM2s/qIGjC3I+04yASYzDlujHUWmR0dc+EjHk= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CO6PR10MB5791.namprd10.prod.outlook.com (2603:10b6:303:14c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.26; Thu, 19 Jun 2025 20:27:07 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%6]) with mapi id 15.20.8857.019; Thu, 19 Jun 2025 20:27:07 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: David Hildenbrand , Zi Yan , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Lance Yang , SeongJae Park , Suren Baghdasaryan Subject: [PATCH 4/5] mm/madvise: thread all madvise state through madv_behavior Date: Thu, 19 Jun 2025 21:26:29 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0018.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:62::30) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CO6PR10MB5791:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c064e48-36ac-4d54-9a9e-08ddaf6fa974 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|7416014|366016; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?of0ufQP2eOymHnoGP0xiGnCpqf8eX61ifLlcPU+FazvpxtrtxXFRpRMbfgoK?= =?us-ascii?Q?q13G1OGm1f59WPZuCtPgrvn+vQIxs6xPSAVpMnO0/BbykJkU0MdMtmXo6FyS?= =?us-ascii?Q?zB0i7KUlN27lgkufoix0eTQqpTMC6+RvEJvikms8xGg95I1A5Ba/Wb0ivEwH?= =?us-ascii?Q?+0qFqRVs9uV2jBA7KxzBAQld9yW82nHOQlDJDy/0Okd/lwLLV8EFFLA0MkVq?= =?us-ascii?Q?FQAFCuCy/5nE32n9VWdv43FQPR4KyWM/bvUIpKgJAlfSk5jX5t/QbcgBmL3m?= =?us-ascii?Q?1J6tGwoYnG3MafvHhYMC7lt/Bk71kr6urMS348Gym5I9fDp7CK1wAKCj/uf8?= =?us-ascii?Q?0w9aCrG+ICfkdjaWyR3iZdWj3Rn41dVUl1yex6nqY4rj+fZompkNJYiHu7v3?= =?us-ascii?Q?rxl75D+YZekp2HaP7NBCUKARSQ+E2AXLWgaG/R2AwmjfI2OEJYgSW8Mfm3G5?= =?us-ascii?Q?d+2njqJexVKzd302aRV5MP1q2rmzeDa8tvG5KXTa72siRYYRsZ7sv1ZI1hKu?= =?us-ascii?Q?0uEGszMew1jsnQBazTmtSqr5HEpCl/h8QdbvIDbuVSc2JzjN4wRTCSUjstuO?= =?us-ascii?Q?9WknAFTMQuBAqBD7lC8XEQTKG59Vi/Ypx/Lb/VmQpvUgWXTxn4ZPn1/j/aTS?= =?us-ascii?Q?mdSnBZg4GCbtf92Kcmdh5XxtYkPh8rCBVLpBYfHGVNfn+FV8RzVbfqUpPa0k?= =?us-ascii?Q?crfnupDXwKJ4XPfkr7wpdGIvv8uL7eDXKWsTpq2Rm809P9kU7n8khsjqpBcs?= =?us-ascii?Q?JMYS4GqfSsg9ZQdSZqDxDwEhzrfOI9YPoJD76bMCgBHfBLtpwmPxtOBMWRNH?= =?us-ascii?Q?bEqrCz9RNcnbRYC74zM3qBfXBvIdLAQY22zFibiUwok9dGtVLnNityaZ6DYn?= =?us-ascii?Q?+Zax7GsPpwcD1PstVy4jd9LUf/gZFCZakUXWf8yGhaiqLiM8Ja5J5atv3VQa?= =?us-ascii?Q?et2xoU7sSQItD13SAiKLm1yPniLGrv2Tbn1d3UICsgfOViUXWjDTZ9D/HYHo?= =?us-ascii?Q?wW9hETcP9jvU/n70stkuFk+iTcapu9COTqBAh/a1v3Z8dm88yKYm6P29Y1xq?= =?us-ascii?Q?OM8OgD8uFy7nF0Vlja8BjESI5WhA6yfZNqu5TnHJ8GYSsg9UNI6jUqyISTAG?= =?us-ascii?Q?xaeTozEq1tooXpfNSkAwPHtLONQkv22sPHAdJ1nZP0qbP94AV4ufsfEw8GIu?= =?us-ascii?Q?M8wNXiUrkjcQwSju1UJ82zA62HK6C6FfnYCRm6MGEoTgmhNuFRV1JJaw8ufE?= =?us-ascii?Q?mTyslBXblnz2dEdLEgBSO8zhq5WcmEkgtLPj/cx/fW0/lGz6ACA1ZMDXF6bK?= =?us-ascii?Q?Q/B0PJ5Wjox6PFShaDhiIL5E+757JFDH4xcnA4vYxt7OuB/xQhlBrHaRsdPH?= =?us-ascii?Q?mn5OGab0ilNDfa7YumilMi0N/fkn1nXb+sppIsyQVQ8VRTu8vepu52iQ9L6l?= =?us-ascii?Q?S/I7UTcI8gU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(7416014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?bcd/LPASQ/0A5gBOn48irEhz/NSYE0/DvtnhtZkEpHuTOD2ZmxYlKHYMa4mU?= =?us-ascii?Q?E52YcaU5iBoP7f8qJSKiRpyUmasS4g8e2ypywEi+Cp7M26nOjOS1NBLi7zOP?= =?us-ascii?Q?D8bXvRq8kP+B2vRYNHvec22oDqRUjRUrJv6dwGgFlBqgmu3wVBvPiGR8Uw9S?= =?us-ascii?Q?2w5tseK4iHt586euA8fw2z2bioLTkVEiml4d+vrNkH6Qf1BZgAyRtYpsSX5b?= =?us-ascii?Q?BgCQO+M3PH5hVJ5WZs+It6TqJYJRpginJkJzsarXe1aOs/JjosNgr+erJqTm?= =?us-ascii?Q?wRx/JmFaXHSeIoWTdkYVYBaFeSxM4RYL2HiaJ74IHyJeNZaraqAFfBzcOvyp?= =?us-ascii?Q?mC7sOc/uWBVbNred7LNX/PVgLVNPBmEwf9KUEK99OHK71vSvrFWV3Zb/bwBy?= =?us-ascii?Q?7hWpoHTuBrKyM2g/Ls4DalyYPW9Fw6HCttuDzXcd0Jvr50I9kRRtm/SwYaVn?= =?us-ascii?Q?t4IyFIaYxTLUS4MXC4Fe+KNh3NUAeGJ+TK2YXw+5Y9gjblsgwQZoHCmwb635?= =?us-ascii?Q?oxFHwzl19orkx/q3rs+0QoF2nFaGU1bA4TvIBuz7Nb2Wsx+e7UjMYwBT2pK6?= =?us-ascii?Q?H/sONOAVxQ35Db9M1LdTVmPsGd6L9OQfG1JrA70a71CWEmq3X6E2aqfzcftj?= =?us-ascii?Q?5tYmS8VpeNUCFvQx7rfs1qRwMHiamaOkcBH4d+iNdfcDpgyFBWL/WhF4P0w6?= =?us-ascii?Q?PNgABuQ7bFtLbbaQ526A/v72wY+iIszDrioPklDrnXsUez4bHD8ahlowBvw3?= =?us-ascii?Q?1trxe3uGM7ZUMYo+Yhl0bkelJVqVDYnUWdVrkR6HbemwEU+UJ/SE9bYtNnUf?= =?us-ascii?Q?o8UhiQ6VeF5jUnoI7iQtP+ThAxccJXOnhFADdrMmtjv4AQ4v3Mxb0AKO8rYy?= =?us-ascii?Q?Lr7FoyUeptocw/mejoNUzisB/790ftknw48eeyCDpxPYZNjmgpif5L4fKoNt?= =?us-ascii?Q?Hd5rtof6bGlDMJq9XK3svf63ivP0sP0qjABiPSrIq9MvhigwOgem3dV+OTn9?= =?us-ascii?Q?MFPTDI84yNP5QC3/bFn7GHVqdYM8S8nLbU3UxLjuJt+hLcF58F8F09fNBJJI?= =?us-ascii?Q?BMey4aLWXMlnlfwYsbR6jFAsohg7ebgxQg3sS007nKpr6OzedNTaTQdafq23?= =?us-ascii?Q?ESFaXwBFYSXElloCSCwsDBrWr+QFh959cI+J3h+/64JOQdU80YJEXSbef3nn?= =?us-ascii?Q?g+cKtxd+6rspZTXvsgK6jlC+NZKzbEKxKqUFcLq1G0RLAM4L0+YnCbHh+zKg?= =?us-ascii?Q?cWsF/pEVsOhivHRBqpoUmk+9x0wOmNSPmtuvPUn11A0qG64iAu3xU8+KBM6J?= =?us-ascii?Q?KG61d15t6aaL2pyxP0h4Yl0XRNO+lXKPtnwRFcC4XYJh0w5hDHIAXo/FpIRJ?= =?us-ascii?Q?SmTv6ToTY6OjAOW2R31YhxDiERzib5HBf85Dtjm7hVySCVfARK3UPzfVjFJj?= =?us-ascii?Q?1LObzvHWT0pgmZvLDBB2O7iCQWyGyUAF7/iQJweroHHhjWZXxB1HwsohR898?= =?us-ascii?Q?rcIh6QlC0YLZVac81KEisW4DXe0MIK6PUWUQesrhT9WiZ48EqduuvMYdj0D8?= =?us-ascii?Q?7O7hCeee3gUECzU8Y5WFCsUn5NMrj6Nt8fttbZr44QiTUA4zdnyBcXBx8lVL?= =?us-ascii?Q?9Q=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: mYB3J+YGEDa9n4Jhni7p4SZ+NcuUAE7g4qWPwrHQ7rRX4WIunifrQ5JQYn28qE6hoTwSV7ce1pRrlZpHk1/6CuMcA93qtpq/VbdODpqwdqNrwL4Gip+vgVXscjb7BvXAOUqRl7lzIcjlBsKjU0tUopmiyeuQeSkJzFKFm8m9qq3qUYCfBetPW3jEocZMafaea3gMcZ48BrYHGkIb9aSp8TTK/yS4r+lQhtZBvvnNTjQIEYpcMQRYsDrNH685xKC0Z//t1KQpJGwv5DngynechM6pZ6hEGreV6tWvHgZ6aP8+5SchwrEdI0p+SgO2pMFzDJaMiqgfpK+N7qCufvqAnGXCvT9NOK+c9g8ZuObha6iFJk32iFEmDUn81wWcqyHiDD5ZKz96POma2jqy4eJsb0M/ny/5vjK7yvScH8cqIKcX7n6RQmrpy4tCnMwKAL1crZueWJBjTfSb1KdbRAejJvVU8A1F86QIti7Pm59fEz8Jmhx3PjWMz+G0KobWWFbtsqmvxsDy2SSplHj53uE5BkJjqqD1PeIEFbxthqeSwTbD9oBvrb+Knlsk9JIjNFpDvbMNEAqpYGWtrWQ5GI/H1VAgkFel0nOZtshzLkM3FVQ= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2c064e48-36ac-4d54-9a9e-08ddaf6fa974 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 20:27:07.7701 (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: B9yVMUEPdTadvLaF8XJQKXDzWkeXTSZqvl75g/7JNm3tpj5kuAVK5dkCqaOLrOYz3n0zhFwsJPiSjFGZpw6v1yfgWxy6tsWgO9bOx79LqKc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO6PR10MB5791 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-06-19_07,2025-06-18_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxlogscore=999 mlxscore=0 spamscore=0 malwarescore=0 adultscore=0 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506190167 X-Proofpoint-GUID: fJ_F_ZAohhAas9Ez0sOlYHQz4PblKm8k X-Proofpoint-ORIG-GUID: fJ_F_ZAohhAas9Ez0sOlYHQz4PblKm8k X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjE5MDE2OCBTYWx0ZWRfX19dp+nCk0wcc OOp3bx5lR07Cu4Owyv7RTo3ZS4FVtJ9CZguclcyjNq4H1AKTUQC56rhzGicdMQ4G+tVjvccZsNg 7PnOh3RXYTXxUmTn+CUvLhSF50/0/c3CW+wU5vl7QRwOB4n9Ff6j7ew+dKkhRJN0u6AoHlAy5x1 xuxb5Dgf6l4DoRlI5x5aU/GNrfNbllm04VCqIrCs1MT+jI9ENCe2lz9KfF+U0A9rFedqCZLOTws 2sgrfhh7kJdMsktG73cZJ8QcNodhf/2Bjsopv39EEo3divo8i+oI1MtZbkD6iwstXe59sncf3Ov OxXhHs87iRsZ/5W79sAd7lXOzZ34TD1D0MRQOciWyaWBdzjXX2iC57s+cmFbs+eS2CCzgKJhjJp DuLTy1o/K1qXai82mIjf8XaASwVCaVSPxmZPxlGdIfsAazunyx/iMI+36F1C8/MTpnGerAD4 X-Authority-Analysis: v=2.4 cv=XZGJzJ55 c=1 sm=1 tr=0 ts=685472a5 b=1 cx=c_pps a=WeWmnZmh0fydH62SvGsd2A==:117 a=WeWmnZmh0fydH62SvGsd2A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=GoEa3M9JfhUA:10 a=yPCof4ZbAAAA:8 a=CkUed0vcNEhkOZWgjIkA:9 Content-Type: text/plain; charset="utf-8" Doing so means we can get rid of all the weird struct vm_area_struct **prev stuff, everything becomes consistent and in future if we want to make change to behaviour there's a single place where all relevant state is stored. This also allows us to update try_vma_read_lock() to be a little more succinct and set up state for us, as well as cleaning up madvise_update_vma(). We also update the debug assertion prior to madvise_update_vma() to assert that this is a write operation as correctly pointed out by Barry in the relevant thread. We can't reasonably update the madvise functions that live outside of mm/madvise.c so we leave those as-is. Signed-off-by: Lorenzo Stoakes Acked-by: Zi Yan Reviewed-by: Vlastimil Babka --- mm/madvise.c | 283 ++++++++++++++++++++++++++------------------------- 1 file changed, 146 insertions(+), 137 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 6faa38b92111..86fe04aa7c88 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -74,6 +74,8 @@ struct madvise_behavior { * traversing multiple VMAs, this is updated for each. */ struct madvise_behavior_range range; + /* The VMA and VMA preceding it (if applicable) currently targeted. */ + struct vm_area_struct *prev, *vma; }; =20 #ifdef CONFIG_ANON_VMA_NAME @@ -194,26 +196,27 @@ static bool is_anon_vma_name(int behavior) * Caller should ensure anon_name stability by raising its refcount even w= hen * anon_name belongs to a valid vma because this function might free that = vma. */ -static int madvise_update_vma(struct vm_area_struct *vma, - struct vm_area_struct **prev, unsigned long start, - unsigned long end, vm_flags_t new_flags, - struct anon_vma_name *anon_name) +static int madvise_update_vma(vm_flags_t new_flags, + struct madvise_behavior *madv_behavior) { - struct mm_struct *mm =3D vma->vm_mm; int error; - VMA_ITERATOR(vmi, mm, start); + struct vm_area_struct *vma =3D madv_behavior->vma; + struct madvise_behavior_range *range =3D &madv_behavior->range; + struct anon_vma_name *anon_name =3D madv_behavior->anon_name; + VMA_ITERATOR(vmi, madv_behavior->mm, range->start); =20 if (new_flags =3D=3D vma->vm_flags && anon_vma_name_eq(anon_vma_name(vma)= , anon_name)) { - *prev =3D vma; + madv_behavior->prev =3D vma; return 0; } =20 - vma =3D vma_modify_flags_name(&vmi, *prev, vma, start, end, new_flags, - anon_name); + vma =3D vma_modify_flags_name(&vmi, madv_behavior->prev, vma, + range->start, range->end, new_flags, anon_name); if (IS_ERR(vma)) return PTR_ERR(vma); =20 - *prev =3D vma; + madv_behavior->vma =3D vma; + madv_behavior->prev =3D vma; =20 /* vm_flags is protected by the mmap_lock held in write mode. */ vma_start_write(vma); @@ -318,15 +321,16 @@ static void shmem_swapin_range(struct vm_area_struct = *vma, /* * Schedule all required I/O operations. Do not wait for completion. */ -static long madvise_willneed(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end) +static long madvise_willneed(struct madvise_behavior *madv_behavior) { - struct mm_struct *mm =3D vma->vm_mm; + struct vm_area_struct *vma =3D madv_behavior->vma; + struct mm_struct *mm =3D madv_behavior->mm; struct file *file =3D vma->vm_file; + unsigned long start =3D madv_behavior->range.start; + unsigned long end =3D madv_behavior->range.end; loff_t offset; =20 - *prev =3D vma; + madv_behavior->prev =3D vma; #ifdef CONFIG_SWAP if (!file) { walk_page_range_vma(vma, start, end, &swapin_walk_ops, vma); @@ -355,7 +359,7 @@ static long madvise_willneed(struct vm_area_struct *vma, * vma's reference to the file) can go away as soon as we drop * mmap_lock. */ - *prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ + madv_behavior->prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ get_file(file); offset =3D (loff_t)(start - vma->vm_start) + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); @@ -620,16 +624,19 @@ static const struct mm_walk_ops cold_walk_ops =3D { }; =20 static void madvise_cold_page_range(struct mmu_gather *tlb, - struct vm_area_struct *vma, - unsigned long addr, unsigned long end) + struct madvise_behavior *madv_behavior) + { + struct vm_area_struct *vma =3D madv_behavior->vma; + struct madvise_behavior_range *range =3D &madv_behavior->range; struct madvise_walk_private walk_private =3D { .pageout =3D false, .tlb =3D tlb, }; =20 tlb_start_vma(tlb, vma); - walk_page_range_vma(vma, addr, end, &cold_walk_ops, &walk_private); + walk_page_range_vma(vma, range->start, range->end, &cold_walk_ops, + &walk_private); tlb_end_vma(tlb, vma); } =20 @@ -638,28 +645,26 @@ static inline bool can_madv_lru_vma(struct vm_area_st= ruct *vma) return !(vma->vm_flags & (VM_LOCKED|VM_PFNMAP|VM_HUGETLB)); } =20 -static long madvise_cold(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start_addr, unsigned long end_addr) +static long madvise_cold(struct madvise_behavior *madv_behavior) { - struct mm_struct *mm =3D vma->vm_mm; + struct vm_area_struct *vma =3D madv_behavior->vma; struct mmu_gather tlb; =20 - *prev =3D vma; + madv_behavior->prev =3D vma; if (!can_madv_lru_vma(vma)) return -EINVAL; =20 lru_add_drain(); - tlb_gather_mmu(&tlb, mm); - madvise_cold_page_range(&tlb, vma, start_addr, end_addr); + tlb_gather_mmu(&tlb, madv_behavior->mm); + madvise_cold_page_range(&tlb, madv_behavior); tlb_finish_mmu(&tlb); =20 return 0; } =20 static void madvise_pageout_page_range(struct mmu_gather *tlb, - struct vm_area_struct *vma, - unsigned long addr, unsigned long end) + struct vm_area_struct *vma, + struct madvise_behavior_range *range) { struct madvise_walk_private walk_private =3D { .pageout =3D true, @@ -667,18 +672,17 @@ static void madvise_pageout_page_range(struct mmu_gat= her *tlb, }; =20 tlb_start_vma(tlb, vma); - walk_page_range_vma(vma, addr, end, &cold_walk_ops, &walk_private); + walk_page_range_vma(vma, range->start, range->end, &cold_walk_ops, + &walk_private); tlb_end_vma(tlb, vma); } =20 -static long madvise_pageout(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start_addr, unsigned long end_addr) +static long madvise_pageout(struct madvise_behavior *madv_behavior) { - struct mm_struct *mm =3D vma->vm_mm; struct mmu_gather tlb; + struct vm_area_struct *vma =3D madv_behavior->vma; =20 - *prev =3D vma; + madv_behavior->prev =3D vma; if (!can_madv_lru_vma(vma)) return -EINVAL; =20 @@ -693,8 +697,8 @@ static long madvise_pageout(struct vm_area_struct *vma, return 0; =20 lru_add_drain(); - tlb_gather_mmu(&tlb, mm); - madvise_pageout_page_range(&tlb, vma, start_addr, end_addr); + tlb_gather_mmu(&tlb, madv_behavior->mm); + madvise_pageout_page_range(&tlb, vma, &madv_behavior->range); tlb_finish_mmu(&tlb); =20 return 0; @@ -857,11 +861,12 @@ static inline enum page_walk_lock get_walk_lock(enum = madvise_lock_mode mode) } } =20 -static int madvise_free_single_vma(struct madvise_behavior *madv_behavior, - struct vm_area_struct *vma, - unsigned long start_addr, unsigned long end_addr) +static int madvise_free_single_vma(struct madvise_behavior *madv_behavior) { - struct mm_struct *mm =3D vma->vm_mm; + struct mm_struct *mm =3D madv_behavior->mm; + struct vm_area_struct *vma =3D madv_behavior->vma; + unsigned long start_addr =3D madv_behavior->range.start; + unsigned long end_addr =3D madv_behavior->range.end; struct mmu_notifier_range range; struct mmu_gather *tlb =3D madv_behavior->tlb; struct mm_walk_ops walk_ops =3D { @@ -913,25 +918,28 @@ static int madvise_free_single_vma(struct madvise_beh= avior *madv_behavior, * An interface that causes the system to free clean pages and flush * dirty pages is already available as msync(MS_INVALIDATE). */ -static long madvise_dontneed_single_vma(struct madvise_behavior *madv_beha= vior, - struct vm_area_struct *vma, - unsigned long start, unsigned long end) +static long madvise_dontneed_single_vma(struct madvise_behavior *madv_beha= vior) + { + struct madvise_behavior_range *range =3D &madv_behavior->range; struct zap_details details =3D { .reclaim_pt =3D true, .even_cows =3D true, }; =20 zap_page_range_single_batched( - madv_behavior->tlb, vma, start, end - start, &details); + madv_behavior->tlb, madv_behavior->vma, range->start, + range->end - range->start, &details); return 0; } =20 -static bool madvise_dontneed_free_valid_vma(struct vm_area_struct *vma, - unsigned long start, - unsigned long *end, - int behavior) +static +bool madvise_dontneed_free_valid_vma(struct madvise_behavior *madv_behavio= r) { + struct vm_area_struct *vma =3D madv_behavior->vma; + int behavior =3D madv_behavior->behavior; + struct madvise_behavior_range *range =3D &madv_behavior->range; + if (!is_vm_hugetlb_page(vma)) { unsigned int forbidden =3D VM_PFNMAP; =20 @@ -943,7 +951,7 @@ static bool madvise_dontneed_free_valid_vma(struct vm_a= rea_struct *vma, =20 if (behavior !=3D MADV_DONTNEED && behavior !=3D MADV_DONTNEED_LOCKED) return false; - if (start & ~huge_page_mask(hstate_vma(vma))) + if (range->start & ~huge_page_mask(hstate_vma(vma))) return false; =20 /* @@ -952,41 +960,40 @@ static bool madvise_dontneed_free_valid_vma(struct vm= _area_struct *vma, * Avoid unexpected data loss by rounding down the number of * huge pages freed. */ - *end =3D ALIGN_DOWN(*end, huge_page_size(hstate_vma(vma))); + range->end =3D ALIGN_DOWN(range->end, huge_page_size(hstate_vma(vma))); =20 return true; } =20 -static long madvise_dontneed_free(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end, - struct madvise_behavior *madv_behavior) +static long madvise_dontneed_free(struct madvise_behavior *madv_behavior) { + struct mm_struct *mm =3D madv_behavior->mm; + struct madvise_behavior_range *range =3D &madv_behavior->range; int behavior =3D madv_behavior->behavior; - struct mm_struct *mm =3D vma->vm_mm; =20 - *prev =3D vma; - if (!madvise_dontneed_free_valid_vma(vma, start, &end, behavior)) + madv_behavior->prev =3D madv_behavior->vma; + if (!madvise_dontneed_free_valid_vma(madv_behavior)) return -EINVAL; =20 - if (start =3D=3D end) + if (range->start =3D=3D range->end) return 0; =20 - if (!userfaultfd_remove(vma, start, end)) { - *prev =3D NULL; /* mmap_lock has been dropped, prev is stale */ + if (!userfaultfd_remove(madv_behavior->vma, range->start, range->end)) { + struct vm_area_struct *vma; + + madv_behavior->prev =3D NULL; /* mmap_lock has been dropped, prev is sta= le */ =20 mmap_read_lock(mm); - vma =3D vma_lookup(mm, start); + madv_behavior->vma =3D vma =3D vma_lookup(mm, range->start); if (!vma) return -ENOMEM; /* * Potential end adjustment for hugetlb vma is OK as * the check below keeps end within vma. */ - if (!madvise_dontneed_free_valid_vma(vma, start, &end, - behavior)) + if (!madvise_dontneed_free_valid_vma(madv_behavior)) return -EINVAL; - if (end > vma->vm_end) { + if (range->end > vma->vm_end) { /* * Don't fail if end > vma->vm_end. If the old * vma was split while the mmap_lock was @@ -999,7 +1006,7 @@ static long madvise_dontneed_free(struct vm_area_struc= t *vma, * end-vma->vm_end range, but the manager can * handle a repetition fine. */ - end =3D vma->vm_end; + range->end =3D vma->vm_end; } /* * If the memory region between start and end was @@ -1008,16 +1015,15 @@ static long madvise_dontneed_free(struct vm_area_st= ruct *vma, * the adjustment for hugetlb vma above may have rounded * end down to the start address. */ - if (start =3D=3D end) + if (range->start =3D=3D range->end) return 0; - VM_WARN_ON(start > end); + VM_WARN_ON(range->start > range->end); } =20 if (behavior =3D=3D MADV_DONTNEED || behavior =3D=3D MADV_DONTNEED_LOCKED) - return madvise_dontneed_single_vma( - madv_behavior, vma, start, end); + return madvise_dontneed_single_vma(madv_behavior); else if (behavior =3D=3D MADV_FREE) - return madvise_free_single_vma(madv_behavior, vma, start, end); + return madvise_free_single_vma(madv_behavior); else return -EINVAL; } @@ -1065,16 +1071,17 @@ static long madvise_populate(struct madvise_behavio= r *madv_behavior) * Application wants to free up the pages and associated backing store. * This is effectively punching a hole into the middle of a file. */ -static long madvise_remove(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end) +static long madvise_remove(struct madvise_behavior *madv_behavior) { loff_t offset; int error; struct file *f; - struct mm_struct *mm =3D vma->vm_mm; + struct mm_struct *mm =3D madv_behavior->mm; + struct vm_area_struct *vma =3D madv_behavior->vma; + unsigned long start =3D madv_behavior->range.start; + unsigned long end =3D madv_behavior->range.end; =20 - *prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ + madv_behavior->prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ =20 if (vma->vm_flags & VM_LOCKED) return -EINVAL; @@ -1186,14 +1193,14 @@ static const struct mm_walk_ops guard_install_walk_= ops =3D { .walk_lock =3D PGWALK_RDLOCK, }; =20 -static long madvise_guard_install(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end) +static long madvise_guard_install(struct madvise_behavior *madv_behavior) { + struct vm_area_struct *vma =3D madv_behavior->vma; + struct madvise_behavior_range *range =3D &madv_behavior->range; long err; int i; =20 - *prev =3D vma; + madv_behavior->prev =3D vma; if (!is_valid_guard_vma(vma, /* allow_locked =3D */false)) return -EINVAL; =20 @@ -1224,13 +1231,14 @@ static long madvise_guard_install(struct vm_area_st= ruct *vma, unsigned long nr_pages =3D 0; =20 /* Returns < 0 on error, =3D=3D 0 if success, > 0 if zap needed. */ - err =3D walk_page_range_mm(vma->vm_mm, start, end, + err =3D walk_page_range_mm(vma->vm_mm, range->start, range->end, &guard_install_walk_ops, &nr_pages); if (err < 0) return err; =20 if (err =3D=3D 0) { - unsigned long nr_expected_pages =3D PHYS_PFN(end - start); + unsigned long nr_expected_pages =3D + PHYS_PFN(range->end - range->start); =20 VM_WARN_ON(nr_pages !=3D nr_expected_pages); return 0; @@ -1240,7 +1248,8 @@ static long madvise_guard_install(struct vm_area_stru= ct *vma, * OK some of the range have non-guard pages mapped, zap * them. This leaves existing guard pages in place. */ - zap_page_range_single(vma, start, end - start, NULL); + zap_page_range_single(vma, range->start, + range->end - range->start, NULL); } =20 /* @@ -1296,11 +1305,12 @@ static const struct mm_walk_ops guard_remove_walk_o= ps =3D { .walk_lock =3D PGWALK_RDLOCK, }; =20 -static long madvise_guard_remove(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end) +static long madvise_guard_remove(struct madvise_behavior *madv_behavior) { - *prev =3D vma; + struct vm_area_struct *vma =3D madv_behavior->vma; + struct madvise_behavior_range *range =3D &madv_behavior->range; + + madv_behavior->prev =3D vma; /* * We're ok with removing guards in mlock()'d ranges, as this is a * non-destructive action. @@ -1308,7 +1318,7 @@ static long madvise_guard_remove(struct vm_area_struc= t *vma, if (!is_valid_guard_vma(vma, /* allow_locked =3D */true)) return -EINVAL; =20 - return walk_page_range_vma(vma, start, end, + return walk_page_range_vma(vma, range->start, range->end, &guard_remove_walk_ops, NULL); } =20 @@ -1317,40 +1327,37 @@ static long madvise_guard_remove(struct vm_area_str= uct *vma, * will handle splitting a vm area into separate areas, each area with its= own * behavior. */ -static int madvise_vma_behavior(struct vm_area_struct *vma, - struct vm_area_struct **prev, - struct madvise_behavior *madv_behavior) +static int madvise_vma_behavior(struct madvise_behavior *madv_behavior) { int behavior =3D madv_behavior->behavior; - struct anon_vma_name *anon_name =3D madv_behavior->anon_name; + struct vm_area_struct *vma =3D madv_behavior->vma; vm_flags_t new_flags =3D vma->vm_flags; - unsigned long start =3D madv_behavior->range.start; - unsigned long end =3D madv_behavior->range.end; + struct madvise_behavior_range *range =3D &madv_behavior->range; int error; =20 - if (unlikely(!can_modify_vma_madv(vma, behavior))) + if (unlikely(!can_modify_vma_madv(madv_behavior->vma, behavior))) return -EPERM; =20 switch (behavior) { case MADV_REMOVE: - return madvise_remove(vma, prev, start, end); + return madvise_remove(madv_behavior); case MADV_WILLNEED: - return madvise_willneed(vma, prev, start, end); + return madvise_willneed(madv_behavior); case MADV_COLD: - return madvise_cold(vma, prev, start, end); + return madvise_cold(madv_behavior); case MADV_PAGEOUT: - return madvise_pageout(vma, prev, start, end); + return madvise_pageout(madv_behavior); case MADV_FREE: case MADV_DONTNEED: case MADV_DONTNEED_LOCKED: - return madvise_dontneed_free(vma, prev, start, end, - madv_behavior); + return madvise_dontneed_free(madv_behavior); case MADV_COLLAPSE: - return madvise_collapse(vma, prev, start, end); + return madvise_collapse(vma, &madv_behavior->prev, + range->start, range->end); case MADV_GUARD_INSTALL: - return madvise_guard_install(vma, prev, start, end); + return madvise_guard_install(madv_behavior); case MADV_GUARD_REMOVE: - return madvise_guard_remove(vma, prev, start, end); + return madvise_guard_remove(madv_behavior); =20 /* The below behaviours update VMAs via madvise_update_vma(). */ =20 @@ -1367,18 +1374,18 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, new_flags |=3D VM_DONTCOPY; break; case MADV_DOFORK: - if (vma->vm_flags & VM_IO) + if (new_flags & VM_IO) return -EINVAL; new_flags &=3D ~VM_DONTCOPY; break; case MADV_WIPEONFORK: /* MADV_WIPEONFORK is only supported on anonymous memory. */ - if (vma->vm_file || vma->vm_flags & VM_SHARED) + if (vma->vm_file || new_flags & VM_SHARED) return -EINVAL; new_flags |=3D VM_WIPEONFORK; break; case MADV_KEEPONFORK: - if (vma->vm_flags & VM_DROPPABLE) + if (new_flags & VM_DROPPABLE) return -EINVAL; new_flags &=3D ~VM_WIPEONFORK; break; @@ -1386,14 +1393,15 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, new_flags |=3D VM_DONTDUMP; break; case MADV_DODUMP: - if ((!is_vm_hugetlb_page(vma) && new_flags & VM_SPECIAL) || - (vma->vm_flags & VM_DROPPABLE)) + if ((!is_vm_hugetlb_page(vma) && (new_flags & VM_SPECIAL)) || + (new_flags & VM_DROPPABLE)) return -EINVAL; new_flags &=3D ~VM_DONTDUMP; break; case MADV_MERGEABLE: case MADV_UNMERGEABLE: - error =3D ksm_madvise(vma, start, end, behavior, &new_flags); + error =3D ksm_madvise(vma, range->start, range->end, + behavior, &new_flags); if (error) goto out; break; @@ -1411,18 +1419,16 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, break; } =20 - /* We cannot provide prev in this lock mode. */ - VM_WARN_ON_ONCE(madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK); + /* This is a write operation.*/ + VM_WARN_ON_ONCE(madv_behavior->lock_mode !=3D MADVISE_MMAP_WRITE_LOCK); =20 if (!is_anon_vma_name(behavior)) { - anon_name =3D anon_vma_name(vma); - anon_vma_name_get(anon_name); + madv_behavior->anon_name =3D anon_vma_name(vma); + anon_vma_name_get(madv_behavior->anon_name); } - error =3D madvise_update_vma(vma, prev, start, end, new_flags, - anon_name); + error =3D madvise_update_vma(new_flags, madv_behavior); if (!is_anon_vma_name(behavior)) - anon_vma_name_put(anon_name); - + anon_vma_name_put(madv_behavior->anon_name); out: /* * madvise() returns EAGAIN if kernel resources, such as @@ -1572,13 +1578,13 @@ static bool process_madvise_remote_valid(int behavi= or) * span either partially or fully. * * This function always returns with an appropriate lock held. If a VMA re= ad - * lock could be acquired, we return the locked VMA. + * lock could be acquired, we return true and set madv_behavior state + * accordingly. * - * If a VMA read lock could not be acquired, we return NULL and expect cal= ler to + * If a VMA read lock could not be acquired, we return false and expect ca= ller to * fallback to mmap lock behaviour. */ -static -struct vm_area_struct *try_vma_read_lock(struct madvise_behavior *madv_beh= avior) +static bool try_vma_read_lock(struct madvise_behavior *madv_behavior) { struct mm_struct *mm =3D madv_behavior->mm; struct vm_area_struct *vma; @@ -1595,12 +1601,14 @@ struct vm_area_struct *try_vma_read_lock(struct mad= vise_behavior *madv_behavior) vma_end_read(vma); goto take_mmap_read_lock; } - return vma; + madv_behavior->prev =3D vma; /* Not currently required. */ + madv_behavior->vma =3D vma; + return true; =20 take_mmap_read_lock: mmap_read_lock(mm); madv_behavior->lock_mode =3D MADVISE_MMAP_READ_LOCK; - return NULL; + return false; } =20 /* @@ -1617,23 +1625,19 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) struct mm_struct *mm =3D madv_behavior->mm; struct madvise_behavior_range *range =3D &madv_behavior->range; unsigned long end =3D range->end; - struct vm_area_struct *vma; - struct vm_area_struct *prev; int unmapped_error =3D 0; int error; + struct vm_area_struct *vma; =20 /* * If VMA read lock is supported, apply madvise to a single VMA * tentatively, avoiding walking VMAs. */ - if (madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK) { - vma =3D try_vma_read_lock(madv_behavior); - if (vma) { - prev =3D vma; - error =3D madvise_vma_behavior(vma, &prev, madv_behavior); - vma_end_read(vma); - return error; - } + if (madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK && + try_vma_read_lock(madv_behavior)) { + error =3D madvise_vma_behavior(madv_behavior); + vma_end_read(madv_behavior->vma); + return error; } =20 /* @@ -1641,11 +1645,13 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) * ranges, just ignore them, but return -ENOMEM at the end. * - different from the way of handling in mlock etc. */ - vma =3D find_vma_prev(mm, range->start, &prev); + vma =3D find_vma_prev(mm, range->start, &madv_behavior->prev); if (vma && range->start > vma->vm_start) - prev =3D vma; + madv_behavior->prev =3D vma; =20 for (;;) { + struct vm_area_struct *prev; + /* Still start < end. */ if (!vma) return -ENOMEM; @@ -1662,13 +1668,16 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) range->end =3D min(vma->vm_end, end); =20 /* Here vma->vm_start <=3D range->start < range->end <=3D (end|vma->vm_e= nd). */ - error =3D madvise_vma_behavior(vma, &prev, madv_behavior); + madv_behavior->vma =3D vma; + error =3D madvise_vma_behavior(madv_behavior); if (error) return error; + prev =3D madv_behavior->prev; + range->start =3D range->end; if (prev && range->start < prev->vm_end) range->start =3D prev->vm_end; - if (range->start >=3D range->end) + if (range->start >=3D end) break; if (prev) vma =3D find_vma(mm, prev->vm_end); --=20 2.49.0 From nobody Thu Oct 9 04:43:22 2025 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1434C28DF4B for ; Thu, 19 Jun 2025 20:27:38 +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=1750364859; cv=fail; b=DQbPBBMyOQf92yIsoWaPdsqMbUjWGtpaB2IcXXvmuwCihYQwom4FeXPqdRf3On5aUNp0ZzZaEcEBjhUUQZexxIKjUTpNrNhN/HVlmrtb+axhrhVJZTZlC+NIv6CiPWaAdfvgJiMpyrfcf70x27rfWV/OQTzwZFgGLPHjlDpmoac= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750364859; c=relaxed/simple; bh=72WujZOYWUFqq+jVzcyFH+OR5/eFQJ6EbvXj/VJLEuA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=dZqsTMBj1o6iCbIRfvbdyL4YkvOiWG46am4ru8oUzyOu+i16xKwm3OuU0JDxf/VXERn+Jz6sIhei2E5XajIR8bggXPNfgfi5JvW3I8Syjcv04PRlM3Ux9LTCMNNrn34jOA9Fj6jcybJPeC4WlxqCTSHipbfS3WhI5p9WGKz/+4I= 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=IB9UOhI7; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=JDQpTHNx; 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="IB9UOhI7"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="JDQpTHNx" 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 55JIfbBP016371; Thu, 19 Jun 2025 20:27:14 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-2025-04-25; bh=lzDBoiehB+ORskSmZw4KbHEoEdjU54CX0+GY/qTNvTc=; b= IB9UOhI7/ly2XjUR+keTPdNDf/gyP5S3Ll4bVA0+XhVp/f0sHkg8J26wDwCKwL47 E6f7LABxHkgUNUTdhpfULCZMcntnkO1iXTyqh0j8fXEvBnyEpXLTNTe73qpFcQNe VCOd7NXdWHAamMOhoqBzFyHPyiJz654SfA1lWqEKsAHhhoQsCLE4P44gnlWvke2S NYAoQEf9PeAhGr4ejoZsG2ypLwjyVtMhMelxEgoUt+6UcWKubolbShWYBpFB53MA 50LkZuo2uMAk2Kd+5U2czMbJ1CvvF8yhKjYpav97boVLR0x/823s7WF7c3pPAqVB 0CQvVjesQnbClBbYuz8DXg== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47b23xx224-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:13 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 55JIF279038493; Thu, 19 Jun 2025 20:27:12 GMT Received: from bn8pr05cu002.outbound.protection.outlook.com (mail-eastus2azon11011005.outbound.protection.outlook.com [52.101.57.5]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhc7m9k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 19 Jun 2025 20:27:12 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XoWJVHJXZUFUsN6ltA6y9mE8nJjZjFFrK8bDVBeR3JfTonJ+EmPmBmVYbMbh3JvwGs6aGTf1Awxv833blOQGw8r2Rl4nqsWcmD3dxRzp5MTS7RUSBg858RT1WiZxx96dH3DMnINNK4CICHIQRwiWzcavDr1MtCCHLaqsokL1Yvw1IqIHNUIC14lge9qwOoc7W8SWdohs3AhaYoePUJzlASkckqXnYcrlUXB9bW6whgtYMfKG9yFExQjJLo+qmjsZjj8/3TzpEQph6wgQJuPD7fRTndMrjKYmmEpcvm6/kYuwFDQ+ITfb4lxf8dqTlSYYjbUFJiZlYYAomTF7cIJ86Q== 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=lzDBoiehB+ORskSmZw4KbHEoEdjU54CX0+GY/qTNvTc=; b=PQwur27wn8SLkvESBhHg1DfOiXIhLE7D2treIkQ0CZDtyDWqe6nhHAG7Kfgh5AlUzht+yKHpIZ8ANOgHiMjiRXMrbTUoc06VFx2AlvIbpBcflbGRCJZM9dAgAaOdUkbioMx901kPlAorMeLtXqe6FDn75O/ofwJQpQN3Jg4bW/AFgo75+enG+c+bSqSZYgC7LzFkh2GEdfBy9DzBU2Jd3nKZsBiTWP9YfmOopB41V2erpFSTcMizBEQ39rCHTEWSAyYpAym1u0ZjWQIAxRxKaJ34v9M5NBedwA1MqRrDhc2YXHsEbfB/+CXMdmLEb0KIw02GL9r5k8AVyipDnXTJAg== 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=lzDBoiehB+ORskSmZw4KbHEoEdjU54CX0+GY/qTNvTc=; b=JDQpTHNxHgPTAgCFIf/RxHEzYz7DmCmMsBWMhSskc/31Sz4He0496DbloRwQfjmwA37BcMf3e9ikF9Dih/IhbkjK85PrCHFrcnZ9Lz7Lx/vPgbp94D5VupZQnmoXXK9yHrzbaDFTGLCPvv/hCDs7N/Z0g0Ncw6iOqQP830At0K0= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by IA3PR10MB8042.namprd10.prod.outlook.com (2603:10b6:208:50c::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8835.30; Thu, 19 Jun 2025 20:27:10 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%6]) with mapi id 15.20.8857.019; Thu, 19 Jun 2025 20:27:10 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: David Hildenbrand , Zi Yan , Baolin Wang , "Liam R . Howlett" , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Vlastimil Babka , Jann Horn , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Lance Yang , SeongJae Park , Suren Baghdasaryan Subject: [PATCH 5/5] mm/madvise: eliminate very confusing manipulation of prev VMA Date: Thu, 19 Jun 2025 21:26:30 +0100 Message-ID: <441f6b68c62bff6aff68bd1befe90ffc1576b56f.1750363557.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P123CA0098.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:139::13) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|IA3PR10MB8042:EE_ X-MS-Office365-Filtering-Correlation-Id: 4874f37d-8dc3-4cfe-9ef6-08ddaf6faafb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|7416014|366016|376014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?/7n+Bb9j1wlpShDq9WxKmNg3Jig0vymqrI0/u6TdcbdJeCxMPHfC0PGg3GbF?= =?us-ascii?Q?OsCXUUAi33UgYPiJDnHetfkuai/yZBtAYif+ky8B9xYQL3Bp2bGRMkJZVz8C?= =?us-ascii?Q?BSTN85MABiehgVtfjYyD8QwjePeHVdkf2XUfmnCbkF6xNu3GBjKzmEJnjc5d?= =?us-ascii?Q?/qHO6DAuSJfqj6GuJW3JXDl8zr4IeCptsEwhIUd+eM52Sk0oFp0hc45n06d2?= =?us-ascii?Q?yzHKZadH5MDO6O8lqnE3GX4JSvftbo3yzerP/kqkB/p+QengSkwteKPWjDff?= =?us-ascii?Q?13D10zeJwyl97xLlm0b0jBc1iupt/6W+bhZvFFU7lk3hk99QJPzx15DbHlB+?= =?us-ascii?Q?V5weTy9JfQ5IWoUDUNdcFbbNCu5es6hML4ZTZt7YDGQScwDJYiG8idxRqEel?= =?us-ascii?Q?XGbu72oYwxByN6zvPgXbI8lwvCPop7f7mP/AINlk9CoijZaJVH2oyImqhIDt?= =?us-ascii?Q?2P6cev+Dod74tXejXqn6Sz2YdCWtvCLSZhHFiBdDdoFDJadvDGVuD9gtgbRJ?= =?us-ascii?Q?DT+x1uSLVGRxQsCa0LQtmNcpbW6QgkwOegXMgQ4uQ3m9nL3AXBHy46WeRI2k?= =?us-ascii?Q?yewspta1zjRT75bbJtC/ornkcn5t0N3e8Pm+ZH4p+nt5j/xK7AIDgLOKLTqd?= =?us-ascii?Q?JVXOxcVJjqRv7vcl3tkOSatPF7iADKzDX4zazxStIhr7tDb8uMcob8blYSMo?= =?us-ascii?Q?cVKRmBti6s2Ip8IOvZG9clOs4bq1vqCvYlDR3tYSQixPDgLDqx53rOaMA03O?= =?us-ascii?Q?qDuj1cznlo6ZqAHHJ+db1NtTrLJg4XYVYLPaI0XEOKJxwak9soCaiz89Nmlf?= =?us-ascii?Q?QmN22kH+X3blbPXmQK+HcLZvsc4qwCB6rG9a+geDXjvFvO6GRcns9MAB/JAB?= =?us-ascii?Q?qPzM2/VHCx/3XPHc1R3Zrx2gsIhWzLudDwNIVybXQ7OJHINIp/wOBf28LXB/?= =?us-ascii?Q?tZLqyAWhb1Qd5M+w5aVTZaUpij42vN9nnqnwDpLjPSvHj+2cRs/5dgJkJwzO?= =?us-ascii?Q?WvGQ3LXdDZ/1rDgD8c+alKNw4rclbqq7s4NaztCBxQQiIGFKPqXeEh4YYmT1?= =?us-ascii?Q?IlKHCXoCVvARKe69iyFgXLAH337u5Qocdnd5cegJHLQAZ5eRKt720B9R/TdG?= =?us-ascii?Q?LYqQbzrr9TaFhnS4kUgcc6EdH/i44WrVjyZkuCTF3OVtvfEvNfDKCnwFFAGH?= =?us-ascii?Q?rRGfvwBo+RqUhSQsxXlmKUrRY/GY5dHH0HFHrtk18qmK+h2du17xFjNT0QSI?= =?us-ascii?Q?c8MOtUxnfG70lh5yZV938SVbDy/fT7iHHI9rMYSxneFsNGVoOHsX1LNJyVF9?= =?us-ascii?Q?vANWUKlToDh5ION34svsEENkGBBjf/ccaVhfpSGCjxlrlut9RvDvpEvov8hg?= =?us-ascii?Q?wG+TdbKjfCmPIIJMJLnhACHRmmNxCQ9EhkJad7khslhVSgBk2uDMH74acDzc?= =?us-ascii?Q?Ofb8QWR1CxU=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(7416014)(366016)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?C3/LrFA7DiPt8gxZ1idivb8mu/AhTss38dJGtNN61v6Q0qU7spCs6eeu9BI+?= =?us-ascii?Q?ZvyLR1Hb99bL3EVuJ/0A/ty9m6kjY2S+ZsMi5qcIzr3Hxp5mSxPKMnpDA209?= =?us-ascii?Q?jnZ3fcJvhW1tViYCOnaYc7s4Fdbc2WA//vYmJLwFpiYwfifY6Fc3xzq9E5km?= =?us-ascii?Q?AqGBpeJs4O9v6p2UYQNb/9KRsXt9Y5XPGy/K6Menz84w8j4di0WCO5BtYAuP?= =?us-ascii?Q?R+aKAVwylkSeLvu8bKXbOmAQ7XUrMTEFkWf2BcVQEtBUgv9X7pel2l1D+E4G?= =?us-ascii?Q?pF5WHUmxgUuzlJZVlW3lV7G7k4/mpCQCk9SwQ9TXawKBsEmaE8H/8THJeDx1?= =?us-ascii?Q?hOjOSbS42OeaiZAXKw+ugRf6sRRvbatEsiGVSw3UioumAHdz+IV59HwMo6yA?= =?us-ascii?Q?MtVIflggEgYFL+0y2Sl05+C/fnLsZ/g3MCw8Ht3GnoPIY9BoQ864G1ujgm0O?= =?us-ascii?Q?h5mVlISM/N8Ptsp4jSKZr9gdrZxKzRqco4HfjHfvPADcx04x2sr0n+kVGPw0?= =?us-ascii?Q?ynwTdVMm7v2pHMQ7YQyoIBdz7a2M3kRkqB0dbk6uH/TklHzSI2leT/hRZ8q4?= =?us-ascii?Q?WQmCVqhRq9eA2Sh3qUmzffF/7VD7EQF10Xb9lWDNr+j/M0LxYIqciy2klYAq?= =?us-ascii?Q?5QirSvqOk2cJfPUmC31J47GgXrycDasLHmr3C9kOUNZqt6D1obFbc6B8LwHs?= =?us-ascii?Q?ddVCXMWpLG3pBvM5tL5TSS78bI9sg4tQ4xK3rEizzVO/ap+B9/E2gEekx4zV?= =?us-ascii?Q?ph80GDGiOYuV+13ueFt7suYzZDq2OsfWcQpQVuxvhnEwvUEyH2uQsbWaxP4h?= =?us-ascii?Q?dl7SbSuf8lQyq0WJXykbdnMGeoEZrHn6go+097Zyyn164milC1sX9bvBWkTi?= =?us-ascii?Q?AkBhdWIuo/CU0df4tuX3IFFudLl4wV/DKGJMxuLt+/Z4xgfUs74F2pWdIFhk?= =?us-ascii?Q?43fQ6vv/lLYVOfwEkVpjbOyfbhnYogTz1Lt2qPEeRTwFCbb9ufQvZ0VasmuI?= =?us-ascii?Q?THobqURzpDUcJshMNviEjSDC8Lv5xPTyq8HrfSoNfU3QKtxLqcMfTQNlNPne?= =?us-ascii?Q?ISIXIT6Co8eMheVMqsrfXNv1+j6oXVRPQE7ZyR5MgK0HjH3OkX/r+WYI4GOM?= =?us-ascii?Q?ls88yK5Y2ZXlvsghWmUtwHlh8zreNSwuZrZyWcTfn/QqeVPCPc6xaEh84R7k?= =?us-ascii?Q?9Ifco5Pi1bDrzrFvrd/xHH74jGF/MWEUZd1jKYlPdvKfo2/piKY2SryNZ7Vk?= =?us-ascii?Q?DuUHM85CQqrJMrr5glwJ9nQntJ90l8STQGIfUmyNv2wqG3+J6UBIBlOGbimW?= =?us-ascii?Q?/HMbiUO/V9ccpRTJ0v7KIRY6n9vL0mXGCYHK9xW9IIi3qWIuZzVKXBkJrwUM?= =?us-ascii?Q?XOpFux8yFczo+vLGtYlajDocnyd6ByQXHfJQ9k4P/rbygQuVHyN7w5Fu/ABs?= =?us-ascii?Q?9ohifV/WjZYEKwazd0QJQAosdGKPPiTloyQemNoGdgSE6tgaoHYMEIF3dV4J?= =?us-ascii?Q?qxYeTuXHMNQYIdcR2xNNXbli4KMlc2l0aNhIb5xq+BE5iqBok5BwzIiALtKF?= =?us-ascii?Q?zLH+yL9PZ0a65faMtFxjWRxWCNQBSjhxaPhrk2YdZ3RA/cq50P0pXnDmlyWY?= =?us-ascii?Q?8g=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: F4YStL3R3MgSAh1i8G28aPkIddp+xfr/SiDIqtNKTSASwkjG+BRr1/+oM2DOY5UKWcTBHFDx7Y8r2xiR6UVtsnRhlWgi4u87DUQgfhgGldTEH6cNpG44vg9m7zck5xHczGDxk9sCWPDUP4ZqrzNS7LvoMJ/1O/4MsgWY4uxMXG9kdHz/FSU6rbaIVP3vDPo62kDMNCpJg2Q2MYeAiPi1PBDzR5vR5r6i9EG6KGIn8NAREye0b8AM+T/mTUT11fkgQcw3YhsZuvkspWjjqxqQ9KZd2AxaVYCAX2sy77V0dby/6qLKBTK2bHqvJxuQr+rpqgMFkPn3Jv+TJoLYWhUmMryyqOrS6sXsg51LBC2DxMA7Rkaf9Kn0SCYHLHJXn4ip5VxI3ZrC1eWlbopATNB6xZ6dyhoHu0rQG1Mrzr1EwrY/w31lP+gRPy6Rat9mxJCoel0DOcz8FNkVOhpDajADSkgJ35WW0okzXpwCEAI9jIi4CARELngaojzh+ARzDqcvk7RRT1JFQ8hGi7a8k6kKy0UvkaUD6/HJJ7osC8L8VDX9ls1pD3yNIUNljRwe2NQT3DL6oSPyQ7kOm1Mgfh/FuXs0hHxr2zvv/4fH1YF1i4M= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4874f37d-8dc3-4cfe-9ef6-08ddaf6faafb X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jun 2025 20:27:10.3129 (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: CM38HaGZ8Hb2XSrnNNxoEFGVLvTg3iLY1WJFW1WT7Gh6gpVvt7bhkjboq37m11KvbZBr8oCYGl7WuRn0L1AOdzCMQdrTBkQQ1HhXIgFyNTA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA3PR10MB8042 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-06-19_07,2025-06-18_03,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 mlxlogscore=995 mlxscore=0 bulkscore=0 spamscore=0 adultscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506190167 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjE5MDE2OCBTYWx0ZWRfX+aPHY1ehtNbh 5h5XV9GYNh2et1eCCXAsCPZO+okBBZYGl4h45JgGZIl5NL5Pysh5+qTGLzvjomlV565QdCc0LY8 +Os0+sURH2MU05jFkKnt87tTSuKHVFL3yZwKUUmhpYqFqKMIIalxyXZm49y2iBsSYSOVZfYTfeN Ry0nHkv6bC83iOpy7rEG3GLhIof7Ikl3df61SNfjtf30xOLKCSefiN5Ywft2Cf6d2JriMIyHVY0 xW1v2O9nOm60tas/JXXvGPZvqB71pGYX2oPGdA3qtbrJAUFxjvZ854YR6LC1p7XFH5w2Qmiizw4 QYty7K2tIMBar+uLkq6ONxY/sZnfu4/2NQeGtgcH+tFW+YqiN9w9i+gyNhyJDR4AiAyRQ3R0sJZ 2a1eTYLMV4JhNt/RCHWOOPQnmvjaOQIEJANZaO/embgDf8w4S4qDXEsZxvYZy+RHtY1Mliwd X-Authority-Analysis: v=2.4 cv=DM2P4zNb c=1 sm=1 tr=0 ts=685472a2 b=1 cx=c_pps a=zPCbziy225d3KhSqZt3L1A==:117 a=zPCbziy225d3KhSqZt3L1A==:17 a=6eWqkTHjU83fiwn7nKZWdM+Sl24=:19 a=lCpzRmAYbLLaTzLvsPZ7Mbvzbb8=:19 a=wKuvFiaSGQ0qltdbU6+NXLB8nM8=:19 a=Ol13hO9ccFRV9qXi2t6ftBPywas=:19 a=xqWC_Br6kY4A:10 a=6IFa9wvqVegA:10 a=GoEa3M9JfhUA:10 a=yPCof4ZbAAAA:8 a=3PYvvxC6y3Yc54peycEA:9 cc=ntf awl=host:13206 X-Proofpoint-GUID: FgyQX7JZUNR8sq81PWCboMfkueDCAyU6 X-Proofpoint-ORIG-GUID: FgyQX7JZUNR8sq81PWCboMfkueDCAyU6 Content-Type: text/plain; charset="utf-8" The madvise code has for the longest time had very confusing code around the 'prev' VMA pointer passed around various functions which, in all cases except madvise_update_vma(), is unused and instead simply updated as soon as the function is invoked. To compound the confusion, the prev pointer is also used to indicate to the caller that the mmap lock has been dropped and that we can therefore not safely access the end of the current VMA (which might have been updated by madvise_update_vma()). Clear up this confusion by not setting prev =3D vma anywhere except in madvise_walk_vmas(), update all references to prev which will always be equal to vma after madvise_vma_behavior() is invoked, and adding a flag to indicate that the lock has been dropped to make this explicit. Additionally, drop a redundant BUG_ON() from madvise_collapse(), which is simply reiterating the BUG_ON(mmap_locked) above it (note that BUG_ON() is not appropriate here, but we leave existing code as-is). We finally adjust the madvise_walk_vmas() logic to be a little clearer - delaying the assignment of the end of the range to the start of the new range until the last moment and handling the lock being dropped scenario immediately. Additionally add some explanatory comments. Signed-off-by: Lorenzo Stoakes Reviewed-by: Vlastimil Babka --- include/linux/huge_mm.h | 9 +++--- mm/khugepaged.c | 9 ++---- mm/madvise.c | 63 +++++++++++++++++++++-------------------- 3 files changed, 39 insertions(+), 42 deletions(-) diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 8f1b15213f61..4d5bb67dc4ec 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -433,9 +433,8 @@ change_huge_pud(struct mmu_gather *tlb, struct vm_area_= struct *vma, =20 int hugepage_madvise(struct vm_area_struct *vma, vm_flags_t *vm_flags, int advice); -int madvise_collapse(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end); +int madvise_collapse(struct vm_area_struct *vma, unsigned long start, + unsigned long end, bool *lock_dropped); void vma_adjust_trans_huge(struct vm_area_struct *vma, unsigned long start, unsigned long end, struct vm_area_struct *next); spinlock_t *__pmd_trans_huge_lock(pmd_t *pmd, struct vm_area_struct *vma); @@ -596,8 +595,8 @@ static inline int hugepage_madvise(struct vm_area_struc= t *vma, } =20 static inline int madvise_collapse(struct vm_area_struct *vma, - struct vm_area_struct **prev, - unsigned long start, unsigned long end) + unsigned long start, + unsigned long end, bool *lock_dropped) { return -EINVAL; } diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 3495a20cef5e..1aa7ca67c756 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -2727,8 +2727,8 @@ static int madvise_collapse_errno(enum scan_result r) } } =20 -int madvise_collapse(struct vm_area_struct *vma, struct vm_area_struct **p= rev, - unsigned long start, unsigned long end) +int madvise_collapse(struct vm_area_struct *vma, unsigned long start, + unsigned long end, bool *lock_dropped) { struct collapse_control *cc; struct mm_struct *mm =3D vma->vm_mm; @@ -2739,8 +2739,6 @@ int madvise_collapse(struct vm_area_struct *vma, stru= ct vm_area_struct **prev, BUG_ON(vma->vm_start > start); BUG_ON(vma->vm_end < end); =20 - *prev =3D vma; - if (!thp_vma_allowable_order(vma, vma->vm_flags, 0, PMD_ORDER)) return -EINVAL; =20 @@ -2788,7 +2786,7 @@ int madvise_collapse(struct vm_area_struct *vma, stru= ct vm_area_struct **prev, &mmap_locked, cc); } if (!mmap_locked) - *prev =3D NULL; /* Tell caller we dropped mmap_lock */ + *lock_dropped =3D true; =20 handle_result: switch (result) { @@ -2798,7 +2796,6 @@ int madvise_collapse(struct vm_area_struct *vma, stru= ct vm_area_struct **prev, break; case SCAN_PTE_MAPPED_HUGEPAGE: BUG_ON(mmap_locked); - BUG_ON(*prev); mmap_read_lock(mm); result =3D collapse_pte_mapped_thp(mm, addr, true); mmap_read_unlock(mm); diff --git a/mm/madvise.c b/mm/madvise.c index 86fe04aa7c88..53c3a46d7bf6 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -76,6 +76,7 @@ struct madvise_behavior { struct madvise_behavior_range range; /* The VMA and VMA preceding it (if applicable) currently targeted. */ struct vm_area_struct *prev, *vma; + bool lock_dropped; }; =20 #ifdef CONFIG_ANON_VMA_NAME @@ -205,10 +206,8 @@ static int madvise_update_vma(vm_flags_t new_flags, struct anon_vma_name *anon_name =3D madv_behavior->anon_name; VMA_ITERATOR(vmi, madv_behavior->mm, range->start); =20 - if (new_flags =3D=3D vma->vm_flags && anon_vma_name_eq(anon_vma_name(vma)= , anon_name)) { - madv_behavior->prev =3D vma; + if (new_flags =3D=3D vma->vm_flags && anon_vma_name_eq(anon_vma_name(vma)= , anon_name)) return 0; - } =20 vma =3D vma_modify_flags_name(&vmi, madv_behavior->prev, vma, range->start, range->end, new_flags, anon_name); @@ -216,7 +215,6 @@ static int madvise_update_vma(vm_flags_t new_flags, return PTR_ERR(vma); =20 madv_behavior->vma =3D vma; - madv_behavior->prev =3D vma; =20 /* vm_flags is protected by the mmap_lock held in write mode. */ vma_start_write(vma); @@ -330,7 +328,6 @@ static long madvise_willneed(struct madvise_behavior *m= adv_behavior) unsigned long end =3D madv_behavior->range.end; loff_t offset; =20 - madv_behavior->prev =3D vma; #ifdef CONFIG_SWAP if (!file) { walk_page_range_vma(vma, start, end, &swapin_walk_ops, vma); @@ -359,7 +356,7 @@ static long madvise_willneed(struct madvise_behavior *m= adv_behavior) * vma's reference to the file) can go away as soon as we drop * mmap_lock. */ - madv_behavior->prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ + madv_behavior->lock_dropped =3D true; get_file(file); offset =3D (loff_t)(start - vma->vm_start) + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); @@ -650,7 +647,6 @@ static long madvise_cold(struct madvise_behavior *madv_= behavior) struct vm_area_struct *vma =3D madv_behavior->vma; struct mmu_gather tlb; =20 - madv_behavior->prev =3D vma; if (!can_madv_lru_vma(vma)) return -EINVAL; =20 @@ -682,7 +678,6 @@ static long madvise_pageout(struct madvise_behavior *ma= dv_behavior) struct mmu_gather tlb; struct vm_area_struct *vma =3D madv_behavior->vma; =20 - madv_behavior->prev =3D vma; if (!can_madv_lru_vma(vma)) return -EINVAL; =20 @@ -971,7 +966,6 @@ static long madvise_dontneed_free(struct madvise_behavi= or *madv_behavior) struct madvise_behavior_range *range =3D &madv_behavior->range; int behavior =3D madv_behavior->behavior; =20 - madv_behavior->prev =3D madv_behavior->vma; if (!madvise_dontneed_free_valid_vma(madv_behavior)) return -EINVAL; =20 @@ -981,8 +975,7 @@ static long madvise_dontneed_free(struct madvise_behavi= or *madv_behavior) if (!userfaultfd_remove(madv_behavior->vma, range->start, range->end)) { struct vm_area_struct *vma; =20 - madv_behavior->prev =3D NULL; /* mmap_lock has been dropped, prev is sta= le */ - + madv_behavior->lock_dropped =3D true; mmap_read_lock(mm); madv_behavior->vma =3D vma =3D vma_lookup(mm, range->start); if (!vma) @@ -1081,7 +1074,7 @@ static long madvise_remove(struct madvise_behavior *m= adv_behavior) unsigned long start =3D madv_behavior->range.start; unsigned long end =3D madv_behavior->range.end; =20 - madv_behavior->prev =3D NULL; /* tell sys_madvise we drop mmap_lock */ + madv_behavior->lock_dropped =3D true; =20 if (vma->vm_flags & VM_LOCKED) return -EINVAL; @@ -1200,7 +1193,6 @@ static long madvise_guard_install(struct madvise_beha= vior *madv_behavior) long err; int i; =20 - madv_behavior->prev =3D vma; if (!is_valid_guard_vma(vma, /* allow_locked =3D */false)) return -EINVAL; =20 @@ -1310,7 +1302,6 @@ static long madvise_guard_remove(struct madvise_behav= ior *madv_behavior) struct vm_area_struct *vma =3D madv_behavior->vma; struct madvise_behavior_range *range =3D &madv_behavior->range; =20 - madv_behavior->prev =3D vma; /* * We're ok with removing guards in mlock()'d ranges, as this is a * non-destructive action. @@ -1352,8 +1343,8 @@ static int madvise_vma_behavior(struct madvise_behavi= or *madv_behavior) case MADV_DONTNEED_LOCKED: return madvise_dontneed_free(madv_behavior); case MADV_COLLAPSE: - return madvise_collapse(vma, &madv_behavior->prev, - range->start, range->end); + return madvise_collapse(vma, range->start, range->end, + &madv_behavior->lock_dropped); case MADV_GUARD_INSTALL: return madvise_guard_install(madv_behavior); case MADV_GUARD_REMOVE: @@ -1601,7 +1592,6 @@ static bool try_vma_read_lock(struct madvise_behavior= *madv_behavior) vma_end_read(vma); goto take_mmap_read_lock; } - madv_behavior->prev =3D vma; /* Not currently required. */ madv_behavior->vma =3D vma; return true; =20 @@ -1627,7 +1617,7 @@ int madvise_walk_vmas(struct madvise_behavior *madv_b= ehavior) unsigned long end =3D range->end; int unmapped_error =3D 0; int error; - struct vm_area_struct *vma; + struct vm_area_struct *prev, *vma; =20 /* * If VMA read lock is supported, apply madvise to a single VMA @@ -1645,19 +1635,23 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) * ranges, just ignore them, but return -ENOMEM at the end. * - different from the way of handling in mlock etc. */ - vma =3D find_vma_prev(mm, range->start, &madv_behavior->prev); + vma =3D find_vma_prev(mm, range->start, &prev); if (vma && range->start > vma->vm_start) - madv_behavior->prev =3D vma; + prev =3D vma; =20 for (;;) { - struct vm_area_struct *prev; - /* Still start < end. */ if (!vma) return -ENOMEM; =20 /* Here start < (end|vma->vm_end). */ if (range->start < vma->vm_start) { + /* + * This indicates a gap between VMAs in the input + * range. This does not cause the operation to abort, + * rather we simply return -ENOMEM to indicate that this + * has happened, but carry on. + */ unmapped_error =3D -ENOMEM; range->start =3D vma->vm_start; if (range->start >=3D end) @@ -1668,21 +1662,28 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) range->end =3D min(vma->vm_end, end); =20 /* Here vma->vm_start <=3D range->start < range->end <=3D (end|vma->vm_e= nd). */ + madv_behavior->prev =3D prev; madv_behavior->vma =3D vma; error =3D madvise_vma_behavior(madv_behavior); if (error) return error; - prev =3D madv_behavior->prev; + if (madv_behavior->lock_dropped) { + /* We dropped the mmap lock, we can't ref the VMA. */ + prev =3D NULL; + vma =3D NULL; + madv_behavior->lock_dropped =3D false; + } else { + prev =3D vma; + vma =3D madv_behavior->vma; + } =20 - range->start =3D range->end; - if (prev && range->start < prev->vm_end) - range->start =3D prev->vm_end; - if (range->start >=3D end) + if (vma && range->end < vma->vm_end) + range->end =3D vma->vm_end; + if (range->end >=3D end) break; - if (prev) - vma =3D find_vma(mm, prev->vm_end); - else /* madvise_remove dropped mmap_lock */ - vma =3D find_vma(mm, range->start); + + vma =3D find_vma(mm, vma ? vma->vm_end : range->end); + range->start =3D range->end; } =20 return unmapped_error; --=20 2.49.0