From nobody Thu Oct 9 02:51:10 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 2EFD42D29AD for ; Fri, 20 Jun 2025 15:33:40 +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=1750433623; cv=fail; b=DOug/FRIJAEAItFaF3hJg51VjluBbFuvdrDw+L+omYZPEvZfKo7P0CllTd0eyB/eAOCILerJ/oFYl7LYkyMs8b51QW9PJ3PxfCAhsTb8iGucOeESQTuCbRvsp8gAc/TmAiaefVzndsVs9tUFTBPCG99FrPLsa5uV4Ln6TNwvScM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433623; c=relaxed/simple; bh=ECroMz4Ko1RygwNec3t4xjnqUxP4m3zcDV6uvwkf058=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=n6PEbW83YzzH1IYKy1xGjwt41eDuuhmwRxJc5NGUyf6C1F79yMgJoNNUsZ+P/uvYNvDd8516EE0WKyVEP76npbnvjwAYgum5BumOZC6vq0Cih5n45Dd9gR/+hH7xhauZGhn7uxHkqs1Zycun+GZ8eaijcWT7fjJFOvcyXUdZ57Y= 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=i43Sf6q7; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=aWvRKSEC; 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="i43Sf6q7"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="aWvRKSEC" Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55KEBlLU023317; Fri, 20 Jun 2025 15:33:15 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=SJhdf6QFs6FVWlb68JWfzs8CrvG1vVvhp42y3/6Tpzc=; b= i43Sf6q7NzyjXi4NmVXuznuuKsS6mXW+HtEu9mPr7kt5X0Y3j45OKvHsyBwRVqTU 1H788qKdMW7sku6MVOc6/ZG8ZFeLGPKeYoZWcPZNnB0rJUkySj2DOympQs63u5J0 8K2d/nIndRKm76J+OdD4o8Vv5LawGqtIglea30ouNi5oWtwpPTe8IQyB+kFgsYb/ /JDG1jAifTFJ5+fS/Qj4NSJYAfVVJHGrF3NbIAk4bb6h61itq2kCOQi7IlO4hHd/ GFCD4znJYBmmDmh1v7z3s0e5Q+xmtC19Q0DUKSe9MwQ5jn8wpgurHoZlxaAlNqlP FVekP6h5EX3O5P19FKzQYg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47900f3xrn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:15 +0000 (GMT) Received: from pps.filterd (iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 55KEY1CA009836; Fri, 20 Jun 2025 15:33:14 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10on2042.outbound.protection.outlook.com [40.107.94.42]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhkjd24-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:13 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MGd0a9ql6ign8sBcFXKRBifJD+Xws7rH6cmGNqDC7hmh0hFrBIYVh37vBEZYAZ7SLrM1ZAQnC6K6R0uWl0Pwp7Zo/CK4tQB6/2XQCqwTWz6CTZl+cSwivrGh3eUO+xJCYho4X6qQ1DIHmEEQvRMQOvukicJ5zJCSm2e5S3Kproefo2YDcVhFwrHd1gt0QnoOdi4OwKCavwaB24ScHnmROuQXNq9qNauFcKYLU/X2S0ijFn3TluWB8p7H0qlbz2AzWCdklJmyu+ZV5rE/nZHQfdHMRf2EUfjEutrfamdyEKQYpm7P91ul5LhgiUSNc0bcv0Mzt2/fpo3gXSAq8asADA== 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=SJhdf6QFs6FVWlb68JWfzs8CrvG1vVvhp42y3/6Tpzc=; b=yd812bSqs3PWDdno568c/4OzlZznQk0VW+mpMX1uMBaN2qVqsXHZrMyI3jZgVzf79WEr9h9q0Q4Swo+EUqjO9gUMp7GeP/n/BDd/u3OSSKhKe27iXj//+g6echye3pBLmXgfG3dOBxMBijcRWNRTIg1gZH9eE/E0mwzUfJwe2/CloSVjDZMBm/SB7aj2ctQg6OkUR2zXfzpt8sGvkIW2rCqgrPk7ii5NolwCMdImHxsKybLVU6epK8aeA08sPCKNcBK6Imhg41ojWdFDRUQlmgRNmktUIpCxIes38Q21U65utQVpEgfIjLoXqqa9T9oo5ABfLXh77XfPdvUgGZMblQ== 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=SJhdf6QFs6FVWlb68JWfzs8CrvG1vVvhp42y3/6Tpzc=; b=aWvRKSECH7aH8iAenfZHuM+DiMKSGvcVMl98/+UN6iaWNAoOS2se58qs9yi9qRTKhkFvRRiTzfD1w6O1qJYP1/uEie/4Dz5RtfOga2sBBIg8Scf1w7iIptdYPqwc9wNL1pqfDZ2CU77ZeAP5hpCYjXWg2OT+do0V3gKK+eiPEII= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SN4PR10MB5591.namprd10.prod.outlook.com (2603:10b6:806:206::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.20; Fri, 20 Jun 2025 15:33:11 +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; Fri, 20 Jun 2025 15:33:11 +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 v2 1/5] mm/madvise: remove the visitor pattern and thread anon_vma state Date: Fri, 20 Jun 2025 16:33:01 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0126.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2c6::17) 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_|SN4PR10MB5591:EE_ X-MS-Office365-Filtering-Correlation-Id: f1d25894-dfb6-4c72-c1f1-08ddb00fc3ac 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?Fvljr6YuglZoUAZZZ6umZxfLvXeZ8jZzj62iNMFrWwqJJiPh8bosM+cipavz?= =?us-ascii?Q?Ql7/NYIjaKroGuB+AWorIJx1Po33dQ5oPlVD2XbBJlccl0tB6LFx4f9yx9Zc?= =?us-ascii?Q?2Gik1Gv3u63NuWLgysDK4+LI60jexV48Fv9ZpfVgSPNjVY1NxmpwRnMOjnR+?= =?us-ascii?Q?RNnTANSyzMuNo8Q6UqFuGepgYasHL4pHBRksMDVEivhR5UB1wXahdoQf1p4x?= =?us-ascii?Q?qeX7/gZ6hzCmqVMpDq1APM+PVhY3HPqp1KQN60PQESvZV2h5lzX/pQJ49K4v?= =?us-ascii?Q?T2cQ6S+Yl4BL6iunNlWolIU4MOZLxCA8068JQG4PCf6yB13QcvpAw1IEorpw?= =?us-ascii?Q?esE6KwgLnVlD8vxLMUg+RKiwpgayni0mpD0tz5h2LxJ+Jl9pkfT+hD5xJNGI?= =?us-ascii?Q?8xrwa1d+l0v7CcdzfTt4IRdKYJloKCXrqldCLUuOzNAJTFmO98705ogiCctx?= =?us-ascii?Q?SlBpkrvs87xKbEC/FgV9Dmx15vPYzMDVU4x6aZaAgmmNnhYjeFtuxOBqmPZk?= =?us-ascii?Q?Pyn4Yqq63TPNisiy2E7mPN6dvSyVzgdtBLNAWbciEdxEmCPLwutBJtqNRVfI?= =?us-ascii?Q?Fw7iGgKkT3dV8OV0GZpnbWGvkMpn93ilxYiBPVJQiLvM4yLFYcWdchI++rfM?= =?us-ascii?Q?msRFs7mF6KlWLPootOBtUc7e15fIBE/bmo/3y9/efp40Holiz1P0ECejnoxX?= =?us-ascii?Q?wYerAkgwT9Z6+RgCwaBVgArkWTLpQaDAmnZAke6coq88X0uqrVmNjhjy4+mY?= =?us-ascii?Q?LOhc/R23Z/s4J4yn74kAYXbUw2N3CzjJCXZh7BOgoJQg5C8lYQek4ZsHalk7?= =?us-ascii?Q?aHnombpisP8xgvjQWoenkSfBtDkFBQipq/F5askKvPZzg8ul9232Fuofn9uZ?= =?us-ascii?Q?Xxw9G9E7mGNxKuKJk/UwwLB5Lgm0ZBrxWCmrVL+kU79ozSgYiSJpN1tPTmSN?= =?us-ascii?Q?ixYN7Th9pMo7e3+qVJfpq6IUxhmvtP3E10J01Z/M2egz7iGD7OFgt9t0fMlx?= =?us-ascii?Q?Nmc7cpxJeEZQ1hFqq5H7/kRii4re22AXFFj+6uhFRKd0tZdW11EWv5WQhEs8?= =?us-ascii?Q?yj1Q/RxiFC1z/zyqoUXLqRp1qHxq9RUI+VEd6iu2EEvfD+u4Qmi5fO9DemyN?= =?us-ascii?Q?0pJvSsBiM9hZmaYJHvQhoLAbbxbeSl5ajRPP2dnkJOlo6WAZFz9+St7NgScp?= =?us-ascii?Q?wANulgsykEJPOkrPoK7M9K+eqASwUbYMVzi/aY5+orgIXiQ7SsFFaHeJ8k1X?= =?us-ascii?Q?HMgtalCWckt5Kaf1RZA3q1lSQadS/vLSqkFJ0vCg2K+k0XzOiUldK/aAQtTB?= =?us-ascii?Q?96SDmCagOKiq9Sbdfs11sXwhL72y0hyfgjoasxbhBtSIW2fYwSCsnjH8FEQD?= =?us-ascii?Q?bX3ciVEQ8j4/FDRlecuQJjoJn5Ys9qpqpo2E+IOza0B+C/phQ0a/k0PTIIG3?= =?us-ascii?Q?RHCA1eAz+iQ=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?aLFNa/WprpzLgwgZFs0N0hYRfmF/G48ev7jQO1jssWXsejvTLY9h1o7WDGzk?= =?us-ascii?Q?HAvSp3N2s9ZDyEOMCFAmWEzFqym+58UKP1AIrEfjLwj48CqjRkWJj74WvA0B?= =?us-ascii?Q?PmG08dxFghkF1lHVi81crl0dECiVt07dHuU3xB0EDCtINHienasJoSO7JDPz?= =?us-ascii?Q?2veoZLiqHuZUg14wHWfFk11YKqGgO6rkX8u1QHlD+oRwcjhB758ZnSVX30JC?= =?us-ascii?Q?d2SStVgXprLI51SSkOhRtd+QiHWqNxG2+w9qXQdwXbL+0MIlaD6O21hhNlJ2?= =?us-ascii?Q?TXmYeGCicuLi7HnTkHjbLu4m6BFYWGVT+I88HNmZ3L1spbqWrIYDSkkdu6TT?= =?us-ascii?Q?TfgKqsyKHYsg+Y7lCCfyGy7uBhm0pj52B8waxOoqm5qNGJcWiLqcHwVl1nNR?= =?us-ascii?Q?wTLhBH41/FoxevId8VfFvhJ8Dtacn+7NNR/J3qPWwYiCZpYpB8Z6gfnpVUT0?= =?us-ascii?Q?REhUjafcuRWREOyaONCJCnYSo3ec5dqbLnVLbHVHmP/tgL0DVMJ97VtZOVBW?= =?us-ascii?Q?FcMIWp4thQpSSBOR6Id6/dlth61MO2LfLB4VpsX0a2Dcg1y8AuWUAurb0uIe?= =?us-ascii?Q?6prhjZeOhhF079sTlmMtQFWiZ8SD5Fq04mgd9d3X3/XMPvSdSgbphC0OAB4g?= =?us-ascii?Q?dZ+6cPGXoCP5tXdiFfYvazEGUCY/WljVU7PhheBZXMD4Kep5JutEB3LdccrN?= =?us-ascii?Q?vOLyqJNSxxZjyUY/77hsMLRZ1m6BWaKM7uXpMY2h7AKkYkwtbtIzOD1MjQoa?= =?us-ascii?Q?OUKhz5mymacIwuVzC+B2aCM03l1Yk7RW/Ec96r5BRyRcK160hwBSpwS3H8Te?= =?us-ascii?Q?OqhRE0B08WZW22JOByoW4ngUndCeQzptFEcYfzVOmx+07ZUaX+TNxG/oO1Ve?= =?us-ascii?Q?IfYCl1YbjMKAc0Cx6G31aDMGY9IvJhb7iMQdeK+U54iqV4ag7u9YbkAqWDoe?= =?us-ascii?Q?Y4uAs4E5B/7VjgVroTmShec+QrcQBxmd72c5T4EuZvraGKFNCeEqV+ai9jO8?= =?us-ascii?Q?B7cVk9WBU9CJJ2CW5co+oArgkJVoTofAJbOXBiPA8sArMLOdWeb0BUWsO8fN?= =?us-ascii?Q?TUczXQtWoskxgSO+TeDElWAF6RvF3R1m1W/BnSmLYjoFml6bKmkDDBGRAZxy?= =?us-ascii?Q?b5ZXOyGs7YhzviAQClYeKgrfcfLhqzd348EXj4EHS6C4O0zpbfBtZJDGD9Og?= =?us-ascii?Q?wy62ZBTAZb4ofnR+SvRKhmhxtx+kc5BgDKqIijPnwLPO9knJNoWBvLhzjXBh?= =?us-ascii?Q?f9x1+G3e/thTdPQX9G2HKvkhJmNv2LUUInKf2yry+aqU/FZT6NaO1Q5xAHZm?= =?us-ascii?Q?ZIN+/LKALTTebd+K8eShrIcuLayjC14ix8C/hvZSt9EWD7u5YyKs8hvAA31a?= =?us-ascii?Q?0l5f0G4dC26E6mMq8vscjaKTvAseTh55/sC85ri8DF+uYcrRF/G+GVjiGGDT?= =?us-ascii?Q?kNLCdcgST/CEzJvQlJK3D5FVmCiGO8X40U+vfEpjhczqyDyedo3FO2gatDo5?= =?us-ascii?Q?EPOnCfWQ7EcNa4VZdJ0V/+/1EQ7s6tK4JnCMGfGT0o+KPJVIP0a/JZ5PVcYb?= =?us-ascii?Q?X9/VZhHTPZbzTCMQj6XB9l9zBQGmJS16J0gZzErCgKxS3FRz6cp2bM9FDn0Z?= =?us-ascii?Q?OA=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: CESlupSq4wgXICbvg2yHKqWe93jX47cLHW5HDTH+H2RAGqyqO/qXHS+l3Udf9FMvE8mjOAlp8xtr9P90py8bPApKFREKZHH0jM4FgCriXFVhrEkj7J0pP9NDiYO3rfG7QmShquB7eLKztHJmpzZPzrrj1Ms3XahHNErjIUmoWkVrnFYbi70ndhnK353GZIT1dsvINyrfiiWVAmOUocyGNktB6v94HgZVOomASE8gt1qg9Pc33CkntKyqJmWFFWk+iDoCRmUWPXRamzv4g9P4ccsxClpyqUQR5aX1F0R3gvvv/bXRVZhMN+MW2TnAshqT+9Mr51LAkyhmAGmPOtWpu2/kF1zWbs8PU5KrZMyooVG3ZTuWEQx+mEwt7NbVF2Nv0bRJLCrFI0ofN7/jb8WnDiBZ2w+szdJDfyOEgsGlrE3f2XOpBtDAmEUyBz8JML7ual3KKdVKwRKIutA8yBLrUpTlSauNeL3AHhy99DEVo6tKi2USKGbEncJ2awjwPFrGyHOiv/eiO5SMMkzja8/GGf+fs2jqkUJHI7EZ40Wwpqj2VBa69ey2nr79QHul6QhORC3A1bg30AmHl7k54pZucU0tIVwiajfMmqwkqeselBw= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: f1d25894-dfb6-4c72-c1f1-08ddb00fc3ac X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2025 15:33:11.2002 (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: qSM+LLccnkxRUITdQWAmT1WFIouBUj1KsEPvq7ZRAZS4NX3cPJMG2j5x4S+Z4AdG4gpfuNZk9WGF77aB9Aco7GzRxzgnnuBX4dXdHlarxcA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR10MB5591 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-20_06,2025-06-20_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 bulkscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2505160000 definitions=main-2506200110 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIwMDExMSBTYWx0ZWRfX2crGuU1HW+59 AnvqmfB8ERMyZn29VICYK/shFzviigiuxAFUzZAKpmGwbATsfRKWGMI1ZW4DroU04CrUSeGRohr vywunZvS88Q8DMTEdtYHeNs0A3CBpw9qa09I2zo2TgCgTbFwBewcqwrgB/8ouDOsC19ZXvFp+oU ytbqc8KHCaysJoTQ5LtipzhgNTg9TWUiAEyRf+BDCEsfhWPNoUrmQzgRa5ofn5QTjU/o58QqVgj BcTRwITg4y6HvWG5lPdYzaWGiI9eg4WcSw5dKXPucCT5o9/MNvgbGRE5joper0KglTg2hXgAhAn 1wS0dw4G3tjVgc4xGREDftRi2Lp3w9EKP5Y/fKbs1tdNXy1RBqyzbfjb02Kn91q1E6ey8EA7tTW MGdw9f3SMVnxq/yFOeak6YStrWxvRgynIIOizxUQaQy+vIRXx2pQS0vgpmYa2BCQBnULT6Sl X-Proofpoint-ORIG-GUID: JR9ZsLF24DlSZ2gJu_t1ry9Q_wZZ-xdi X-Authority-Analysis: v=2.4 cv=X/5SKHTe c=1 sm=1 tr=0 ts=68557f3b b=1 cx=c_pps a=e1sVV491RgrpLwSTMOnk8w==:117 a=e1sVV491RgrpLwSTMOnk8w==: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=ATqnVohNJs7nKIk7dY0A:9 cc=ntf awl=host:14714 X-Proofpoint-GUID: JR9ZsLF24DlSZ2gJu_t1ry9Q_wZZ-xdi 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). We are able to remove the visitor pattern by handling the anon_vma_name setting logic via an internal madvise flag - __MADV_SET_ANON_VMA_NAME. This uses a negative value so it isn't reasonable that we will ever add this as a UAPI flag. Additionally, the madvise_behavior_valid() check ensures that user-specified behaviours are strictly only those we permit which, of course, this flag will be excluded from. We are able to propagate the anon_vma_name object through use of the madvise_behavior helper struct. 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 Acked-by: David Hildenbrand Reviewed-by: Barry Song Reviewed-by: SeongJae Park --- mm/madvise.c | 166 +++++++++++++++++++++++++-------------------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 070132f9842b..93837b980cc2 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -37,6 +37,8 @@ #include "internal.h" #include "swap.h" =20 +#define __MADV_SET_ANON_VMA_NAME (-1) + /* * 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 +61,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 +118,35 @@ 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 { + .behavior =3D __MADV_SET_ANON_VMA_NAME, + .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; + + return madvise_walk_vmas(mm, start, end, &madv_behavior); +} #else /* CONFIG_ANON_VMA_NAME */ static int replace_anon_vma_name(struct vm_area_struct *vma, struct anon_vma_name *anon_name) @@ -1252,13 +1287,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, - 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; + bool set_new_anon_name =3D behavior =3D=3D __MADV_SET_ANON_VMA_NAME; + int error; =20 if (unlikely(!can_modify_vma_madv(vma, behavior))) return -EPERM; @@ -1275,7 +1310,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 +1370,29 @@ 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: + /* 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); + + /* + * madvise_update_vma() might cause a VMA merge which could put an + * anon_vma_name, so we must hold an additional reference on the + * anon_vma_name so it doesn't disappear from under us. + */ + if (!set_new_anon_name) { + 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 (!set_new_anon_name) + anon_vma_name_put(anon_name); =20 out: /* @@ -1523,20 +1576,17 @@ static struct vm_area_struct *try_vma_read_lock(str= uct mm_struct *mm, } =20 /* - * Walk the vmas in range [start,end), and call the visit function on each= one. - * The visit function will get start and end parameters that cover the ove= rlap - * between the current vma and the original range. Any unmapped regions i= n the - * original range will result in this function returning -ENOMEM while sti= ll - * calling the visit function on all of the existing vmas in the range. - * Must be called with the mmap_lock held for reading or writing. + * Walk the vmas in range [start,end), and call the madvise_vma_behavior + * function on each one. The function will get start and end parameters t= hat + * cover the overlap between the current vma and the original range. Any + * unmapped regions in the original range will result in this function ret= urning + * -ENOMEM while still calling the madvise_vma_behavior function on all of= the + * existing vmas in the range. 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, - 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 +1598,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 +1637,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 +1655,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 +1846,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 02:51:10 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 83D3D2D3214 for ; Fri, 20 Jun 2025 15:33:42 +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=1750433624; cv=fail; b=iVofp5deiVdwDuoKeQoOCp5rn8SG9KwGQdLKIbhGEVNXysDTPpXZk3Nyu+ajKQyomCynfg5qZWwfIILnaneas/d3kFpEl8ZfbuXyIXmmm4srE5bMCPjOrBtViFVvN9/QJ8W2uW3mLrXaiQVhfxeAdl06dVVKVkwBEndYbrQFH5A= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433624; c=relaxed/simple; bh=YPYkK69GOH0EEzPGtf4NEcmKrJU3R6v0T7mNChOPi8I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=KGi+Gqb8BEUJ4X6PIvmwP8fi+lSRbPsxrGwCdKM6jVoZo0qh6RFwXy/WStktYzuuZVFg1NEAvboNQoL5Xm6hSKC3bDCVyxgQJBmcidWGYf3XbCL+u6dxdHSjdS6onKkjXEpPmhw45U7q5IblWZsRiKa8nLH/LE01At7D6yjNHY0= 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=kZo/K+wa; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Uh0f6qY8; 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="kZo/K+wa"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Uh0f6qY8" 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 55KEBlG7010437; Fri, 20 Jun 2025 15:33: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=eLuqQonUKpGmuKeTmSFJln52A4i21YOMAirQvd5sOLc=; b= kZo/K+wax2vEdOciAkqmiZcHP8xYk1l3cdrirSBrdKmi2tqboVvXDzWtFUq9wZoI 0sETkksh3iu1nXZ/ap7M2kfEAazKu/QdrNI4dHyprGi9qteNnYUE/qAo3qO9a469 1BUjtVeSTD+uuLed3lcI/eF1yKm7/nta935G8O3TkQLm1o5Z5yQOGnVVJOJ2+rxC khDlSQQxkREOh7eeq/lUkIglkEg4hqC5l1bAIvQHo1OEcC0C3WTfNcBfcQm4sZmy hQ5PjP9uX2LonlStYXh5/8iXKVwUL1t9UQ4Pn3tPZ2AFou7BFI99Kh8HQ4sMJJ1f fyFZ/Ye4/P8gVQBv5unYBg== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 478yp4uycb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:18 +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 55KEotat038292; Fri, 20 Jun 2025 15:33:16 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10on2065.outbound.protection.outlook.com [40.107.94.65]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhd22xc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:16 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=L9pazpSwt8TmcuvEWrZEpkcbbmgoqR/2MHjgZTa+ztKuKyipFDN7vk+dUZxT/kCtokFYbGPuMyqnHv51/Fm20Dm31gXYwc4tXbYh4bJpfTDFhTzqvYz5NQq99YTajglu4K4PSZM5NcHLhwadCXcoDHsgdfDVFqHjT4ork5/toTVLbFK121/keKj2oePH0uR9xIy+YBqdDDlJ6YYAbOK6tjFz+EgoVNEZACp206gmsTTkIe3pi2q7WnKr9oEd1ZAXW4tGIzFdKdCg5hObM8VnblYf4vkWNXRsK3AWQOiwWq6DOZqMiZHk03FYoUfE7r0SRsUcCXsT6HzaQhdC4t/prw== 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=eLuqQonUKpGmuKeTmSFJln52A4i21YOMAirQvd5sOLc=; b=YRtwSPGb3+v/3kl1nj/5End7FB5v+F/qAHYI94jG/p25ll+NZeSejCp9Ciyeze1N2ziL8LU2Xwvp14hPDBBhjZ5RZB8+8lCzk67GyX1TmzW6c12PUrlHB6mzAJ9aK1ZjG62kD32sesHRtAoCI4m1QLoN1RUJ+cnXWVF+VX6QcCH2kMMj+s3JNeuGhq+v7SqjpVSvRRBYhN1DoRrT5Fs53SdMFYMY8xGavs3FFtRX/qn+ZMBsIxJll3e3yHQPGLWgJJi5na8cP3YqxdPd6/nPL+9EaxBWniQRreETkj/Ci938bL2nMvQtWZLLtuqFe+dUB5IfAEUQ7LTKDb2p7IdyIg== 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=eLuqQonUKpGmuKeTmSFJln52A4i21YOMAirQvd5sOLc=; b=Uh0f6qY8d0roXg3lpADaedCvnVCH0h8+Y+jhNxw1u2cM8r46b8JwLhzMpL2o6ElGfu+lbLX5bq6Jjq48fnyWEMB55+P0YCZIh53Y0h2APsgd6DPX7jHToeLB4EnSgP7/bEQ6FXPXF1B1Uw0aQxs1MNJ73p2OMKoYYDLH1SB1RTU= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SN4PR10MB5591.namprd10.prod.outlook.com (2603:10b6:806:206::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.20; Fri, 20 Jun 2025 15:33:13 +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; Fri, 20 Jun 2025 15:33:13 +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 v2 2/5] mm/madvise: thread mm_struct through madvise_behavior Date: Fri, 20 Jun 2025 16:33:02 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0184.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1a4::9) 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_|SN4PR10MB5591:EE_ X-MS-Office365-Filtering-Correlation-Id: e0beb6ae-5499-4bc1-84d9-08ddb00fc504 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?qv+ddYPn7a+cjGDv3nj34fUmszvkxEJk1wpUFBw8M8IEIovlwqQMo3IkSPbG?= =?us-ascii?Q?2xvQPzbdbhygO3FmbnKF0ITUoHJX5V/f9kkuzTZNu/1PCRew8WfOchRHCTAZ?= =?us-ascii?Q?mPc4ulYO0IOTettzq/i/6Yij7bAc73QgtlptWnMXe9B16fsQOrNpvMuZdKQy?= =?us-ascii?Q?o8YsyRUqNSKu8du0VNL7xPbx4ScPNtxRiG2CPeuaaygpPwX6zPtLgmbhP1sY?= =?us-ascii?Q?aEuQcacn26xBXump69nTjvtL4d+vp653RHCiQQ197foe6BltsVXlkuknV1d+?= =?us-ascii?Q?6ix2wI4v3fNITrhyNfbd+p4NM0cMntWv/TUiI8AalioOmSCpOBsm/jyVHgdF?= =?us-ascii?Q?x6cuSTMGzTSdfwGpNUELtnM9Hd8P1HcZKxp7qh6tbASEkhfzU7p4kcEXGbCn?= =?us-ascii?Q?tuP7MUHI22KKXcGqVn4w5q8BZYWNC4TuH21GfYbSAeg6x9nXoWwxpIGrQIQd?= =?us-ascii?Q?2YcMZGpUi8cM1tWggg0lgFP83nihYIuJd3cGzsi5tfwpsFssZDC8uRnsbuIY?= =?us-ascii?Q?LAF8smsn+nZZUkbuIHNh9piMyanAOpQNAfnVfZnN4hFDxdjGUlgWnzbFHf4Y?= =?us-ascii?Q?MNGomBjCh0i53LZx4dFx10Ym99EhAXfgYVYhfkm6pWizQtj24jaHHwrUinHO?= =?us-ascii?Q?cOqJBkucM3PLRYOFv5XkuwsiCkypBSZs4BlK9il8p4zv6OJ9Y4T6mhhJQHVm?= =?us-ascii?Q?bltFFvBU7dV0BuMJwS5amX0DCCJJBo4BVEiPXHcNmvfoID3gLhx+sV1E7Lsb?= =?us-ascii?Q?Ku2zPOGU4S+TDb6Rje+eZG77By6w6A5r2L7mqliCdgM4zMApbhd4LC5XQUHl?= =?us-ascii?Q?j4z7XmGQBUtnJGSJrNdyRwaFMaAykwkJQ1j8j9xK8Zg6YdMNuwOSXvNBTZsc?= =?us-ascii?Q?RegFcHoSGF+jUXvJXhYWBikKdTmyqkYmE/evQoiqX4gciBujj1is4CIQb7nk?= =?us-ascii?Q?7eRT4/qhzhd6ec4USDPitmeJDC3vde+GfCvLEmfP9hm+CKWyjWCdAckfcP9x?= =?us-ascii?Q?27ygzdi56Wn9d4iZnkiHnLVqHAwaeyBcjg5vUuqQFSAYJ8rKWrxVmU/QSGD1?= =?us-ascii?Q?9CzyO2vcVqbQO4KnUxLjyS+PgWOaN/rvJZKJ73vyyEdu0nbUvBlsfOjvpOXC?= =?us-ascii?Q?WYdiN6WdDc6ytRAsf0dQUp1+hwdhah2ttS14iZF46xqEM0hisbG+zA+xwHSp?= =?us-ascii?Q?a924U8DRgoMZ53LH6Sg+lqttjdwd8ogPXkMJ1wIxGIZYxBXI5Oae2BJW2XTr?= =?us-ascii?Q?Ac5fpUXqZjA4H5Ky3NkbSrJarA7QtcSjF/xcHt+4J725ucGaycAG6fyjms2f?= =?us-ascii?Q?uH1IJel6Po8A/l3ASCQN/VN8xdhv2S1a+NqqrxcgLIz+Tj+enuvxdHB7PVMv?= =?us-ascii?Q?YrzeB/XjsSIFMXvGHwHIgngq2++M9xUUF3B8lWNpylYjV5tfr3tCX7d4WwTp?= =?us-ascii?Q?gdNHAR7yUi8=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?tfzAuhVVYFAsQ6hluNLeNbeI4fwmmf6o3TFXEjT3nqZqV4z2dAeywBSdaVlZ?= =?us-ascii?Q?7Km6XsOqH5/cqPZCQ1hfB48zvHMa/2Ie77nNus1hpwCwm0dVH47CaW+HGrfR?= =?us-ascii?Q?LwHtf09kyRyDLc3iWuNnNpsPy2TV5jkMwouNktu5tfSLuNhC0K4UTbi/jqho?= =?us-ascii?Q?4UrCQ0u9mbu6/TX4ZR2FT/8gkfidpsn7RQF1Ob/yXJbvMPW0UsofRZiTJoPv?= =?us-ascii?Q?kpd5GJHilFCyvI+fkzY2qo3oZvuh0bgspRlXZyhfYhyXnHdgIYhTEdhWk+xO?= =?us-ascii?Q?8NP7WyTtEoa6vVkKauXtkpFFIvu+BW3Jarx/ZYbcEYXiK7Xg1LTlaGKzuEuu?= =?us-ascii?Q?Ij+F0e6+l5pK7ANMMxXLVb//yuw6o0Ll2sJBRBQ4irJ1meFy+Bpq8C756Qtt?= =?us-ascii?Q?4NCCkpcJvnolV5xoqYtUWdrLdGlNxaD08U5UB6v9rzS27v7guLTjn5o76o6C?= =?us-ascii?Q?rA92WOF0e1urWeF4Pal8UsgeqrG9f3/88gTzyLBFI6UAK0dg7HyaWoBIEWLB?= =?us-ascii?Q?ddgv3cEWQJ2PL1P2Y0bdgE4cas7Mr0FX+vcQuqUY/fIxShZ19sPA7pTbO7np?= =?us-ascii?Q?hC2/y8fkUmDZHMrYiXFvUpX0oURn0VcfX96Q1kPPbpWD4S/g98OKj2OmglmO?= =?us-ascii?Q?WDlmgX63RTd7SVFp23EAAA5ms2t8Mv0CcKW76Us59zSv40B9g4Y+LVJ8XQRb?= =?us-ascii?Q?/43QL3FXhfVRMT6lltV1GNjWRaifobbm7E22zUWKBzON1bQB9VvaFZf/m9BF?= =?us-ascii?Q?P1QaQBGZTVErI+JgjRShR0uaByKnM72TbTRe+n666yYSrTXovSj6JJ7Czp+C?= =?us-ascii?Q?g25KoXERpYrW7MRFgb+SKI2fNphTBW13ZuWIXOPhXkAIJ//LmBziHL4dbDZH?= =?us-ascii?Q?VmdL8YCAzGK0wodTwOIzzcjaKIof0RDzkbByYMuGjswSPkX//epgZWs4OtUW?= =?us-ascii?Q?J4mtyiUIsQU3XOj7MXYd/PQ69TZnBdKsihJ+H5sUAVuin8XZW+HT4L77611I?= =?us-ascii?Q?neXuOtOScHBU079vWBX1VEByEAYE4u3U4JcCUOZ8C91hr+ywSpBAW8pgohna?= =?us-ascii?Q?eQHLppWU3BQw2bnn3yelLtEN6CO+TEXTgq7gzCNayc8uXALKdaJux8IjLvMP?= =?us-ascii?Q?DL31dd95Uyrk7gvwAWdHehOFZnhgMtLuKoyR4bT9Z/A7msaAOoOwi5BdlmL2?= =?us-ascii?Q?E1dNKH4Ju/KKYAZ8687fKz5X5qzuIWql8P2dm5WoGCoQDrZa+axBEDpXVxNN?= =?us-ascii?Q?Gm1CGPJ0Pry6xTnnu5IePNQwVj3eTTH0gPb+A9MQjBluC8/2+Snq+P0Mke7l?= =?us-ascii?Q?bMXuaU/oYqjGrPvLiTyA1n2a2H3YWdvzGoy0t7z+8ymB/tWTJul87wriaS96?= =?us-ascii?Q?Zlz0wC+h6OA0jRxCwkVPJvpWW94et77mhICnI28Yw7a9M4pzuDpN3G2/a95b?= =?us-ascii?Q?xTgo6TEbmL6cvcpnChj01/NtFkC6Z3dIdH5/c+hDl6jZiK4xG0i/Otxr4rEq?= =?us-ascii?Q?ce0dj8M1Pb9LrsloOdwQHfMtjDcgeJ2DIvq4ybCi6c1KZZqmW1ShoXmnNXYu?= =?us-ascii?Q?dn0qM0/Q9kL1d04sTQzIURsrc9zGVVCtR57t/9KIwqdPR4cDn9PyAeP+Dr4f?= =?us-ascii?Q?NA=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: /en0keAVy3eUIOWigFZOfji37YJDnPFtgKbxLFV8aYsDRtpOftEgsHGTEJ2ILSZbYAP01sf0iXB9kNeKzZzWyoTVOzdxteB+Ovj7U6eawPhrqypPXMODikEvWbOYJu7gNz3+ZqF1+nnG+qjqHvXTVLXD4Ude+OXL3mU5cgRukONuXuIiKIhdCtR8zhb8vQRZ292KgaH68xfI+ScFKZZE5191NPurY1rJHBNwPk8np64dmkckF/UkVAPJuQzkGfCFedat5mIi/SMZAcQhb4eT1Y+n5bvBwb0cncvII+XVPKJk+xJLIqtOwqoWqYqq627DwovtkKuH3XYiJMbegm4RSmr+vWl2Ghzn952U6qQMlHlTlv5QXKjNbVtxPlMWFCDrocpDu099Vv+A99Y0guCjd2q1jqpsTKB5hi8sriPks7QRzE/MR0cvmimSiB+8XZt9bJP5t/ajrLqcn7ftxbpcmuHI1BPdtlyCXB8EUe07DpSOC0oOMQRF0PKfYCyc9avYxAP4IkieqEByXKeOnKf0CK61/Dt874w+3gD6xHLHlHBvl41hnDZOeF7ErOkMGSP4XvcrUIV/YJOjU5QNiWgZRtFDqcsx37qUzzS7nxzz8FE= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: e0beb6ae-5499-4bc1-84d9-08ddb00fc504 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2025 15:33:13.4574 (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: 8YRtUzaQEbhWDZnrcRZ4DAlHgdqQ8jOGrJJZzCBqmnZqoqrF0wnAKo4ToQaR7NyEPHNHCR5nr/b6ClQKq+SIAWt22gu2YN3+tI7SqSCjVY0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR10MB5591 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-20_06,2025-06-20_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 mlxlogscore=999 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-2506200110 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIwMDExMCBTYWx0ZWRfX6Rassi3U0TAA b5cWQ3loYwtOZTLRnkiaENIrvCc+a7I2fVHXe+HpvHZVWfaDy9Y8vaGCYftPl/fqmhiu5aP1lKD kqhLM032GQgzJ6wVMBCM/1Pz+EZe9tXUViuKV1mSyIKDSH+rbQPIHYsGT5YxXTbP5IovE81ESbl 3hOEHLfjBua/brs/z34l/iT6+ePJf2QL1TYJTVyt+8v7CvCZZjve7CuHnXmjb9ObeihkQ5XDuVP RawYNFOac2lDha9LBwnvMfjEwBv9hguwbgspN1q9pUCqF2mLJyzP4ByfuoXp2jmUnQDU+UIBmyx DRcxWOazJ1+IYA7pTo8GkjwFHzL82DUJcpN6lTE73D9IdmxYarG4oE6CU/ihqnOGdDHBF8at8Wc 37B/vYkJgSkQCDVeJIGKf+oZzurZVPwpsB10SGGFeptNmVPSqqSifGzjIkNAj5s+CcKvyAMU X-Authority-Analysis: v=2.4 cv=K5EiHzWI c=1 sm=1 tr=0 ts=68557f3e 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=_XDJ28uIXtxIByfxrr4A:9 cc=ntf awl=host:13206 X-Proofpoint-GUID: PSJF90d2yTPbJjYd9CN05FFj_o2WeXJF X-Proofpoint-ORIG-GUID: PSJF90d2yTPbJjYd9CN05FFj_o2WeXJF 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. Reviewed-by: Vlastimil Babka Signed-off-by: Lorenzo Stoakes Reviewed-by: Barry Song Reviewed-by: SeongJae Park Reviewed-by: Zi Yan --- mm/madvise.c | 110 ++++++++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 93837b980cc2..f1109c2c63a4 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -58,6 +58,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; @@ -65,8 +66,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) { @@ -125,6 +126,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, .behavior =3D __MADV_SET_ANON_VMA_NAME, .lock_mode =3D MADVISE_MMAP_WRITE_LOCK, .anon_name =3D anon_name, @@ -145,7 +147,7 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigne= d long start, if (end =3D=3D start) return 0; =20 - return madvise_walk_vmas(mm, start, end, &madv_behavior); + return madvise_walk_vmas(start, end, &madv_behavior); } #else /* CONFIG_ANON_VMA_NAME */ static int replace_anon_vma_name(struct vm_area_struct *vma, @@ -991,10 +993,11 @@ static long madvise_dontneed_free(struct vm_area_stru= ct *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 @@ -1408,15 +1411,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; @@ -1434,7 +1436,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); @@ -1453,9 +1455,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; @@ -1466,13 +1468,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; } @@ -1549,10 +1551,11 @@ 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, +static struct vm_area_struct *try_vma_read_lock( struct madvise_behavior *madv_behavior, unsigned long start, unsigned long end) { + struct mm_struct *mm =3D madv_behavior->mm; struct vm_area_struct *vma; =20 vma =3D lock_vma_under_rcu(mm, start); @@ -1585,9 +1588,10 @@ static struct vm_area_struct *try_vma_read_lock(stru= ct mm_struct *mm, * 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; @@ -1599,7 +1603,7 @@ int madvise_walk_vmas(struct mm_struct *mm, unsigned = long start, * 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, start, end); if (vma) { prev =3D vma; error =3D madvise_vma_behavior(vma, &prev, start, end, @@ -1662,12 +1666,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: @@ -1687,9 +1689,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) { @@ -1711,9 +1713,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; @@ -1743,11 +1746,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) @@ -1802,9 +1804,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; @@ -1828,25 +1830,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; } @@ -1928,19 +1931,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; } @@ -1958,16 +1962,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); @@ -1977,8 +1982,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 @@ -1997,11 +2001,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) @@ -2009,7 +2013,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 02:51:10 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 B9BA22980A7 for ; Fri, 20 Jun 2025 15:34:15 +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=1750433657; cv=fail; b=MyEPneZYLXjUTjHgqhepC901Z6wd+Ap7eLMIBHrZ3h0RoZikNctm/7GFeokxkofP1FXTbqo9Zfhph/LO9c7B+sGoiCkH+R2xncqk2S2btQtCB+30fKVu2J4fNrC4pV4b6VA7NJeh+DE53Dqwe+Cev6eCR2Q6VgJxifgpm8wl69o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433657; c=relaxed/simple; bh=oRzl28FbVPkBPb9ccBBSEtTZqKDWXSU8la3OpchJ/I4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NkCa0BtxSv2x5J1RRaHZeQ5+03Ko1m5Stoy0fjqHqBW2sJkIXQpSgV65l/Nb8KZdZFZHUAp91B26DoLbKIRYemmhGnaNUvPeKp9Jh0MKXMJJXFTq7yC+B1cjiVCnqx3A+TgN9pQetOmmT88Jgcio4xXOuFmdfkR5n+FefyIh4Tc= 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=BOFEKHlx; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=nhGACB/5; 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="BOFEKHlx"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="nhGACB/5" Received: from pps.filterd (m0333521.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55KEBlLW023317; Fri, 20 Jun 2025 15:33:20 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=K+aX+Eb3nmRI4ka7SsyaogwNVOPsV+C2P4l6858MmEg=; b= BOFEKHlxqpLKEzjNmHz3F8VoCNqdQjckovGO9NnaDcHv6+RFRvPIghWZe7ObBPqF f2JJm4hiSI3NRc2CCKkA5gMjB/hZSojNCwqCEpI7/11PKEtaoEoxxchrFo0q7bd+ KW0HYNgbfS1OQwU1uxIxaGcl1zTg/1cbEGZ3VFvqr4uvxVyMmDEOocYowa/ErvEV CuHuWXxmYED+vd8YgISHU7gTNA1QAwAvSdwc1ZYe5vnRdEd/Rm9T+7h+Z8AodAeR 3ZyCn43OCFSudA7ResbJ9pH980PNkxM915x4ojqrBX99ipeLUDrICVfws01Q54uK O44nIxYjZ4C4157A8mtxWQ== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47900f3xs2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:20 +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 55KEUPx3038193; Fri, 20 Jun 2025 15:33:19 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10on2076.outbound.protection.outlook.com [40.107.94.76]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhd22y0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:18 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DGTpRLOLq068ffQzffOizXnAczcpnjRHLi//zS918khO3ADbLhW0J8hAsrcGWZiz8oiNCv2VnsfgfyoDHAdm42crHA72+qnnoO8k23D1sFpH1iEnjIEmavMMEoEu9GzeG7bhGnWE1NWFWlSGwOXdLWFGNjaBMKmnObw4bRnksOIm2T/2OGdRcup5CUz++Zd1Zg5cFX7nzQRgxiCAXzjsNOr8DlBmUTz64wQvM336K5zYTOhRgREVEnqiFki/iQxJsdzQvJHNdBt+ZWdl1CIp5RlzZJ1YHHJxHj2DBwWUmsgYotUF/MWKgMX2DgeXIXd7+EAodWY/JBmqn0D7zgbT+A== 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=K+aX+Eb3nmRI4ka7SsyaogwNVOPsV+C2P4l6858MmEg=; b=fQScJkiDlFDOMt8nCJbhHZjtvWWz4gHH9gsO2NV6iqCUeg/QLHJgWJdhbE4xnnx6lhzZAOwclmu4vq6uvYfbouW78XkqG2fQbMNg2Bok1+3ZwePbNtRoupIhz258uWv45Nw6EdeVGZzuOeLB3IcdxaxYZUcMl28/W3Pc4VzlsfUdebni0c/do2qyea+UMd61t18XlGEqhnrSbt0gsWKM7Ml7nZ77WlhpXGzwOfw7Y9zKVaQp9M9y7EcD/Ye6qB4A6Pyq3gp1dn+1dviFw7vkcHWuUWUT3BiCy36JfCSeiAXbKnmCFh1WVXassBCnihECgw5dnEBWp3cZQHGTYMoWQA== 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=K+aX+Eb3nmRI4ka7SsyaogwNVOPsV+C2P4l6858MmEg=; b=nhGACB/5oFWTbEbdVKLXTGv1bmBb8XhlXuq5c/Cn7paDAgrALnZGbfu/wEoGUAd+n15DjW80wrm7m9LL643+aFuylriak6Bq60WaTh2on98uWSwaysjxyEdLjAtVcoKMuHvyBlIs1dIvUPOc4ClYOIJlIDmwPe5Hhi6pUGg+0Po= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SN4PR10MB5591.namprd10.prod.outlook.com (2603:10b6:806:206::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.20; Fri, 20 Jun 2025 15:33:15 +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; Fri, 20 Jun 2025 15:33:15 +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 v2 3/5] mm/madvise: thread VMA range state through madvise_behavior Date: Fri, 20 Jun 2025 16:33:03 +0100 Message-ID: <518480ceb48553d3c280bc2b0b5e77bbad840147.1750433500.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0130.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2c6::19) 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_|SN4PR10MB5591:EE_ X-MS-Office365-Filtering-Correlation-Id: e9677312-b303-46c0-8704-08ddb00fc67a 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?qWyPF5bsjL3d3GRH8Oryjf4u1g9ztSfbJmF18twnEJlnzNI+oOa00NHY4PT+?= =?us-ascii?Q?xOysOnwe27l4xjUmtUwCwUmJf8vlo63jeVa1Axm6q9VVHl4ui/Qb430PHxo9?= =?us-ascii?Q?mXpnVFviOxDfX1LB9LORCxHatsgqicnUJmUReDdqqHdOM9BGFoZgWkMdtCh0?= =?us-ascii?Q?qy598wSQ8s2ua4QeBZkV6wiZJyH4jh9n47650D9vHmFPLFbCmHqnOXD8wBPR?= =?us-ascii?Q?8YzzGWwJAbKlez3SIyzhnrcvXaRfb9ZItk+zH9yIjxy9ilCZ/I0XZZDbFmxX?= =?us-ascii?Q?a2Im5cT5wEW8cmXO1ClG4Cpw2aDcLqr6fB+6LoiHZzGd2J/ZDvEqEXx8Kz9F?= =?us-ascii?Q?16gk31vLKxsJq3JbiaEb6dhDXsGZfX88urRQwLdcs9OZMcZGfPQ99b80DJf/?= =?us-ascii?Q?k3/PRKOx39w7GlBkXM+5WIEWpo7fN3GdGFf3gMLUL7f94A+4HUOiMS1Vapn/?= =?us-ascii?Q?/kSy1j1PYYPhN3YhIpE6Ehj10qiLal4wJwPs1/j3KeSpJQXNDByVsYqgmMlf?= =?us-ascii?Q?q/+uJWCoa6IpFiIhh3B231xk9/7Pf3jb6RbmB4DfPSRWKAZ86R8nbPI++j81?= =?us-ascii?Q?/wnJqL2ucx+dg4NPcqrovZUZ00++dLT4dNagQGyhmrhz5D7XKMea3/qZ/x/4?= =?us-ascii?Q?MT7MbWRbHfHRKiH9U+Xjm4LoTt60iuALV4oLgPiPHNyJzGURE4jFgx3oElmh?= =?us-ascii?Q?phtb/WyEYgeFQVhzmjvSNxyUf6B2HIQh1yJR4IkzMCLPtEkvxg/xDAGV8Ugt?= =?us-ascii?Q?IBLXpKNJdAPzaCyrh42E4F5g3kybWd6XkC7Fs6KKid1/zYcxTysxwDnty7i9?= =?us-ascii?Q?H8TzOxUor4uysIhFYwhabIJjCJGboKOa1rpiPds/Lj0YDcaiwWVJIAq5HXAg?= =?us-ascii?Q?YiAlXpPe5NYpxVHAg2mhreUWe6yitiCPLqObkPcysyTrg8ZpjjJU67ppBjN2?= =?us-ascii?Q?goUQ9xLM19VfusdN7sLyLuTQ23az9mvvqMA/+kBKxYc+TMk0kjB273qCHXRi?= =?us-ascii?Q?sQMffOWcWuOBO3GBYPrm5uUMBExzYDqC2jzzDKV/XuanM5/H08Us4EteCK7i?= =?us-ascii?Q?RU5ZNxd4fAPbNk68IFMkhXmB1QNv9zfSxpRZmLoNfH0OCrgbQiWK1SWhScXW?= =?us-ascii?Q?1M7NYH8Whw0oj1TigfcZKwa83mKL3q3e74rjWDrBSKSAEfCBDYizlvhvuUVv?= =?us-ascii?Q?h3em+ayxmY5XrDQNu/CX8Ari5WW8HCnhrLR8hZw663aG/fHzqzA3Q+skJ+P7?= =?us-ascii?Q?TJ0S4t94S7Gy5CVkoQZXP5bNUqcWLHoxaoNEQFsVFEhHMKyw48ngzUj4W1PX?= =?us-ascii?Q?HHqPCe/NYmpOfy1tXxgmELY2wbVTl4bx1Ed8e8aplwIT+ENrbjoKcYYS7gys?= =?us-ascii?Q?Ky/hKNWM+rGCJ30vRN92mF/dT9dTcYfHeGmVGRXcb5EGLyQFDgrCvrGm1q3M?= =?us-ascii?Q?Mc9p2ZhK0T4=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?IIh8Okq12/dXJBf1upaa4G3bImzMDchctdL7r48WvaaAHT21rLn8Xr1OiWqm?= =?us-ascii?Q?EYwH47OBALCrteReJsIaqEAHnxMJhbl97aMZ/rk10UNGB8loZKNHn/5CTaFR?= =?us-ascii?Q?17EOs0Db2gi8owEwLpMuQxTsL4XcHCROGwAIGF6kmvnhcEt7QfKyP3lj6n35?= =?us-ascii?Q?y0yEMH2tzlhqp7YW6P7SlFyMXHaCGLkXDF5LZ87e0S+i5SmqjF1+bl9pxz9g?= =?us-ascii?Q?xjsJ/YTp43GYBas1ZcvY95h7cmdrgcFwe71BmhJeZbyHHwODaFNqzQPcQcrL?= =?us-ascii?Q?gAF4X7hYqahpYV623ZaawVzOHqygP4ceg8v7+W1WG0tigitO5mOvcs7VIfOx?= =?us-ascii?Q?Co0WjAjnqnskvZDckIZK2Yl+85YkPy9gJW0AQdrNb/w870YigGjLLr+s9uRR?= =?us-ascii?Q?QGRkKtVFxUh35lyN5Xa3KZJOHFFw4Xrd3Bfkrd6sEpur+muPc1VJ9xp6fQ+Z?= =?us-ascii?Q?DnNClPzzzpNsn8hYUID2czl1vxnPAp6jBWN8vgGfXAmeCdm5JW3FDpSgZkV7?= =?us-ascii?Q?7+w5+Ru/gAXv+LmjQXxdVQGSgt+2hQku4CCHTXZJ/x5CQFyVzEtRs4CwkIX6?= =?us-ascii?Q?g23ZQ3M5/kXixFjYuo309y0jgX2OdbfBeYuL3uaXbWCYKzbJam7E9zZAvNGt?= =?us-ascii?Q?GgrHzWjxtODtE8P4dCBCAPVjykTGp9FLd3u43KIR0yvede50kcojeSW+mZot?= =?us-ascii?Q?ZGo51DzBYWJZvze9ffDXCWK9zkbP+vYo4pWMFWWY+mdEsnyKuiZX4FsuciD3?= =?us-ascii?Q?G+1eLGWodhajlffKfbnT6kIp7Ll/nUW6IDNqKaJYNN746wXE2driqCVvu4R5?= =?us-ascii?Q?RQypfzPdCSyQ0f9LjUXENplNYG8MKxuMZaKsvHT6Ex5htDInrtbwDgTA1BdV?= =?us-ascii?Q?9ikxXS/t02i1pGvHz+6ggQpzdCgxcnM1pS3sRpu9TtZvdfCH/9c6IKRKEIcW?= =?us-ascii?Q?SzMw1NFEnoT3u5e7bryWQ1QLcsVunxZSIUw5HBJzDwna3BHM3i+HtWpv9VDa?= =?us-ascii?Q?xAjodthNXWLZJ734Ng+nU8agnEOFvFa5kDXYui5I0EOf/BHVUrytu+BxofXo?= =?us-ascii?Q?GOTwsZdDRF35lnUI+/UFq3/TU+6McUs/OU5O5nQ1WNeuaPmhFSCITzVe5F2f?= =?us-ascii?Q?DLgjxjWg8NlU/pSPw3vsVol6AVX+e4oMDJE71w9y14RfaVguUn7VyjX/3nz/?= =?us-ascii?Q?4pblpNz6OgXNJEHSISC+Y6qzNv041fJh4AITms50wkEH7iTTLXtwc5dfpwv9?= =?us-ascii?Q?oUV4VKAZuq9XuVubi3Uo0FXeEhYN7/Z6hUEp5XyZlnFIry9r/GkgcGAHjt0i?= =?us-ascii?Q?IF+sJN9var+lNAjOsz7eoBgc0RiLc4c1gmktNcMyKP1/8VH5wiFD8wthXgSW?= =?us-ascii?Q?qTe/5gOKIBMysH7WcI+glhFSsZr2nGCPquQ7/sWhnX8qzYveBBG/KpRaCUZq?= =?us-ascii?Q?EV1BFxXfPcOiJWTipL4BWGuNtzMtwuiUC5xvTKB7zwY3jWrhxuBT3Br7mhKb?= =?us-ascii?Q?TsT25CRab2nf9VhvBg0sVtkfCGNMgxBZca6lBN0WcGnD70k6+ayjllRHu7Jx?= =?us-ascii?Q?DLI6Viw9nBCsI6ZZlMGtVnbIUWzGtoGEwEGpwArjhwZ4QyptuQ2grGAECryp?= =?us-ascii?Q?pA=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: GnkXeY3CGe03YxF7aWacU3iZDfKH3Gei+elBvgfyJar4lU3tjRPdUQumsuPbyINUX+0/Ol6WGK/drGmWx7bvLjg+eD4UjClMrv/piuZaqZWm6A2xxDBMeZePqZsGiju07Aj2ah5OfD44phm5YkwYxOCp5tUAqyaLD/ZGPLMNdc0W15Ga5WK9q7W7a2AjmY8MDXXvVqr1L8zz1rk19e60STwhCzhiYb6hT6ullIXsUo6CGoMsAry5EAsu0drJNp7md2oYJz5H7b3xdrzbL9PeQXBSYSmW4xkxWGfdVOPHX24R8QZojlxB7ar17l4FA6RmeALX5+GBSH4SO1rznCqc2QCRSS562IyILj9k/h8yqZ4YrgYW6YpxhCsaFkZF2BJzPI6fMKEntHcLsW4GjvQwV/yrkenVYqWjP6/sK/l1X3qlCgAxT/fp+GTsSfJArFES+dMYHn6u6rMAEr9sblGqTxudF/aN8mwfQfo1vOg/Z8zJ8BLZZPQgQFnmMW/nTkq+CQggXgvW3q0FSbM2QgiHcwcf7rglBK6p3loYLL1lh25y/ys7/lYS+wlcL3L0mYj6PGBlKp9sGEJsteiLpS7xtxg9i564SUzkOso7JOr/Pz8= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: e9677312-b303-46c0-8704-08ddb00fc67a X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2025 15:33:15.9260 (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: pIxdNsUkfWIwyqrNM54TsaLrVUXXDtWGwMvb1RDrqICb+h8UQb+JLz95NA43tuerNhqGi6NfgA71oCslLtJxyq1nbXajY2hVA5R6CjXh3fc= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR10MB5591 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-20_06,2025-06-20_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 mlxlogscore=999 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-2506200110 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIwMDExMSBTYWx0ZWRfX6XowdeQgfQb1 30qPl++k0idpPfyg8uL60nV128+v7NBsTnzocz0WeO7mFu+AnhznF+E8FAyJlZUdjWgjE/5EyI2 NvOHIRhiDBCYc3J1goXq5jdsHl1Y/KtuM0/kP5RLVdw+vyeep7Y8hjN8KOdapb9aRGzPlrqUivS aQ97ocTgSuulxcEhVqwDgMZBSSX/NCFuWeIvnTj2OezRUf+F3mj4jsph35BZ1NFMlS5iiuNDnHr Vfc0VVVPRXRk+OPNUZXWY4YgYGc87jJx3rFhn5enSwGfsvGTbvq/qTOoaMEqwrBQRs+Oir/x89v J8uXTI4J7gG1QBxh+69vo9/9nb85WebOt673L6viJd9OqfRVyouNgRSzk5HJqSRrFvNeAbU1Gae IhBNBm8M7PZfUI6gLDecd4+HFpZqO3DBM6IKxcnFZ4Pbfp9/5fYU2gabVvL8rDitfihKpwyJ X-Proofpoint-ORIG-GUID: D-XWZ8_ivnWDk0c3PhbkuoTKS5ttwGZE X-Authority-Analysis: v=2.4 cv=X/5SKHTe c=1 sm=1 tr=0 ts=68557f40 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=vYuUfPEG4t8TmVnAmMUA:9 cc=ntf awl=host:13206 X-Proofpoint-GUID: D-XWZ8_ivnWDk0c3PhbkuoTKS5ttwGZE 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. Reviewed-by: Vlastimil Babka Signed-off-by: Lorenzo Stoakes Reviewed-by: Barry Song Reviewed-by: SeongJae Park Reviewed-by: Zi Yan --- mm/madvise.c | 103 ++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index f1109c2c63a4..764a532ff62a 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -57,17 +57,27 @@ enum madvise_lock_mode { MADVISE_VMA_READ_LOCK, }; =20 +struct madvise_behavior_range { + unsigned long start; + unsigned long 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) { @@ -147,7 +157,9 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigne= d long start, if (end =3D=3D start) return 0; =20 - 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); } #else /* CONFIG_ANON_VMA_NAME */ static int replace_anon_vma_name(struct vm_area_struct *vma, @@ -993,12 +1005,13 @@ static long madvise_dontneed_free(struct vm_area_str= uct *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) { @@ -1289,12 +1302,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; bool set_new_anon_name =3D behavior =3D=3D __MADV_SET_ANON_VMA_NAME; int error; =20 @@ -1411,10 +1425,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; @@ -1468,8 +1483,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; } @@ -1551,21 +1565,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 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; @@ -1588,13 +1601,14 @@ static struct vm_area_struct *try_vma_read_lock( * 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; + /* range is updated to span each VMA, so store end of entire range. */ + unsigned long last_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 @@ -1603,11 +1617,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(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; } @@ -1618,8 +1631,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 (;;) { @@ -1627,33 +1640,30 @@ int madvise_walk_vmas(unsigned long start, unsigned= long end, if (!vma) return -ENOMEM; =20 - /* Here start < (end|vma->vm_end). */ - if (start < vma->vm_start) { + /* Here start < (last_end|vma->vm_end). */ + 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 last_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 < (last_end|vma->vm_end) */ + range->end =3D min(vma->vm_end, last_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 (last_end|vma-= >vm_end). */ + 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 last_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; @@ -1834,22 +1844,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 02:51:10 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 C13BE2D4B6A for ; Fri, 20 Jun 2025 15:33:45 +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=1750433628; cv=fail; b=IyHxmCw/oD8jH9Rw7x2hI4RwL35m6hWxYeS5exJ+bfYS3Oc3EcXCW38YzvEUIo/tP/RLLeUdgu+yLAk+8jQYk86DLlA3in8zozg5SZCvlm4+kzPNqwF5T7HPQ7l3LoBmZi/vm2e59vXQcK5cVJnFnMbkKuRytahkrdY7S0dPi4k= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433628; c=relaxed/simple; bh=86XVffWJXcbwwPSl8UAduQsbLz2FeUh0yvi2RTVgjGE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=S283JYcFWmQXXNgMvzqt2aCkOOqpWDddX8ajWXsfhfg3P5ZSwkLkHilGG543Hl1QLpgSCrjmPcVnooWKqbptkth0+lj4eLCex9jnfhxcHFH52LKy+AAC4F+2H5o4UYHAKwTJ+36kBKiU2q8ri+Z+P6QcnHGHpXd7T759yDnW+Yo= 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=N1weL4VJ; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=PHy5oEL4; 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="N1weL4VJ"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="PHy5oEL4" 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 55KEBmeL007768; Fri, 20 Jun 2025 15:33:21 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=LLLT1IxFcXgYOX1QMP5MH8ZqOofQGU5oMAjOpuE28iQ=; b= N1weL4VJfrthFYG5EUA79k2wqbeGJfxivKUkg5grloXNJU87l92shs+0z/Ud/Fbw 4UV8XBmw+gEKvqO77XUKROKbUpgQbt27X6sz1/g4JOdZ0M9VQP0OfAS7y413RAK6 lz1DeUt6hkuEeS+YKetIaC9ftdH85a1Tb1QjM6daWxVivDq01ZKdMnWNrOfZOajc BZIUef8Cuc7GkZM+TlNaSMYNu6RUeA22EhvaORjGcDIUCMuiEeXkMO7e6U7/h/w7 is3erX/wx/Vore/EWD6DkgHAksOL9Hc+q5WBwVy1QaI1M5YWNjMGoxYTjhC/V/q/ 49WG1phLbvcQ+e87UDc6Hw== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4790ydbuwp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:21 +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 55KEjVOZ018271; Fri, 20 Jun 2025 15:33:20 GMT Received: from nam10-mw2-obe.outbound.protection.outlook.com (mail-mw2nam10on2070.outbound.protection.outlook.com [40.107.94.70]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 478yhd2abm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:20 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=imxogFoHp4KVDlLnY+wO6arOGkZB0M98e3RReBMsPyyRVeo254HKWLrtg+dG9YpoxuMf1FaOUlm6Y+E7MjBkXnBxm00v4t+msYpK3FNE5TVN+ytiSJ6YgxidtqsobSudDuGrAj54PNVDML1GB4ilZcToofC5kN1jYV7U2DrdGNsgZoVfAxQa+f/YiKa00HMWbCPfM/azG9WgO3FHlMxiEZjDSsMc8jb8JONLfQbv+yg9nv2VFtOSzBPPebxoXNxdKTDeMGbVIAIR+JuWbn7RqafW+ij5ExP2LqUCX+RxN1eeLCp9jaA+yjLqYfOLWGDSQuZ5i+QbGGlIeTF4dAbL0A== 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=LLLT1IxFcXgYOX1QMP5MH8ZqOofQGU5oMAjOpuE28iQ=; b=VFoNYk1feu3Ens9M+MleFcBR0jZJIdKUdIA1YF2qLK8ELRYRubO5PtC4ZcaFZhR4Wcs28xt2X9F8p59oDkcRAmO0UtQfPWgQGdEo427PjDH//NizsKVpL7FK7fRDsEVdOxOR9UVI+2goyYIILcWm/Sx8hCLzrQpBE7ZxkTgm8NIoYDBoM63W6N4cmbVic3RqOxn7iy5mwEqPlTEX+z6CuCJtYOCBN0r1CHpSeKB7+9QWfeXxeHvFeD0JQgUJ+d7fU2zkElwQGxPgiRCVKir5D78S4k4xInkOmfy3S+bUUvPlOhYAgCrNEYJnEgOI3ziHvgO8hLlnjbsnnQXKT2fN5g== 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=LLLT1IxFcXgYOX1QMP5MH8ZqOofQGU5oMAjOpuE28iQ=; b=PHy5oEL447/6d7i3oTxkRPVkOuar2zfieyIfSjZ2Fg54tTiJVB7qSANyqvue8MNs61bGdfr8wX9DnbYaiid2W3eXPvLW6tSmz1+8UA/JNkngWrwfSOrwTFH8YlJ9Ky8pq+IOvqMzIwPWUR198xMsmm34jmAfz9RB6OYKcpo7nb4= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SN4PR10MB5591.namprd10.prod.outlook.com (2603:10b6:806:206::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.20; Fri, 20 Jun 2025 15:33:18 +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; Fri, 20 Jun 2025 15:33:18 +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 v2 4/5] mm/madvise: thread all madvise state through madv_behavior Date: Fri, 20 Jun 2025 16:33:04 +0100 Message-ID: <7b345ab82ef51e551f8bc0c4f7be25712871629d.1750433500.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0238.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:1a7::9) 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_|SN4PR10MB5591:EE_ X-MS-Office365-Filtering-Correlation-Id: 1bb8a947-cbe0-4b25-bf77-08ddb00fc7d5 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?HbTAMghHep9tvjRGxO0Z1tUBwsRIhkhN6OQq1VycAOAIUfpD4L8IUjLYpp2S?= =?us-ascii?Q?hXiy7eIbSNV0ZG6zxAoHq6of61WCsOpbv2V1Yrk/r6XwAEk/woaAsxa1pQ0a?= =?us-ascii?Q?+gP0JcZdwM7PKG7Ryw3b3/UWOQBEmbJmnU91Zd/wAmhKMZmc9e6RpQdDyHWW?= =?us-ascii?Q?Vv3IOG+4/T/dQ6i2e3nIbFtH/uUArq2tp0bKckHE+AMGZ0C5iJ3OPTS29Eeu?= =?us-ascii?Q?/39MbBmxDSPmDReyjjaCf4ynghWS3BMTUxoK/27X2UNIJus6n1kHgW9hBK36?= =?us-ascii?Q?GRwgJ39QcizH2sAGaSXd6GjOAdJqq12PIdp3EXFmYDN9HQtM8rsDydTTr/Ej?= =?us-ascii?Q?c2c1NHwOxQHs4SyCYqbHGIXpP0NgwYQeSW44Ac4tLtsbrOAaOSxjBu7aw/PX?= =?us-ascii?Q?ynRh8TkqSNq3etdClbkIXgH9nwEHskf0ucZWgn2iiyI9la50q5EbYEZMNcy9?= =?us-ascii?Q?0OFWT6ZTXzm71JiWZ6jZ9QFIV3ewBiWZlPA2x9wNNqpshJmtcKMa667Yiqho?= =?us-ascii?Q?1OkYTBU9Oj0V7HwkkOjOuU68CMrolR5I/EmGLPeQfaG1+9Sqi3bHB1XdGZkG?= =?us-ascii?Q?628uSNxs4Bdy3IOosla8RRLhVI4dGKR6ytAJj6OM8QAgUxR/701WX3VH785c?= =?us-ascii?Q?B+1Et+6e94dtGytCCd7PZTuaNgHns3I1VABZmK+ZCxgkzUgw00CKfyDZwRx9?= =?us-ascii?Q?icCruprFW5tD89MkTne+tifj+MKxU1ZVYVjdMlSeCPHJaV9z+9EMddRgW2Ew?= =?us-ascii?Q?eTYx3cP/YlrsSOgLBqnE0jyxgN4gJYy1Q3hZ5iLrG1gz6G3o0akF5EKjN7U1?= =?us-ascii?Q?EBJWtmY8tX1aBo7+N9R7A5O4EJPfbAjWsJORIUxNGXZu0JsdGUkxrxv8Nk1T?= =?us-ascii?Q?RASLkEdH/Hrh1mU7SuaV++IwU3nxa65Uv0TgteAbaG6pYJIwz+nSZPDHmhUK?= =?us-ascii?Q?HT7VYtX+IwSJ/oz1+gRxv9aPxcF009oOsryN3P90kXS60ASEBF58fBLyXgLR?= =?us-ascii?Q?OIOmB+2xzkPgGtrOkxhY5/rpNvgolVCMgXOxHvbLPVVd2v1lD2rJGqWGds+l?= =?us-ascii?Q?32wLsh8qHZz9A+VfxfK477ybPhjkbg5K6kgdgIEjXtejQuIRrcvJhMnDC1GN?= =?us-ascii?Q?qKrLe09ZO9tqPpEpFXOjKX/J0RX1l+jggpT6dBHnJAaLJxxgjfAi/WZLGXdj?= =?us-ascii?Q?8kP3vGQly5vllK31xdKNME1YEiDVP/97VC2f+eXyq+K8t49BmUiBZG1s/uxJ?= =?us-ascii?Q?g+9taeIReyXKenEUzK9C8ZcLgJfxKPL4BRr5dtfo9QnxIJDF7yt6S9vKvGPR?= =?us-ascii?Q?cJu/7ZLYHUbv6G7+SBoCgH64I7hPr5ejWtuKKhoiFUlYhGv/SJvvweRKmsOh?= =?us-ascii?Q?tcUlxHkZjm/m2gfu9FdU5eRu+WttlI/76snySwy2rIf4XyIBksqpyFXjYSsV?= =?us-ascii?Q?LqvjM/t0/L0=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?d3X9kdCUxdddvDnaLHfqfr7mEStpMGWka0wwdNxDrLkXH8QSBGHSWLa0Gh7N?= =?us-ascii?Q?GdlngB6DexyARrNKhrO6I8x48rm4b69K05pbJk1Dz9Ly3UfdHoIZ6/D/Dy1F?= =?us-ascii?Q?O9ZBDS1KvudmqdHf6hNrv2tGVQwEFTfDmjTiNQsbax8TSfmT9p+Q1azBAgY3?= =?us-ascii?Q?BHj3hK4Q0ALZ7jZO0NcSNWomoJAL96YTbdz3ZRXRP+vXG8Ff5/rwGk2+CHTy?= =?us-ascii?Q?v3amOrVPXOZM/3EuSlv9nFJ1qlLmqCuHrUtuuymVYeGwcwO7MHN7B3lcBhpm?= =?us-ascii?Q?I0hmn25R+yE/rLkhB/xVyDPL3vKOGZR1+4dwWxrLkvT6tiCO+3Bb6Fyxg3qg?= =?us-ascii?Q?8preJ9E5qk385pOcHxBnpf/IPtO+l/lmkKMdeQQpgFTumV3AI7zxnUGyN2Ar?= =?us-ascii?Q?FCOmivZ4/LvtbX1XZsHGjJkg6JigJ3CNtr1Og6GgmJe1SyVrezFX2/8QSYA2?= =?us-ascii?Q?/3smIYVuDfLOBaekqUKdNGEQtCwxuIYSxrVWRb0LKX8+Rxzhgd/R6/rp0ooa?= =?us-ascii?Q?yHFzx4fx4XY4mRtO+jSRYOgRI97CKd/IJl3ro7cmPbUhdAzZwZSbXIYOh83k?= =?us-ascii?Q?BpHX9OKtKpP0+HkohWQ5KXUWWkutDTRxCtan2hTFaD2lvoXPR0BYbX+O2LF2?= =?us-ascii?Q?T4R9dh/+tM8leby/d5N46qMUXSrk1plkWm4sdsum5J9/LbwRrjtjhIo3bzGm?= =?us-ascii?Q?MhjyeSrVwyK61HyPouYcZAffiRCM/8Tt3PB1ATayBtINY7qyq42e3g9A8m7k?= =?us-ascii?Q?s6h+J4cUTUdqtlkLC1NrZxt1Q1lt4T/TCWR6xHNTflpnAb9EXu0aYyDYiRQE?= =?us-ascii?Q?qIgEmXVzD691yvg3orxjntL9/XsE8AwW3uT0hzipZR1QBI1zre1XtxcP7is+?= =?us-ascii?Q?Hqfqb4kKcRvQCx8jl4NOpBWlKjQ625hlJ2B9qqVyp4yn1Oe60wdO00BoyDdi?= =?us-ascii?Q?NiaucTgFveFykE/icx8oCFkXnrfOiLLkStMoikwI38MUwidkBMaXdROwW2lK?= =?us-ascii?Q?sghnfC2omKRGpfKrcxlLqQg65oPIdgdhtHmaEnKL1NGGycKQEelUPg4E2BTQ?= =?us-ascii?Q?QXzDdBEkvSB672VlJ6Ww5MoIaCy4v+Ysq7syIa4eAEmifjfFHPpD03eZGZJY?= =?us-ascii?Q?oOgW9UxyQ7NQsdqMYkBMRhIiJGO48Zhh01Heeqag/emtLG27G/WZwCLelsI4?= =?us-ascii?Q?5iRAuph6O8ob7/IVRONRD6tU6789ghx+i3XwcMOZ/sVM7Mgumo7XS/9LL3gx?= =?us-ascii?Q?9+FF9B+kRpRruCl4cOKsSut/unofdOj1zARzOvoA8SGB1rr1ai4VHzLA/4F8?= =?us-ascii?Q?jiRzvnwf/Qx6n7zb1PiK40QYrnL/MZP81EowMyrwHKpdLyA3kMagSo4H8F64?= =?us-ascii?Q?HSP4i8oq9TMlF1lNcJYOzrTwoUzf//A5DaAR83us8esPfK9s/gpDz9oY0btL?= =?us-ascii?Q?pX1Nn4Vgwpz5qeLfiGr6QlxrkHr6lx5BkrQNYUAoHD1Bpfe1jMgbjLYg2jkj?= =?us-ascii?Q?BD4lybVbtZlXNWl/DsRKQ4/nE4vjogmwaxea9S+dDxnXU4z7DnfPNzCAlHto?= =?us-ascii?Q?yvrgNMFSw9sV7gFVluELbx9x+Eyz1XNWjWWVYzDRhsL2cVyl9ljCI9VmGSB9?= =?us-ascii?Q?7A=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: m44wJg9f08PpfoQw9XXpJmRR07LzRW9yu7pFFJiVg+zJvLjsj8Gu3g6v1XFa7tLZbG3gAGIrY9rtu6H+//Tw5vgE/QZlWBIsSsrl7YpwoOAZ0bbj7dkenDbo72cVKnDvAuIsCus72RUbHv64nhqNMGDQFuNxJQ21tiFCGv2coeOIz3AuAI7CcQbf711O8KKTHbyiTT8ncSGaXqPcTRm9d0pGWXdJ8+IpgcXDmdl6QZ/SgJoeiiiLh99dP9pAI4ZlecuCdLNt4hfnAhA1vKZl7GxE3rT3QzTwQSimrtIAdL1U7YBUWIurGkXtn78+qf8ZMybV6qS/hDzMYSTwHu27T/xmmr2l98Mn6YhdCJlSsfEBLOd50LgrSQLQP1f43M0/vdR+kua2Au0aW6StxdXpnHcZS1XLPVLIRMwmLrq+NgoyIZbn/FS+OwIr1jwn0nxmxpQEdFNj0g/XPxLRx0wbobMJba6b07cR+4EfcP+1mQANFqo3Gp8uzfKNLQikXE03DeFqvVqAUFaEiCHH8Es8Rxdgvoz8cLGdZhTenSvvU4/5k/tOS4wMcHbIYVKxvZ21OvrkwZWJXnCu0ZFP8g2nKSZZKgpvqf2mD2HSU86L/ws= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1bb8a947-cbe0-4b25-bf77-08ddb00fc7d5 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2025 15:33:18.1876 (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: W3suRGsSmJe4TE2cPfIZNzgidzVh2KBf3u9vCsEoDmGpsmNmRZJpBSC/7I11iZ0QZ2AjZAgQ5K3gII++uWuiJcfL8WqKKVCf2C47o+24veA= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR10MB5591 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-20_06,2025-06-20_01,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-2506200110 X-Proofpoint-GUID: 4hs74_Dx2mTbA7ukPPLJLFRfEfI684Oi X-Proofpoint-ORIG-GUID: 4hs74_Dx2mTbA7ukPPLJLFRfEfI684Oi X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIwMDExMSBTYWx0ZWRfXzlzLMv/FjTIw bXNMR3yWml2f7mVwxOpDx619Dn/T1MEzEjLP6IyndpguXi54L5FlsZWtlfjMs4tSrIANp50lvyJ rZqFOFGno1v5vnpUfx3z/mDBUY3Uy8m6p79+3YyW3JjFiQei919ew6zE9uDACFUJvVN1XKb33oN YgVgerbHyisUhWzFs2qTku5omX8TNNHU2VE11Lgm68DkMDh5Mx7j5ujR5USRugC5CufyurMADr+ D1d9U4kau8QnXkPK0GwAJHX69eD807VXVnllf6uPWM6iocDprHYv77aX2p7k9PyADTAHP1OgVG3 /Rqp3nmJR6quL3Bs4Rg0v6TKwQF5VeZnKi9q92vNzC9YqO8JIPbmHpy/WgzVkocj1hkgv39v7/b qwd5ofz0C7uHs8tF0mJFmQZ9AWQZ2cXr99oxu/A3YhbL7p2zuXK3ZE1vJim6tRdfp2OjYnKI X-Authority-Analysis: v=2.4 cv=XZGJzJ55 c=1 sm=1 tr=0 ts=68557f41 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=Ikd4Dj_1AAAA:8 a=yPCof4ZbAAAA:8 a=eDijRFol0gWCE8jJwDUA: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. Acked-by: Zi Yan Reviewed-by: Vlastimil Babka Signed-off-by: Lorenzo Stoakes Reviewed-by: SeongJae Park --- mm/madvise.c | 281 ++++++++++++++++++++++++++------------------------- 1 file changed, 145 insertions(+), 136 deletions(-) diff --git a/mm/madvise.c b/mm/madvise.c index 764a532ff62a..f04b8165e2ab 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 @@ -177,26 +179,27 @@ static int replace_anon_vma_name(struct vm_area_struc= t *vma, * 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); @@ -301,15 +304,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); @@ -338,7 +342,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); @@ -603,16 +607,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 @@ -621,28 +628,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, @@ -650,18 +655,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 @@ -676,8 +680,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; @@ -840,11 +844,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 { @@ -896,25 +901,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 @@ -926,7 +934,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 /* @@ -935,41 +943,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 @@ -982,7 +989,7 @@ static long madvise_dontneed_free(struct vm_area_struct= *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 @@ -991,16 +998,15 @@ static long madvise_dontneed_free(struct vm_area_stru= ct *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; } @@ -1048,16 +1054,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; @@ -1169,14 +1176,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 @@ -1207,13 +1214,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; @@ -1223,7 +1231,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 /* @@ -1279,11 +1288,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. @@ -1291,7 +1301,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 @@ -1300,41 +1310,38 @@ 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; bool set_new_anon_name =3D behavior =3D=3D __MADV_SET_ANON_VMA_NAME; + 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 @@ -1351,18 +1358,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; @@ -1370,14 +1377,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; @@ -1394,8 +1402,8 @@ static int madvise_vma_behavior(struct vm_area_struct= *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 /* * madvise_update_vma() might cause a VMA merge which could put an @@ -1403,14 +1411,12 @@ static int madvise_vma_behavior(struct vm_area_stru= ct *vma, * anon_vma_name so it doesn't disappear from under us. */ if (!set_new_anon_name) { - 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 (!set_new_anon_name) - anon_vma_name_put(anon_name); - + anon_vma_name_put(madv_behavior->anon_name); out: /* * madvise() returns EAGAIN if kernel resources, such as @@ -1560,13 +1566,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; @@ -1583,12 +1589,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 /* @@ -1607,23 +1615,19 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) struct madvise_behavior_range *range =3D &madv_behavior->range; /* range is updated to span each VMA, so store end of entire range. */ unsigned long last_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 /* @@ -1631,11 +1635,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; @@ -1652,9 +1658,12 @@ int madvise_walk_vmas(struct madvise_behavior *madv_= behavior) range->end =3D min(vma->vm_end, last_end); =20 /* Here vma->vm_start <=3D range->start < range->end <=3D (last_end|vma-= >vm_end). */ - 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; --=20 2.49.0 From nobody Thu Oct 9 02:51:10 2025 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1FF0A2DFF29 for ; Fri, 20 Jun 2025 15:33:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.177.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433632; cv=fail; b=IAm2ldEFwvK4ch3u1qmLd+Gp0yeUOfceOlJ10ph1K4TeBqaOS4bOtsTPHEhUXVsY0G4I4itBWZiM4KGdAOvaVPbKm2HVX1yWaBTuD5knJOVXRXLY2H1ML2d+HOzSeMDRe9eagCrNQVx+YwPslr1weCpiUGyHJd6IEbaJr+M63TM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750433632; c=relaxed/simple; bh=2eB+9AolxkOF/HVVx6dlWlb4qkLuoW+DHW/0FFnQY6g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Ayn7qF+2sCMOlfDrPI/JVLogbCcEom8jxWoxz5FFHfv86P95UcsJaVDqw/SHxVszdKxxhXMUuTixXI1UBOrNIFfeGURt5we7ZCX2D0V9wYvNHibwkU/ic6Qbe6PSWuta6s/LV8lr1KRwn2WDhB7KJ2BTHxFu00xvla+qU8m+eQI= 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=qqw+JIik; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=KfBvagMA; arc=fail smtp.client-ip=205.220.177.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="qqw+JIik"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="KfBvagMA" Received: from pps.filterd (m0333520.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 55KEC0gY022223; Fri, 20 Jun 2025 15:33:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2025-04-25; bh=RFttMlVu9SKt6S4o4IxvRt3E6iqNgDP4SXcFt4ZGMfs=; b= qqw+JIiko3Sqe0AzA4UYzLscyh9xNKddj1XLJxHVbgkaJ2pk5IKwcwq473SFmdcz WikhnkEla1lVMOpL0xJb9eXHDH53PywJbSTvgYy6U/yt5Je4rSc40qxUej8e88C9 eAeE+9dEr/TJH32cgqV7dT4mFLYk6FsCrSSTYQbAAQCWMvUX5o982Vl1i0bipDtn TRCCvZRmuAuuV8kVPhOENVjIlYxh456NDDdQxLeafYtsqpVEAEDnZ5NCnajYL7He HnoEq3DnL8jUnSvTJSvhJs+olmAdclvHPOlxK5JU/KjtJpRQtYqsFCL4fs/KWKLU G8WJveVbchDgnaunqEtTOw== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 47914euwt7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:26 +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 55KEJLDc038326; Fri, 20 Jun 2025 15:33:25 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10on2050.outbound.protection.outlook.com [40.107.93.50]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 478yhd230v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 20 Jun 2025 15:33:25 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=E/YXXxqmfrd6ju0c9FEjB8Hew0Lwgentgip8q9Vw9y4gAw1DBoK9h0JDvinA2R4n1YHJSD1xlpk8oVUuiKm1WXSywQ7++Jk6O3nIt4re7pdsqj7eVulEPAoeVtUZHWm3JeJzbTnv6wZQuDdvtuq+iLVyBJc+nvip8OFUFM4ovX/2Vx3IQ+ZOgMwIcr4c+ZmNYCVw75kKkVC1CUOz+XNSV6wUwVZy0cmzAUeDaGrnbDELyz+wE1IsywMUpl2OS7MQNCO6vmeTGxJiXWbFzVWvlj+7AtSrNrO4xZcfmKts6ABvB1/P7nm+SRcWKPAwrmF72r2ZA22T6ybvM7Jfv+DJzQ== 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=RFttMlVu9SKt6S4o4IxvRt3E6iqNgDP4SXcFt4ZGMfs=; b=ZvdExSg8ZTTgpg5CR1egmMIwzKe8HsjyRvPmTkNj2F/W6uVtH1Hc9+DJYFMaAyuG7StCFckevw9wJaGjFRHvsja8MQGDJb2dWohKBFRAwtkTbN94RYRRlPUexYxEVjwmk4Q9cZeBus7w9iFU7xWaEUeTDxtAc2Rgo2qGBIHmtkqOtuHGjBhrfb79u+KBvP1xpxx4FXbgLKBp1P6haTcSuOpdYnfHC5OOUFEwi/1rwU78f2DEfYB3nsy3SBdkTsqcdo62OfR3YI7tX6pmzAcgMVemuCamjVWe3mwnaO6rB76O6XhxbgQ12miFZPyKMslSvUXapgr0DpJaMTIjt+2JZA== 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=RFttMlVu9SKt6S4o4IxvRt3E6iqNgDP4SXcFt4ZGMfs=; b=KfBvagMArsxpVbZrOE4P5D7VeDfdern31w2qQBVkKBawfCr+CaW5G5iX55hRcjfDp2Bfpk+vgCMQV89n1UE4DHw5p0QB9LRluVR2uf6k9U2ClIOopmB68iTKZg1UAmHSp9zxRKt/AR31sKHjBoG9lrXMHPkDXJuToFrzShd7H6A= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SN4PR10MB5591.namprd10.prod.outlook.com (2603:10b6:806:206::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8857.20; Fri, 20 Jun 2025 15:33:22 +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; Fri, 20 Jun 2025 15:33:22 +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 v2 5/5] mm/madvise: eliminate very confusing manipulation of prev VMA Date: Fri, 20 Jun 2025 16:33:05 +0100 Message-ID: <63d281c5df2e64225ab5b4bda398b45e22818701.1750433500.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0417.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18b::8) 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_|SN4PR10MB5591:EE_ X-MS-Office365-Filtering-Correlation-Id: 98bb22e5-8b83-4630-1ea9-08ddb00fca20 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?R8hLWAbve/4Bd6J0vckmb8X24cV1kflxZbcn5uWk6H2OnonatzzQY6u64TlR?= =?us-ascii?Q?vtcthmU02/Pc+6LjdxZR67jm2TlBNTmqDbbtGX/Z+wcRm6BQZXkBHmBg7fFR?= =?us-ascii?Q?XmcVVhue0UK9cYXJ/mmemBwF3qwCiUFmiDgL619dOvtkQb7cv9VodaKy2i//?= =?us-ascii?Q?KsrWcJhnpK1TQsRZ8WmCxTKfrGLF2TyLMpFEJGXPfqvmg6RSJJA/2A9g7hSD?= =?us-ascii?Q?+lAvPtBrJjqBdGM2xisjOQVAkNkWqi6w+h5HiLqV/2IPV5NwqH62C049UoB/?= =?us-ascii?Q?qsBAdt/xz7AQn4JM+135LE1qBljpgRqWcIDBqPQIcXFyCpqNGBGEa4rFdji7?= =?us-ascii?Q?QSD/5ByP9XAXHrPUAt/wxLajwOQGFkSNO9VbtAmOWuLsd0nhyXE4vx2UApX8?= =?us-ascii?Q?1NJN0yQSuaMF4vDn5ddqbOoXUeRfAc7IEM/UOFzxbNuM5cWQjT+f96Qm2mZg?= =?us-ascii?Q?Kf0e8apAuzfWKfGvRYL1IpBFl6mhRXjEo7+byu7Jx4ZjnNduzoYICNON7o3D?= =?us-ascii?Q?7J4SeE+mighnqXrVPl/b7WX7RnoVmA62lSxJ15URBn3pBSUBGD0xYBo04GM0?= =?us-ascii?Q?pvLORNokqVdM8cc+fgUpM1b0nOxenaeLQD1m6+DLPGORXPucFZt+sKO9HBYt?= =?us-ascii?Q?mFRL501PhzcTAt8Xwab87eZ+Lv3LdqaDh9g7omuyTJbnxa1X9JOm332QxFZr?= =?us-ascii?Q?72Tlx5hp78iuuv8BYKDOOcfGa1/UKvVIRHrVucw5l/pURCfza44ShSBghX5m?= =?us-ascii?Q?FyF/G4wJKYMdMD8UsrTe8wTTmS+80he4GBekEBoBlzJruUrRZc2bbWXN6Ldi?= =?us-ascii?Q?D/rlIrsula3DoIcJdwnD2h+k0WNkU7yM0cro5BMv85fBMn+wNs5ATS/Etd3C?= =?us-ascii?Q?LfyESN+JuoI5W2DnGTjmwMDXXh2QMvSnxd0jjTGYrdEU2v6+uO+M0qhQUVFf?= =?us-ascii?Q?wOCcqXcMxFmJue88D0y7uNWjGZXMyOCw/RA3S1g2Qsze2rveHnVT+1SVN0bY?= =?us-ascii?Q?AquNfMOemFHjfNjlbulROGI2K5FCmuPBUFTDRHjrkRuJEfPBfesUFP7NKLrx?= =?us-ascii?Q?yikZ3FgpsvjIcOqooJDoTnugxdQIfiXeWO73rPiSGjMJa/wwxlYJJw/S+RmH?= =?us-ascii?Q?F5GIxYzv8aXvc9vlncyxqzfGdbMbOZsKWbXV+kE3sidRgySUhOArow0m0Qgd?= =?us-ascii?Q?9uA7ejCKjk2YZ9VO1S6WZp7JJMVAGVIBF7RYCdZzYp5q69DCJEJyPAa1ZXkN?= =?us-ascii?Q?4WUVPGNVkwMrw47W6KAe+ZQKITSAMrI09t69RiF+V8qSlFUK2KMmh8AMuueu?= =?us-ascii?Q?1RKGV+g4Wm4Mxm9Mr2ADnm5n8g5/mo1YQDjORnuSsVqPFxGh8Ewsp4f/+aZ+?= =?us-ascii?Q?5TjUIC2jMfUkFNv6vu1h1Al9X83tBAEGaWC25Z1NYMfFurNnFEaq75RneDR1?= =?us-ascii?Q?jOJDDwmKciI=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?m5nyCMZdpCu2EyO9GAhm6u3J6mpfZqVOy9cIhPRpi3wgC3/gCCqtzI4u8O/u?= =?us-ascii?Q?eB7VhE6Gf1g6+V+Z7+fpRcnBMAGCh6BiGQJgSK0gIisOzPkDzo7fXqkfMQSR?= =?us-ascii?Q?Tk4KFy4zSVMfdHgtD/w82QDXiWjHb4dX2V2s1Hi4ur0pWTogYYN7Imon2Nke?= =?us-ascii?Q?slZj53Hm8+9JKDkj1EUGyUjCyDzXMKctYqD04GWSatEIAa8YTn7ZjPRZ9V7N?= =?us-ascii?Q?3pXUhhjSo7xeZf3xBR87ExNYXRRA20TaEmUEISubVkWZhROujTpuUXvTIABk?= =?us-ascii?Q?KMCHnQGsBdY/iStPNrsVPsu+vCJIoZJRtlAjNPOGgLGjuZXpiUbwmw+CJAdV?= =?us-ascii?Q?TYNiMdiIqA5vtgnATWzSIW83oRhKWCHICIBHMuEJUfA2zLvoESrN29B+Ru+J?= =?us-ascii?Q?EP42OusM1nZLaSRvgLouqx1Ha4r0G/9I5WJPaSDVHjQcBqz0yQJ4k8Dr0cPw?= =?us-ascii?Q?ROGD6BhLomFZX4z/UlEMuf4JsjGxG7/AEfYhlPuy2WgRYZlTG5Vo2WEHCCtO?= =?us-ascii?Q?2BZCMwHZGvu/eaG6cjpSWxIGk7iSJ+1XB7NR45dIw2L2Asm1dH5keF6FBSfy?= =?us-ascii?Q?p2qTPCegDtjUDoNbZvGe525QkvMBODEUYd1Ig9Tn7Vx+k675XVfiSrkx+z02?= =?us-ascii?Q?7qXLkFbniLZ0QlGj/jNUPepIaK+SbKnfEXzrui0O9mPPWwZeqxbKvJHA3tEf?= =?us-ascii?Q?r9R988xZW+n2RZxbdUP6diHROR9IhnmOnt7ebNke5CSCF7BNxg1ByPPoMnZ4?= =?us-ascii?Q?XRo9cfK++p/wx8dC50JFHI2VGIpSp1MekOU5Tw67l37vovC6tTTTZBmf+oXR?= =?us-ascii?Q?pCPMybUHGqYik1+2LAOtT0CmpNeMT4dMXH4JcxObQ6MaOP3P8jaFAk2AKjki?= =?us-ascii?Q?fsmxAvLGmtMc0d2uWoGozHUmYyEh8GofCs28gy4TeH76zC0RpQxamvkWEAlm?= =?us-ascii?Q?WkU9k7dIrpSBuFGzZWblHYaGzX41PGsrSOGU0OswCULtf/tyk1L8OKig1hy5?= =?us-ascii?Q?djLrg+ZMwOSR+vuNWSO63FVcJQrFEM1BmjMTreEhv37kkDKTjbkFrOImglD4?= =?us-ascii?Q?BV37gzkgbWxlqGdDE5t/SFNSziFBabhfp7W50xQg0ggH+gj3rn4VZhvWvlDI?= =?us-ascii?Q?u+EF2RbMTwgdS8bDIrXFV6EkTcFiOC5fC0gTYNeAmgZMqMHf058K+68xAHx7?= =?us-ascii?Q?AIR7driHc8y4UFCMYuAMCx5XwQzAsUlwKSFnRrNgdVGDDc5KVIjd2UrPNR1l?= =?us-ascii?Q?lZdmdSvANuhII0QkQYVwU1QsaYrqSbIz+4dgKYHcg3fRZVn6+F7GJInEc6zW?= =?us-ascii?Q?g1MlbxNvhoNEsAgyd6iqe2o//6QQiDXPP6DcvQokciq1WY84XUO1hP5bMEXf?= =?us-ascii?Q?AIUiS6FiiPNJVvDi4DT1dbWKvmyGCIGEaQy3u9LYIJ/J1aKh8Q09R1ocMnuM?= =?us-ascii?Q?fhslHXTuP0aoOGUs9solUeSdSjjMP/BIFQSoTpEifita5j+EWanDSBvCFloo?= =?us-ascii?Q?qZWFIRYWONwi9Aa50qBcx4YnIPU7fuCF38Vd+BA7ZpC8rcuBLnhp0sJgzqn8?= =?us-ascii?Q?8Boab4cOrYvb15zF+/KpUMiLqE76ltJi09E2zSCjHkXZlh0Y9fq5+nm8n+uM?= =?us-ascii?Q?JQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 3lCe0vvfsjaJ0rTst5HM/wcIW+8oXyso6UYQolFsOb6gHp+H3/TFO8VMRqJIPbs0hgsY6derhbofzxCF46bSh+vgg/cvMEodzzk/286h/JA/a2ZRC9ABX0OUfJiZc7f6CD6m98c65yIDU6qcI9GQiqXLiXcRrEDojkD8gxGX/mrN0zvzB3epHT0l10l+/4DzEkOnF6LOaIwHtXPlW6QxOuxxkL5YziJ0UqRco/Nzoz40BNlu72j4fLWaCNVjouC/BJ3nH0Bu5BuUHm2644KgBqSWgiGLJYXBVUc29OuUvRFOc5L0oLMthyBTjk4H9i4EzGgjIDZu1ZptV90wvUSMEPfGLgHlN18pcFsynoS/Xwmq6erpqe64zkJ6hqlkSh1fc9GXgeWhe4EHSpdf28TLlXwbsWjCStOOyjQ0tJG6HryBaip3sZ4MWhtpDS3wgroFkMZoTq3aIlKua9lvDaHJGmRzZasojWM6Qu4nw5MvomNZczTHKTFVk8xKfV5WXZa9Gjv3HuqFoafWEtvUCqEOjVn1q5yY4+FvogoIBBS9KRKGPZnMKewRvgMHU+Eu0Dcw//ENYuq3Tu/YiAwIwt1YG7sVqPQQ0baPMPRZhWzdec0= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 98bb22e5-8b83-4630-1ea9-08ddb00fca20 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2025 15:33:22.0275 (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: ag52ZgPn40LPX+FFB+bA2PDKaHmEiI51H2GHMIDICs4SNOlcE0K6VaZPY/Ul9QhMsd77SGWlYpZnCisXRuINEMQa+ptXDr7LEAuyzo2f0xo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR10MB5591 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-20_06,2025-06-20_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 mlxlogscore=912 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-2506200110 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwNjIwMDExMCBTYWx0ZWRfXyJAI6h6yPqNU vFD3jS8KGurqh4OYU2oVFNDUei2VOZ5uLZ9H0/CmVzLZ3fVrpZFdu5sWhDE65rOfcNXuE9g5cvM 4HOX/KpljvWnUieKk6UYhv+aFKhepUY4WKzy+aypFxXX9A1W0fPH5lhel9EW7YkIqSD05vOB5US arA7l7Z7h6bn6pD9Bin41khipddwl58+vNo3sIRuB75JuUR7ZFsopuP5tzlTuQUn1sNc5qtr6pc fuP4JNwOebny9B6dQP+XPpaJ4gI88zgdHEGlKLrO8K2Tn5TBc6QcVOwCsjrFeDpQDn0GSqPGpAR uj1Cmtu+BxYURKCRyhC3IejWLF43bxeVVe3flMRT5TJ/Mzk/SsoRt5sTLfIQNE252DjUJBZ0U9n 3UDn7EsITMXM1mGJB+GTHgL47I1CWjAzPDmzoTclrg0viAtxOZ9c27s3QEU+6V7rWDPtCDpJ X-Authority-Analysis: v=2.4 cv=U4CSDfru c=1 sm=1 tr=0 ts=68557f46 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: 4RlWqBaVGf7GLTye5qiYKZJL5UtOhtuZ X-Proofpoint-ORIG-GUID: 4RlWqBaVGf7GLTye5qiYKZJL5UtOhtuZ 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. Reviewed-by: Vlastimil Babka Signed-off-by: Lorenzo Stoakes Reviewed-by: SeongJae Park Reviewed-by: Zi Yan --- include/linux/huge_mm.h | 9 +++-- mm/khugepaged.c | 9 ++--- mm/madvise.c | 77 +++++++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 48 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 f04b8165e2ab..4491bf080f55 100644 --- a/mm/madvise.c +++ b/mm/madvise.c @@ -75,7 +75,9 @@ struct madvise_behavior { */ struct madvise_behavior_range range; /* The VMA and VMA preceding it (if applicable) currently targeted. */ - struct vm_area_struct *prev, *vma; + struct vm_area_struct *prev; + struct vm_area_struct *vma; + bool lock_dropped; }; =20 #ifdef CONFIG_ANON_VMA_NAME @@ -188,10 +190,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); @@ -199,7 +199,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); @@ -301,6 +300,12 @@ static void shmem_swapin_range(struct vm_area_struct *= vma, } #endif /* CONFIG_SWAP */ =20 +static void mark_mmap_lock_dropped(struct madvise_behavior *madv_behavior) +{ + VM_WARN_ON_ONCE(madv_behavior->lock_mode =3D=3D MADVISE_VMA_READ_LOCK); + madv_behavior->lock_dropped =3D true; +} + /* * Schedule all required I/O operations. Do not wait for completion. */ @@ -313,7 +318,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); @@ -342,7 +346,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 */ + mark_mmap_lock_dropped(madv_behavior); get_file(file); offset =3D (loff_t)(start - vma->vm_start) + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); @@ -633,7 +637,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 @@ -665,7 +668,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 @@ -954,7 +956,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 @@ -964,8 +965,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 */ - + mark_mmap_lock_dropped(madv_behavior); mmap_read_lock(mm); madv_behavior->vma =3D vma =3D vma_lookup(mm, range->start); if (!vma) @@ -1064,7 +1064,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 */ + mark_mmap_lock_dropped(madv_behavior); =20 if (vma->vm_flags & VM_LOCKED) return -EINVAL; @@ -1183,7 +1183,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 @@ -1293,7 +1292,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. @@ -1336,8 +1334,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: @@ -1589,7 +1587,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 @@ -1617,7 +1614,7 @@ int madvise_walk_vmas(struct madvise_behavior *madv_b= ehavior) unsigned long last_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 @@ -1630,24 +1627,23 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) return error; } =20 - /* - * If the interval [start,end) covers some unmapped address - * 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 < (last_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 last_end) @@ -1658,21 +1654,28 @@ int madvise_walk_vmas(struct madvise_behavior *madv= _behavior) range->end =3D min(vma->vm_end, last_end); =20 /* Here vma->vm_start <=3D range->start < range->end <=3D (last_end|vma-= >vm_end). */ + 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 last_end) + if (vma && range->end < vma->vm_end) + range->end =3D vma->vm_end; + if (range->end >=3D last_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