From nobody Sat Feb 7 21:04:59 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B354C1F4E59 for ; Tue, 22 Apr 2025 08:10:06 +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=1745309409; cv=fail; b=oeSbbSPNva2dW5fY6wGcqlTNDO8qR8hwb6Dn4Fvjdi+Zw/JCwzoRRsgkEOaArC5JACmTIMZGyyAUyhM1oUSb58NLS/gUC7aIwrcgdrCfk7Agd6nfXOuOcd6Sp0AwDoy1iD+ddZScEN1JhT7wNvqcPJe4XqxVfqTM1tT7wSOBmG8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309409; c=relaxed/simple; bh=LIrW8oQhnxPReUz7eCBlCePtERRn/t2/x5r4VoH8MLA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=sBY4xG+cMkF1Mp1Hi3PQfhm+kMpW764IiUc85QeiVtZbMMImvt1PjSY8Ue1AGwB0rlKAVL7qSP8dYwujoVKF39PVkqhIU40H/vy1ALQgQPQmoRAgaSIVZyPsVW7MboCjChgTI+pDcPGyCVXrbPv+H2ADJlJd/md8hde5+hjV//o= 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=hGjF3Udz; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=R+zJ5n8O; 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="hGjF3Udz"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="R+zJ5n8O" Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53M7Mxrv027888; Tue, 22 Apr 2025 08:09:51 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=5BYqEfa94ZofeZWm3vMwqabnouuNx2Qt8hfmCv3B/Js=; b= hGjF3Udz7U7+5QzSXwQ7IieM6IayJyiuJ/8W9oWv8/KAPxlwpNRAHayhOyn3/yKc ftJO2O79g5RaWTH2IR8yK/mqN1hv2nV3lcwpduTF9Q9lRJBFuJcd3xqzeAA6w9f6 ocWCjgHM5CvB0ly4/rWjxVon+lGolkKhXPyHUSkf3Rse8DIPFj5eUHc07V/fpwHd S8qvmhzOaThwC/OdiFfv9iLpZxUaaCFNBTqepjT5QBIUzcmVoqt7llIm1XBC1QBa CzN5WtjlOFanYqsg8E4SS783H+alo/GI3REUzutJ02Ksfdg2pQ5P/r8uTxuY0rgX RwAYToIf8e45y2rG+/buMQ== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4644csux0c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:51 +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 53M7GZ4r021147; Tue, 22 Apr 2025 08:09:50 GMT Received: from ch1pr05cu001.outbound.protection.outlook.com (mail-northcentralusazlp17010006.outbound.protection.outlook.com [40.93.20.6]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhse0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:49 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Z2YFzHRFjpcsyH3jgApA60R/XkTwwQpAMspMWl1gok/LH8Uwln9p+4DkOBr4w5QTf7u4X25RdhztuMEEWssrXwUAenVHGGy/3zFd7+fezR46yxLuJu8Ji9jA/ywMV1lAEp7oOUGMmtvJng4A2fdNEAibOYNsCZ3nanadF1jR67BANTkeU1lTPSBvYIgG/cPcgOksrdupa47nnFFkp58yvzYt6OGIDat0Prt8rMmeRSeD8QFE1JRBHrDDAKVMZAfSa/pYBDqR0/MMV/eTkt4Ues7JKSilgjlrc3wUgAXJtU7k/tVZOkSFaRs2v+dnTAIg+LbQ2XIUDh0UsfdBn7txAQ== 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=5BYqEfa94ZofeZWm3vMwqabnouuNx2Qt8hfmCv3B/Js=; b=MTpocpOSKmomCtPEQ9m0pt9znUnn6KmOPQYD7KyvqMPn79BpBHqavPZOi9ZlS8X5mpJLHXwsDv3NLDkdxTSBlrQb1s1RVJ1IUhl5/z/AsdO+T1FDWkpRE0IOmoRHmzhyMsSBplMw9UbzpKc64qxEOrv1MiTC3OTbIn4wZWmCEnIBsuo3NtML7Qb+1tCL+jmYtcQpt3GTLI3rwsKT7fqqKpTrliOF8TIjLqysGAh6V0nhoqB97P4pcCcVvFTPuzU0W1zUEUnw5FJEPoEmtTvR6yA2w+xT8Rk13KKz5KBuE7zpQmkDJLVvtSEDHJP3uul7KEfOSHw/IH+JOQ+betbdcQ== 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=5BYqEfa94ZofeZWm3vMwqabnouuNx2Qt8hfmCv3B/Js=; b=R+zJ5n8OAQF7QNfEdRM/9MKEA7Jm+/TH7dH6zy8mbnWOC1VlExtAN2xFfz5pVPvnWpzNx7qGTPZIP+0M8xgC064HN7/kzkUy1GNc0LXTBVhM4tlv9ku/a2qjJS5rIL1mqz8DOPGMestTRI7fhB8i4EcNR6PveK+WBpUnnJYZkDE= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:46 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:46 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 01/10] mm/mremap: introduce more mergeable mremap via MREMAP_RELOCATE_ANON Date: Tue, 22 Apr 2025 09:09:20 +0100 Message-ID: <87e668d54927bb4ccdb7d374275e0662de667697.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0182.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::12) 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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: 06771ede-8307-4977-e957-08dd81750b6f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?oY5WLG9pVK5+vG/EPyXhUDNCzfiA7Y/EAOa5iBCggKae8fZloVy9KHB1WIan?= =?us-ascii?Q?AWxOBSWDl7GW41gGKIV1zAM9eF4pP8OnWpHkUKtk4rFKUBSXC+MvQYxvMkoj?= =?us-ascii?Q?zfLL3+BKx5ntoyDxrqfKIAZ6wVjc0inPNf3Q4a4AgIA6PVRg73DJO6PhtspF?= =?us-ascii?Q?GCkUFgYHya1jF/pJa8eqbxHfuOIzZzA3SAQXqeVIojmzKz1wCrLPndn7tkCN?= =?us-ascii?Q?JgoQGnmnZI8Zr1WY7i6ak+uYvRyOtCuBlCrFNgiOU5oa+Qy+IiMU+j0NPDNN?= =?us-ascii?Q?pC7PqQekAQRU1H664bAReAKpmbEvkK2wPtYPinxAVtFnTObQnHA2Nf1k5fNL?= =?us-ascii?Q?0cpm+KiRtVokNt3r2FD+xxcwypGZr5sJXui/3dy0WuiX3NHj1FcJQAZlxPCZ?= =?us-ascii?Q?U8V3PGKimDHVGno1YnLHP7GPQLEaBjwr2vWw6UZPW7DmzX0A9d/MFBRVOaRA?= =?us-ascii?Q?92ntO60Cd7mauHthCXMWI3RdUh8XhnW6SglWbYfpaNU3uy/AWodEH9iVgrmB?= =?us-ascii?Q?o7MHgXw6n0f6uNlkDcmbzHUqYkX5TTBA1NKGz4LUw8LL/vWHjKPK5X7gv3YX?= =?us-ascii?Q?y2im+wU76P2bGu3W0AyydjOBFDvx53ygYM7vZHRCYXD0MdbRMEiiTmTU8jcG?= =?us-ascii?Q?iVBzEswWhHTaPbNNLOHBPuunBlbB/DgWdqmOYxENZv6kYpvF+9zXGnrYPnbk?= =?us-ascii?Q?WOOHTaXAk/S0UapvPslPTOpfcSp5MSkrwWJJPViuq8sjB0OE9Pv7IUtmkYB3?= =?us-ascii?Q?IGphN8XXOJR0c5MySXmZ9XE4NmvoW92C4PNDkRhuwLWzjymcsEA8Ze7dBFDy?= =?us-ascii?Q?o0pj113M0LLByLXt+vcf5OAiAThN0KLco12xPf3xZW90J6QgninU64Jjcezh?= =?us-ascii?Q?WW3eo1688o72k0poGYuNIgyxin+C/RMrOBCv9ixGjOeUlBjfWbnIldyZDzp9?= =?us-ascii?Q?AxOBgl6BZR/4zlozQ6ms5kp5Ahq6OjDoB6t/oSs6y1HY6Oe1M7rfgBIQqB+S?= =?us-ascii?Q?QK+YTcj+amN3h7QdwCGgQE6ojwa1yKv3bcP491/MFqv8GO01y5GVCstNwJNk?= =?us-ascii?Q?WQMZ0DojUhDj7xcGS08khX7s8PrEmtqfX4eHkAlpb+/lQrQLqayc7pBI0Wta?= =?us-ascii?Q?KUPmvOo9wzF7q99dD4XBCsdqc9D67anvuMohTXGpgMbIj8JFogNx7poUPm/D?= =?us-ascii?Q?q59eZ93QXTfuR4xoJj9vOowKFmAk0vewBOLfsm8IZP0z4sstpBD4AGAx0//A?= =?us-ascii?Q?uv3EvcP97hFSNG3XblP2NGxB9tGR1xNhhRiiiBeutZQyXe7BRMn44q19EuNB?= =?us-ascii?Q?Qrbg0jO9MPaLuPp38slgBHXyFxLGx9Yz50eqWrPjDZJQ+oNB5RnzGCuTbKZ9?= =?us-ascii?Q?7jUyB5fE2nQJ1ktcySAVvDAipHf1lo7Qo11mLNoovY86I4Yf1MCpEyEiyNDN?= =?us-ascii?Q?bZz9iHtaeDc=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?svCSWj8fpUQaTtQu3s+oEKAvx5sRqC4+UxDXzm5dY8rn1oDBgugHzHVWUK54?= =?us-ascii?Q?iHYh2IkIfCyrD2pL16Piw2wweqFoSiYSO39+DNx+nGeuJWRD4RzHlqCTzZep?= =?us-ascii?Q?8mR4Yjd9LjnaYE5zMPRflI/T7YotHMNBMCSSp83DqK0bgEfN03THqQhJ1tWW?= =?us-ascii?Q?wh+DoEwytIBLoqlohqGog3arp96vdxZ4yL4yFJLVniGCbYO5kBe6Iiv/BZ6j?= =?us-ascii?Q?fppIrFo0BX5hOhPLORngK8h93U+CpgU+cDlHZrAxyjwwbgnCJuVhoCYAxFds?= =?us-ascii?Q?MfDiI1d2nmmvL8AJ2Uvm1nL+dMOIX1sghk3tmOvjtJkOwAqKhcieUvhdS9OR?= =?us-ascii?Q?kQHhvFazmJ1di02sdJmbQ5uWdDfR1RvRjztr6qej4BT1iG817r+5PAWLHVBv?= =?us-ascii?Q?7rTmhzcr921Sxq+NSkBMECPK/hsAkTr/YSKzTERz71s4lJKUaO0QcVexpNaO?= =?us-ascii?Q?zB4PCJ8ysOfnMHiRH6ttI4EzdtPIbrGNAQFX6eg8rhiCNbu7jVbz0+AdgVjO?= =?us-ascii?Q?pMYrN+3hOJHzftuVas8HZzJ5v8rDkjm5m4xmJOj5WIQIHjb75kxkqfH6VSVb?= =?us-ascii?Q?B+u/lQ7pOJ5zincxplcJ+TLX5BNmO8BuewHoIf9BtbDuwHFMEDZ8ySKvEcXp?= =?us-ascii?Q?/NAqVucNXI+MZc4PrGpUatEJI5xzxaTcAS+M2b863gMY0c8JVWnlcv/5Rfhd?= =?us-ascii?Q?JrRs7A8usK2Qhlhdfa2OO7CTjYELP3S0z262vf3/YlaSC0BjeIvKz013fVM2?= =?us-ascii?Q?okvIckzGPjH2lt4Ga52INMjScPsao7dAHeUO4Nv4oenHdIfZ+uEq9eCa58sf?= =?us-ascii?Q?GsTUywihZBZOp9ZmenybYnZMJAauNLWc3BAiDXORZXQI8EBRTE+fPf+Gx4V0?= =?us-ascii?Q?D+72yqE/JzPI6kRBasVTWPoEfxEx3Y0RdvNE5DdR8XNY4qBgj0+ifGZgJWgH?= =?us-ascii?Q?wZy9eJZe7R6ufmsbO5TtdhZxwCJlOEe/bL5528/XGJV3uf+85tMGQp6ZUqx8?= =?us-ascii?Q?3lt4w6bFWXFhYXruFHUnO8/QGZTV3YnkCfMp7PBUG44IVqFbeyzBTaRqSJN/?= =?us-ascii?Q?qB/LlxYECTLQLxeBhMqQcrC9/v9Trk89iMyaMynuK8wU2EV8GmS2x2U8nXc/?= =?us-ascii?Q?pqnIOtU3/7vWAWMwZ9D0M0jeCOLUpyzggZuevPQ/U166UL8oQ+rqCYajVJdO?= =?us-ascii?Q?JAHwmWRqgOl/3RhVIjsyeegTkJ6NZw2wk1HYZk0lJmwj7Hxxb8BxeMlh44Ca?= =?us-ascii?Q?Z0PAanDx2bCiHyo+DGap/8HgOxaECdqVwwiHNQ/8Yh9NYLnxD6YZC4rRJNPP?= =?us-ascii?Q?IOb7vpoXbUNAgU7ETP84/1WRkgHXitUBXD/eKxXZdurvNzp6KUwAmqKxZStb?= =?us-ascii?Q?kC97eYFLg/GwcvFgakY0iNzdrs/rdJUagbuIab8fR6HU36DnvXLu7ugP3O1x?= =?us-ascii?Q?xuXDAiQFmrZST0RamPbSx8yxEQmpm/+3bBagur94iik65DzhAq71w2eEU0CO?= =?us-ascii?Q?9kWDFtEwQcPF5MZEDiQOeX2cpH0eDMVE2sW+rjMD5fyzirVMG89WBx1QuzC9?= =?us-ascii?Q?wsN3R2MOk7l+CAbuMU4AA0oPanPIeHpPYe4b7ORmqYNxR2bNJ9mv/zk5sMLZ?= =?us-ascii?Q?+g=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: WLS5fD+HOUSX25M+hvQGJM2pmJmvjUzkVw1HCx54i1rjpMlO74tt+hxqo3Apf6pp1OoMNM3RtCQD3UnCVj1E5HacDc+PszZPyxI6/L6enrKlkEwgoK2SN1s+4Tph8LLgwx9+SjRU28WMfYp7eqty9xOekHEWN3bXBeGD7ALnGWF2ODH8uf/warDmqNjLl1qI135C1zPeXc1ZMVQQMhHh2X0ndpju5kuEXFxv3zd4pRHxR5IWDt4Undmz5VogSosdDhi/1c5FogG8pAAjj9ugt2ngs6q7HthrqY0GbE6+7Nblx1GzSLF/oaWrhDHoX+5BETALSlZm7uvqbsBz6acWJlrIBYrIywV3ctsZt2r2V4VnaY4IrgvGCzxO7UwpmvYH6k+ouzmVnR5Y4kvH7x+l5pxAtnux7sG0lGnpOTvI0YZV4mX3rQU7hU4mSLvLGXVqp2XS2qYG6Pj2BYO36YTn1kPlQpfQCFqlubVQdGRpCYjj0VKtvWp5m18en2Saf+/bltwcUZ5gQUplnfLT5mlhetT0zfnZzzGS7HOZ+IvgUR+DmaiP663gk94KpDKVDbl3Jxwn+dWHH9sfnwVMv1VMWyK+ENVC+Ffj+Nu8t3Frer0= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 06771ede-8307-4977-e957-08dd81750b6f X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:46.1390 (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: Rb5bW5ummKVipyVyFLQ5sX1Nqyr78FkY4U51wXR2lEY1ZGzB6SE8J9UAP+1AXWK9KeaJrXmkrZiTn7Sud9azdjMH+/49gldrmK8kncWt1d4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-ORIG-GUID: EJU-9Oz_w8rdqheJTDqZow3I6eHHjzGN X-Proofpoint-GUID: EJU-9Oz_w8rdqheJTDqZow3I6eHHjzGN Content-Type: text/plain; charset="utf-8" When mremap() moves a mapping around in memory, it goes to great lengths to avoid having to walk page tables as this is expensive and time-consuming. Rather, if the VMA was faulted (that is vma->anon_vma !=3D NULL), the virtu= al page offset stored in the VMA at vma->vm_pgoff will remain the same, as well all the folio indexes pointed at the associated anon_vma object. This means the VMA and page tables can simply be moved and this affects the change (and if we can move page tables at a higher page table level, this is even faster). While this is efficient, it does lead to big problems with VMA merging - in essence it causes faulted anonymous VMAs to not be mergeable under many circumstances once moved. This is limiting and leads to both a proliferation of unreclaimable, unmovable kernel metadata (VMAs, anon_vma's, anon_vma_chain's) and has an impact on further use of mremap(), which has a requirement that the VMA moved (which can also be a partial range within a VMA) may span only a single VMA. This makes the mergeability or not of VMAs in effect a uAPI concern. In some use cases, users may wish to accept the overhead of actually going to the trouble of updating VMAs and folios to affect mremap() moves. Let's provide them with the choice. This patch add a new MREMAP_RELOCATE_ANON flag to do just that, which attempts to perform such an operation. If it is unable to do so, it cleanly falls back to the usual method. It carefully takes the rmap locks such that at no time will a racing rmap user encounter incorrect or missing VMAs. It is also designed to interact cleanly with the existing mremap() error fallback mechanism (inverting the remap should the page table move fail). Also, if we could merge cleanly without such a change, we do so, avoiding the overhead of the operation if it is not required. In the instance that no merge may occur when the move is performed, we still perform the folio and VMA updates to ensure that future mremap() or mprotect() calls will result in merges. In this implementation, we simply give up if we encounter large folios. A subsequent commit will extend the functionality to allow for these cases. We restrict this flag to purely anonymous memory only. we separate out the vma_had_uncowed_parents() helper function for checking in should_relocate_anon() and introduce a vma_had_uncowed_children() function for the same purpose. We carefully check for pinned folios in case a caller who holds a pin might make assumptions about index, mapping fields which we are about to manipulate. Signed-off-by: Lorenzo Stoakes --- include/uapi/linux/mman.h | 1 + mm/internal.h | 1 + mm/mremap.c | 410 +++++++++++++++++++++++++++++-- mm/vma.c | 78 ++++-- mm/vma.h | 28 ++- tools/testing/vma/vma.c | 5 +- tools/testing/vma/vma_internal.h | 33 +++ 7 files changed, 512 insertions(+), 44 deletions(-) diff --git a/include/uapi/linux/mman.h b/include/uapi/linux/mman.h index e89d00528f2f..d0542f872e0c 100644 --- a/include/uapi/linux/mman.h +++ b/include/uapi/linux/mman.h @@ -9,6 +9,7 @@ #define MREMAP_MAYMOVE 1 #define MREMAP_FIXED 2 #define MREMAP_DONTUNMAP 4 +#define MREMAP_RELOCATE_ANON 8 =20 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 diff --git a/mm/internal.h b/mm/internal.h index 838f840ded83..a08863169bec 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -46,6 +46,7 @@ struct folio_batch; struct pagetable_move_control { struct vm_area_struct *old; /* Source VMA. */ struct vm_area_struct *new; /* Destination VMA. */ + struct vm_area_struct *relocate_locked; /* VMA which is rmap locked. */ unsigned long old_addr; /* Address from which the move begins. */ unsigned long old_end; /* Exclusive address at which old range ends. */ unsigned long new_addr; /* Address to move page tables to. */ diff --git a/mm/mremap.c b/mm/mremap.c index 7db9da609c84..1d915445026f 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -71,6 +71,15 @@ struct vma_remap_struct { unsigned long charged; /* If VM_ACCOUNT, # pages to account. */ }; =20 +/* Represents local PTE state. */ +struct pte_state { + unsigned long old_addr; + unsigned long new_addr; + unsigned long old_end; + pte_t *ptep; + spinlock_t *ptl; +}; + static pud_t *get_old_pud(struct mm_struct *mm, unsigned long addr) { pgd_t *pgd; @@ -139,18 +148,50 @@ static pmd_t *alloc_new_pmd(struct mm_struct *mm, uns= igned long addr) return pmd; } =20 -static void take_rmap_locks(struct vm_area_struct *vma) +/* + * Determine whether the old and new VMAs share the same anon_vma. If so, = this + * has implications around locking and to avoid deadlock we need to tread + * carefully. + */ +static bool has_shared_anon_vma(struct pagetable_move_control *pmc) +{ + struct vm_area_struct *vma =3D pmc->old; + struct vm_area_struct *locked =3D pmc->relocate_locked; + + if (!locked) + return false; + + return vma->anon_vma->root =3D=3D locked->anon_vma->root; +} + +static void maybe_take_rmap_locks(struct pagetable_move_control *pmc) { + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + + if (!pmc->need_rmap_locks) + return; + + vma =3D pmc->old; + anon_vma =3D vma->anon_vma; if (vma->vm_file) i_mmap_lock_write(vma->vm_file->f_mapping); - if (vma->anon_vma) - anon_vma_lock_write(vma->anon_vma); + if (anon_vma && !has_shared_anon_vma(pmc)) + anon_vma_lock_write(anon_vma); } =20 -static void drop_rmap_locks(struct vm_area_struct *vma) +static void maybe_drop_rmap_locks(struct pagetable_move_control *pmc) { - if (vma->anon_vma) - anon_vma_unlock_write(vma->anon_vma); + struct vm_area_struct *vma; + struct anon_vma *anon_vma; + + if (!pmc->need_rmap_locks) + return; + + vma =3D pmc->old; + anon_vma =3D vma->anon_vma; + if (anon_vma && !has_shared_anon_vma(pmc)) + anon_vma_unlock_write(anon_vma); if (vma->vm_file) i_mmap_unlock_write(vma->vm_file->f_mapping); } @@ -204,8 +245,7 @@ static int move_ptes(struct pagetable_move_control *pmc, * serialize access to individual ptes, but only rmap traversal * order guarantees that we won't miss both the old and new ptes). */ - if (pmc->need_rmap_locks) - take_rmap_locks(vma); + maybe_take_rmap_locks(pmc); =20 /* * We don't have to worry about the ordering of src and dst @@ -278,8 +318,7 @@ static int move_ptes(struct pagetable_move_control *pmc, pte_unmap(new_pte - 1); pte_unmap_unlock(old_pte - 1, old_ptl); out: - if (pmc->need_rmap_locks) - drop_rmap_locks(vma); + maybe_drop_rmap_locks(pmc); return err; } =20 @@ -537,15 +576,14 @@ static __always_inline unsigned long get_extent(enum = pgt_entry entry, * Should move_pgt_entry() acquire the rmap locks? This is either expresse= d in * the PMC, or overridden in the case of normal, larger page tables. */ -static bool should_take_rmap_locks(struct pagetable_move_control *pmc, - enum pgt_entry entry) +static bool should_take_rmap_locks(enum pgt_entry entry) { switch (entry) { case NORMAL_PMD: case NORMAL_PUD: return true; default: - return pmc->need_rmap_locks; + return false; } } =20 @@ -557,11 +595,15 @@ static bool move_pgt_entry(struct pagetable_move_cont= rol *pmc, enum pgt_entry entry, void *old_entry, void *new_entry) { bool moved =3D false; - bool need_rmap_locks =3D should_take_rmap_locks(pmc, entry); + bool override_locks =3D false; =20 - /* See comment in move_ptes() */ - if (need_rmap_locks) - take_rmap_locks(pmc->old); + if (!pmc->need_rmap_locks && should_take_rmap_locks(entry)) { + override_locks =3D true; + + pmc->need_rmap_locks =3D true; + /* See comment in move_ptes() */ + maybe_take_rmap_locks(pmc); + } =20 switch (entry) { case NORMAL_PMD: @@ -585,8 +627,9 @@ static bool move_pgt_entry(struct pagetable_move_contro= l *pmc, break; } =20 - if (need_rmap_locks) - drop_rmap_locks(pmc->old); + maybe_drop_rmap_locks(pmc); + if (override_locks) + pmc->need_rmap_locks =3D false; =20 return moved; } @@ -752,6 +795,209 @@ static unsigned long pmc_progress(struct pagetable_mo= ve_control *pmc) return old_addr < orig_old_addr ? 0 : old_addr - orig_old_addr; } =20 +/* + * If the folio mapped at the specified pte entry can have its index and m= apping + * relocated, then do so. + * + * Returns the number of pages we have traversed, or 0 if the operation fa= iled. + */ +static unsigned long relocate_anon_pte(struct pagetable_move_control *pmc, + struct pte_state *state, bool undo) +{ + struct folio *folio; + struct vm_area_struct *old, *new; + pgoff_t new_index; + pte_t pte; + unsigned long ret =3D 1; + unsigned long old_addr =3D state->old_addr; + unsigned long new_addr =3D state->new_addr; + + old =3D pmc->old; + new =3D pmc->new; + + pte =3D ptep_get(state->ptep); + + /* Ensure we have truly got an anon folio. */ + folio =3D vm_normal_folio(old, old_addr, pte); + if (!folio) + return ret; + + folio_lock(folio); + + /* No-op. */ + if (!folio_test_anon(folio) || folio_test_ksm(folio)) + goto out; + + /* + * This should never be the case as we have already checked to ensure + * that the anon_vma is not forked, and we have just asserted that it is + * anonymous. + */ + if (WARN_ON_ONCE(folio_maybe_mapped_shared(folio))) + goto out; + /* The above check should imply these. */ + VM_WARN_ON_ONCE(folio_mapcount(folio) > folio_nr_pages(folio)); + VM_WARN_ON_ONCE(!PageAnonExclusive(folio_page(folio, 0))); + + /* + * A pinned folio implies that it will be used for a duration longer + * than that over which the mmap_lock is held, meaning that another part + * of the kernel may be making use of this folio. + * + * Since we are about to manipulate index & mapping fields, we cannot + * safely proceed because whatever has pinned this folio may then + * incorrectly assume these do not change. + */ + if (folio_maybe_dma_pinned(folio)) + goto out; + + /* + * This should not happen as we explicitly disallow this, but check + * anyway. + */ + if (folio_test_large(folio)) { + ret =3D 0; + goto out; + } + + if (!undo) + new_index =3D linear_page_index(new, new_addr); + else + new_index =3D linear_page_index(old, old_addr); + + /* + * The PTL should keep us safe from unmapping, and the fact the folio is + * a PTE keeps the folio referenced. + * + * The mmap/VMA locks should keep us safe from fork and other processes. + * + * The rmap locks should keep us safe from anything happening to the + * VMA/anon_vma. + * + * The folio lock should keep us safe from reclaim, migration, etc. + */ + folio_move_anon_rmap(folio, undo ? old : new); + WRITE_ONCE(folio->index, new_index); + +out: + folio_unlock(folio); + return ret; +} + +static bool pte_done(struct pte_state *state) +{ + return state->old_addr >=3D state->old_end; +} + +static void pte_next(struct pte_state *state, unsigned long nr_pages) +{ + state->old_addr +=3D nr_pages * PAGE_SIZE; + state->new_addr +=3D nr_pages * PAGE_SIZE; + state->ptep +=3D nr_pages; +} + +static bool relocate_anon_ptes(struct pagetable_move_control *pmc, + unsigned long extent, pmd_t *pmdp, bool undo) +{ + struct mm_struct *mm =3D current->mm; + struct pte_state state =3D { + .old_addr =3D pmc->old_addr, + .new_addr =3D pmc->new_addr, + .old_end =3D pmc->old_addr + extent, + }; + pte_t *ptep_start; + bool ret; + unsigned long nr_pages; + + ptep_start =3D pte_offset_map_lock(mm, pmdp, pmc->old_addr, &state.ptl); + /* + * We prevent faults with mmap write lock, hold the rmap lock and should + * not fail to obtain this lock. Just give up if we can't. + */ + if (!ptep_start) + return false; + + state.ptep =3D ptep_start; + for (; !pte_done(&state); pte_next(&state, nr_pages)) { + pte_t pte =3D ptep_get(state.ptep); + + if (pte_none(pte) || !pte_present(pte)) { + nr_pages =3D 1; + continue; + } + + nr_pages =3D relocate_anon_pte(pmc, &state, undo); + if (!nr_pages) { + ret =3D false; + goto out; + } + } + + ret =3D true; +out: + pte_unmap_unlock(ptep_start, state.ptl); + return ret; +} + +static bool __relocate_anon_folios(struct pagetable_move_control *pmc, boo= l undo) +{ + pud_t *pudp; + pmd_t *pmdp; + unsigned long extent; + struct mm_struct *mm =3D current->mm; + + if (!pmc->len_in) + return true; + + for (; !pmc_done(pmc); pmc_next(pmc, extent)) { + pmd_t pmd; + pud_t pud; + + extent =3D get_extent(NORMAL_PUD, pmc); + + pudp =3D get_old_pud(mm, pmc->old_addr); + if (!pudp) + continue; + pud =3D pudp_get(pudp); + + if (pud_trans_huge(pud) || pud_devmap(pud)) + return false; + + extent =3D get_extent(NORMAL_PMD, pmc); + pmdp =3D get_old_pmd(mm, pmc->old_addr); + if (!pmdp) + continue; + pmd =3D pmdp_get(pmdp); + + if (is_swap_pmd(pmd) || pmd_trans_huge(pmd) || + pmd_devmap(pmd)) + return false; + + if (pmd_none(pmd)) + continue; + + if (!relocate_anon_ptes(pmc, extent, pmdp, undo)) + return false; + } + + return true; +} + +static bool relocate_anon_folios(struct pagetable_move_control *pmc, bool = undo) +{ + unsigned long old_addr =3D pmc->old_addr; + unsigned long new_addr =3D pmc->new_addr; + bool ret; + + ret =3D __relocate_anon_folios(pmc, undo); + + /* Reset state ready for retry. */ + pmc->old_addr =3D old_addr; + pmc->new_addr =3D new_addr; + + return ret; +} + unsigned long move_page_tables(struct pagetable_move_control *pmc) { unsigned long extent; @@ -1132,6 +1378,74 @@ static void unmap_source_vma(struct vma_remap_struct= *vrm) } } =20 +/* + * Should we attempt to relocate anonymous folios to the location that the= VMA + * is being moved to by updating index and mapping fields accordingly? + */ +static bool should_relocate_anon(struct vma_remap_struct *vrm, + struct pagetable_move_control *pmc) +{ + struct vm_area_struct *old =3D vrm->vma; + + /* Currently we only do this if requested. */ + if (!(vrm->flags & MREMAP_RELOCATE_ANON)) + return false; + + /* We can't deal with special or hugetlb mappings. */ + if (old->vm_flags & (VM_SPECIAL | VM_HUGETLB)) + return false; + + /* We only support anonymous mappings. */ + if (!vma_is_anonymous(old)) + return false; + + /* If no folios are mapped, then no need to attempt this. */ + if (!old->anon_vma) + return false; + + /* + * If the VMA is referenced by a parent process (i.e. is the child of a + * fork) or exists in a process which has been forked, then the folio + * may be non-exclusively mapped, and thus is non-relocatable. + * + * Note the uncowed children check is sufficient, because we hold the + * mmap lock. + */ + if (vma_had_uncowed_parents(old) || vma_had_uncowed_children(old)) + return false; + + /* Otherwise, we're good to go! */ + return true; +} + +static void lock_new_anon_vma(struct vm_area_struct *new_vma) +{ + /* + * We have a new VMA to reassign folios to. We take a lock on + * its anon_vma so reclaim doesn't fail to unmap mappings. + * + * We have acquired a VMA write lock by now (in vma_link()), so + * we do not have to worry about racing faults. + * + * NOTE: we do NOT need to acquire an rmap lock on the old VMA, + * as forks require an mmap write lock, which we hold. + */ + anon_vma_lock_write(new_vma->anon_vma); + + /* + * lockdep is unable to differentiate between the anon_vma lock we take + * in the old VMA and the one we are taking here in the new VMA. + * + * In each instance where the old VMA might have its anon_vma + * lock taken, we explicitly check to ensure they are not one + * and the same, avoiding deadlock. + * + * Express this to lockdep through a subclass. + */ + lock_set_subclass(&new_vma->anon_vma->root->rwsem.dep_map, 1, + _THIS_IP_); +} + /* * Copy vrm->vma over to vrm->new_addr possibly adjusting size as part of = the * process. Additionally handle an error occurring on moving of page table= s, @@ -1151,9 +1465,11 @@ static int copy_vma_and_data(struct vma_remap_struct= *vrm, struct vm_area_struct *new_vma; int err =3D 0; PAGETABLE_MOVE(pmc, NULL, NULL, vrm->addr, vrm->new_addr, vrm->old_len); + bool relocate_anon =3D should_relocate_anon(vrm, &pmc); =20 +again: new_vma =3D copy_vma(&vma, vrm->new_addr, vrm->new_len, new_pgoff, - &pmc.need_rmap_locks); + &pmc.need_rmap_locks, &relocate_anon); if (!new_vma) { vrm_uncharge(vrm); *new_vma_ptr =3D NULL; @@ -1163,12 +1479,59 @@ static int copy_vma_and_data(struct vma_remap_struc= t *vrm, pmc.old =3D vma; pmc.new =3D new_vma; =20 + if (relocate_anon) { + lock_new_anon_vma(new_vma); + pmc.relocate_locked =3D new_vma; + + if (!relocate_anon_folios(&pmc, /* undo=3D */false)) { + unsigned long start =3D new_vma->vm_start; + unsigned long size =3D new_vma->vm_end - start; + + /* Undo if fails. */ + relocate_anon_folios(&pmc, /* undo=3D */true); + vrm_stat_account(vrm, vrm->new_len); + + anon_vma_unlock_write(new_vma->anon_vma); + pmc.relocate_locked =3D NULL; + + do_munmap(current->mm, start, size, NULL); + relocate_anon =3D false; + goto again; + } + } + moved_len =3D move_page_tables(&pmc); if (moved_len < vrm->old_len) err =3D -ENOMEM; else if (vma->vm_ops && vma->vm_ops->mremap) err =3D vma->vm_ops->mremap(new_vma); =20 + if (unlikely(err && relocate_anon)) { + relocate_anon_folios(&pmc, /* undo=3D */true); + anon_vma_unlock_write(new_vma->anon_vma); + pmc.relocate_locked =3D NULL; + } else if (relocate_anon /* && !err */) { + unsigned long addr =3D vrm->new_addr; + unsigned long end =3D addr + vrm->new_len; + VMA_ITERATOR(vmi, vma->vm_mm, addr); + VMG_VMA_STATE(vmg, &vmi, NULL, new_vma, addr, end); + struct vm_area_struct *merged; + + /* + * Now we have successfully copied page tables and set up + * folios, we can safely drop the anon_vma lock. + */ + anon_vma_unlock_write(new_vma->anon_vma); + pmc.relocate_locked =3D NULL; + + /* Let's try merge again... */ + vmg.prev =3D vma_prev(&vmi); + vma_next(&vmi); + merged =3D vma_merge_existing_range(&vmg); + if (merged) + new_vma =3D merged; + } + if (unlikely(err)) { PAGETABLE_MOVE(pmc_revert, new_vma, vma, vrm->new_addr, vrm->addr, moved_len); @@ -1486,7 +1849,8 @@ static unsigned long check_mremap_params(struct vma_r= emap_struct *vrm) unsigned long flags =3D vrm->flags; =20 /* Ensure no unexpected flag values. */ - if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE | MREMAP_DONTUNMAP)) + if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE | MREMAP_DONTUNMAP | + MREMAP_RELOCATE_ANON)) return -EINVAL; =20 /* Start address must be page-aligned. */ @@ -1501,6 +1865,10 @@ static unsigned long check_mremap_params(struct vma_= remap_struct *vrm) if (!PAGE_ALIGN(vrm->new_len)) return -EINVAL; =20 + /* We can't relocate without allowing a move. */ + if ((flags & MREMAP_RELOCATE_ANON) && !(flags & MREMAP_MAYMOVE)) + return -EINVAL; + /* Remainder of checks are for cases with specific new_addr. */ if (!vrm_implies_new_addr(vrm)) return 0; diff --git a/mm/vma.c b/mm/vma.c index 8a6c5e835759..59a7a9273d53 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -57,22 +57,6 @@ struct mmap_state { .state =3D VMA_MERGE_START, \ } =20 -/* - * If, at any point, the VMA had unCoW'd mappings from parents, it will ma= intain - * more than one anon_vma_chain connecting it to more than one anon_vma. A= merge - * would mean a wider range of folios sharing the root anon_vma lock, and = thus - * potential lock contention, we do not wish to encourage merging such tha= t this - * scales to a problem. - */ -static bool vma_had_uncowed_parents(struct vm_area_struct *vma) -{ - /* - * The list_is_singular() test is to avoid merging VMA cloned from - * parents. This can improve scalability caused by anon_vma lock. - */ - return vma && vma->anon_vma && !list_is_singular(&vma->anon_vma_chain); -} - static inline bool is_mergeable_vma(struct vma_merge_struct *vmg, bool mer= ge_next) { struct vm_area_struct *vma =3D merge_next ? vmg->next : vmg->prev; @@ -783,8 +767,7 @@ static bool can_merge_remove_vma(struct vm_area_struct = *vma) * - The caller must hold a WRITE lock on the mm_struct->mmap_lock. * - vmi must be positioned within [@vmg->middle->vm_start, @vmg->middle->= vm_end). */ -static __must_check struct vm_area_struct *vma_merge_existing_range( - struct vma_merge_struct *vmg) +struct vm_area_struct *vma_merge_existing_range(struct vma_merge_struct *v= mg) { struct vm_area_struct *middle =3D vmg->middle; struct vm_area_struct *prev =3D vmg->prev; @@ -1799,7 +1782,7 @@ int vma_link(struct mm_struct *mm, struct vm_area_str= uct *vma) */ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, unsigned long addr, unsigned long len, pgoff_t pgoff, - bool *need_rmap_locks) + bool *need_rmap_locks, bool *relocate_anon) { struct vm_area_struct *vma =3D *vmap; unsigned long vma_start =3D vma->vm_start; @@ -1825,7 +1808,19 @@ struct vm_area_struct *copy_vma(struct vm_area_struc= t **vmap, vmg.middle =3D NULL; /* New VMA range. */ vmg.pgoff =3D pgoff; vmg.next =3D vma_iter_next_rewind(&vmi, NULL); + new_vma =3D vma_merge_new_range(&vmg); + if (*relocate_anon) { + /* + * If merge succeeds, no need to relocate. Otherwise, reset + * pgoff for newly established VMA which we will relocate folios + * to. + */ + if (new_vma) + *relocate_anon =3D false; + else + pgoff =3D addr >> PAGE_SHIFT; + } =20 if (new_vma) { /* @@ -1856,7 +1851,9 @@ struct vm_area_struct *copy_vma(struct vm_area_struct= **vmap, vma_set_range(new_vma, addr, addr + len, pgoff); if (vma_dup_policy(vma, new_vma)) goto out_free_vma; - if (anon_vma_clone(new_vma, vma)) + if (*relocate_anon) + new_vma->anon_vma =3D NULL; + else if (anon_vma_clone(new_vma, vma)) goto out_free_mempol; if (new_vma->vm_file) get_file(new_vma->vm_file); @@ -1864,6 +1861,21 @@ struct vm_area_struct *copy_vma(struct vm_area_struc= t **vmap, new_vma->vm_ops->open(new_vma); if (vma_link(mm, new_vma)) goto out_vma_link; + /* + * If we're attempting to relocate anonymous VMAs, we + * don't want to reuse an anon_vma as set by + * vm_area_dup(), or copy anon_vma_chain or anything + * like this. + */ + if (*relocate_anon && __anon_vma_prepare(new_vma)) { + /* + * We have already linked this VMA, so we must now unmap + * it to unwind this. This is best effort. + */ + do_munmap(mm, addr, len, NULL); + return NULL; + } + *need_rmap_locks =3D false; } return new_vma; @@ -3052,3 +3064,29 @@ int __vm_munmap(unsigned long start, size_t len, boo= l unlock) userfaultfd_unmap_complete(mm, &uf); return ret; } + +bool vma_had_uncowed_children(struct vm_area_struct *vma) +{ + struct anon_vma *anon_vma =3D vma ? vma->anon_vma : NULL; + bool ret; + + if (!anon_vma) + return false; + + /* + * If we're mmap locked then there's no way for this count to change, as + * any such change would require this lock not be held. + */ + if (rwsem_is_locked(&vma->vm_mm->mmap_lock)) + return anon_vma->num_children > 1; + + /* + * Any change that would increase the number of children would be + * prevented by a read lock. + */ + anon_vma_lock_read(anon_vma); + ret =3D anon_vma->num_children > 1; + anon_vma_unlock_read(anon_vma); + + return ret; +} diff --git a/mm/vma.h b/mm/vma.h index 149926e8a6d1..954bacedbb48 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -267,6 +267,9 @@ __must_check struct vm_area_struct __must_check struct vm_area_struct *vma_merge_new_range(struct vma_merge_struct *vmg); =20 +__must_check struct vm_area_struct +*vma_merge_existing_range(struct vma_merge_struct *vmg); + __must_check struct vm_area_struct *vma_merge_extend(struct vma_iterator *vmi, struct vm_area_struct *vma, @@ -287,7 +290,7 @@ int vma_link(struct mm_struct *mm, struct vm_area_struc= t *vma); =20 struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, unsigned long addr, unsigned long len, pgoff_t pgoff, - bool *need_rmap_locks); + bool *need_rmap_locks, bool *relocate_anon); =20 struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma); =20 @@ -505,6 +508,29 @@ struct vm_area_struct *vma_iter_next_rewind(struct vma= _iterator *vmi, return next; } =20 +/* + * If, at any point, the VMA had unCoW'd mappings from parents, it will ma= intain + * more than one anon_vma_chain connecting it to more than one anon_vma. A= merge + * would mean a wider range of folios sharing the root anon_vma lock, and = thus + * potential lock contention, we do not wish to encourage merging such tha= t this + * scales to a problem. + */ +static inline bool vma_had_uncowed_parents(struct vm_area_struct *vma) +{ + /* + * The list_is_singular() test is to avoid merging VMA cloned from + * parents. This can improve scalability caused by anon_vma lock. + */ + return vma && vma->anon_vma && !list_is_singular(&vma->anon_vma_chain); +} + +/* + * If, at any point, folios mapped by the VMA had unCoW'd mappings potenti= ally + * present in child processes forked from this one, then the underlying ma= pped + * folios may be non-exclusively mapped. + */ +bool vma_had_uncowed_children(struct vm_area_struct *vma); + #ifdef CONFIG_64BIT =20 static inline bool vma_is_sealed(struct vm_area_struct *vma) diff --git a/tools/testing/vma/vma.c b/tools/testing/vma/vma.c index 7cfd6e31db10..3d19df8fa17b 100644 --- a/tools/testing/vma/vma.c +++ b/tools/testing/vma/vma.c @@ -1543,13 +1543,14 @@ static bool test_copy_vma(void) unsigned long flags =3D VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE; struct mm_struct mm =3D {}; bool need_locks =3D false; + bool relocate_anon =3D false; VMA_ITERATOR(vmi, &mm, 0); struct vm_area_struct *vma, *vma_new, *vma_next; =20 /* Move backwards and do not merge. */ =20 vma =3D alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags); - vma_new =3D copy_vma(&vma, 0, 0x2000, 0, &need_locks); + vma_new =3D copy_vma(&vma, 0, 0x2000, 0, &need_locks, &relocate_anon); ASSERT_NE(vma_new, vma); ASSERT_EQ(vma_new->vm_start, 0); ASSERT_EQ(vma_new->vm_end, 0x2000); @@ -1562,7 +1563,7 @@ static bool test_copy_vma(void) =20 vma =3D alloc_and_link_vma(&mm, 0, 0x2000, 0, flags); vma_next =3D alloc_and_link_vma(&mm, 0x6000, 0x8000, 6, flags); - vma_new =3D copy_vma(&vma, 0x4000, 0x2000, 4, &need_locks); + vma_new =3D copy_vma(&vma, 0x4000, 0x2000, 4, &need_locks, &relocate_anon= ); vma_assert_attached(vma_new); =20 ASSERT_EQ(vma_new, vma_next); diff --git a/tools/testing/vma/vma_internal.h b/tools/testing/vma/vma_inter= nal.h index 572ab2cea763..3364cd9cabde 100644 --- a/tools/testing/vma/vma_internal.h +++ b/tools/testing/vma/vma_internal.h @@ -26,6 +26,7 @@ #include #include #include +#include =20 extern unsigned long stack_guard_gap; #ifdef CONFIG_MMU @@ -172,6 +173,8 @@ struct anon_vma { struct anon_vma *root; struct rb_root_cached rb_root; =20 + unsigned long num_children; + /* Test fields. */ bool was_cloned; bool was_unlinked; @@ -227,6 +230,8 @@ struct mm_struct { unsigned long def_flags; =20 unsigned long flags; /* Must use atomic bitops to access */ + + struct rw_semaphore mmap_lock; }; =20 struct file { @@ -1240,4 +1245,32 @@ static inline int mapping_map_writable(struct addres= s_space *mapping) return 0; } =20 +static int do_munmap(struct mm_struct *mm, unsigned long start, size_t len, + struct list_head *uf) +{ + (void)mm; + (void)start; + (void)len; + (void)uf; + + return 0; +} + +static inline int rwsem_is_locked(struct rw_semaphore *sem) +{ + (void)sem; + + return 0; +} + +static inline void anon_vma_lock_read(struct anon_vma *anon_vma) +{ + (void)anon_vma; +} + +static inline void anon_vma_unlock_read(struct anon_vma *anon_vma) +{ + (void)anon_vma; +} + #endif /* __MM_VMA_INTERNAL_H */ --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 33526235BFB for ; Tue, 22 Apr 2025 08:10:07 +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=1745309410; cv=fail; b=VLa6YbEVes25cgNkmdP0Kd3e+lvvbV7rGuQWKO3c8BKpciIfoF9cS3WuwUupwqBwGlSYEzF9XOMOeQSH5eAS1duQp1undBhQ7vW7jG4vCihoBikyiitXNO0DSv7QoeQ9JmGOepke1lAtPpjW3pFsipkfsLPn9bFGrI0skSrTzFw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309410; c=relaxed/simple; bh=nM8iLHhHoiTxHlhxq14s8ICkzi3b6JYK1uUO+1SQ37s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Zd2LYmBoa0XboMw3KBStiN5ihy8ZtLGbuOyP/kK8ouL2ne/1yeKtIh2Ab2RGG6t+ETge9X8Knc4Awc1t+DKrWvbaOjc89xoIWQmw3ItkgGONdfq34lz7QoP+CKjEhkLaWgQ2rcnhNf33Emk6dwXdQB7EJZGQnIhOw91oiQLHJlQ= 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=JGkC2rmA; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Hd6ny0p3; 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="JGkC2rmA"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Hd6ny0p3" Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53M7MwHg027820; Tue, 22 Apr 2025 08:09:52 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=5Epj3fD5BItOHfYbhsNznU6UMM8xmdysyPv3YXYuscs=; b= JGkC2rmADFdy222wdNzi7lD8PFH2J5h+ubTAmdW64SyQpIK76LAQWVikkJ9sq3LD giiT0ieDtM/qabQ+dERa+e0hpsEwIg0I3zlb+L2T2br0LiO9O2KZ27/NA2kEHQem z+8OarKSpJBif7Zm6PT+OoagpwjUTOWZYPmThEgsOQL3JyyXJMsoiDq7L34brdGi 5+rf/SLZM1PS4SRb+PpPWuMltyes2jJmbjMTt1RQ4uzffLtKxDdjQMBLcTZ62OxR 0ClZFYrWVVqx1IMdJpUR1kpHttwRQ6pfpoCr/HhivYctjRRvvyQD9SsnFwch6oDf skI1h5Bh+C30BcmIHvfMsw== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4644csux0d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:51 +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 53M7GZ4s021147; Tue, 22 Apr 2025 08:09:50 GMT Received: from ch1pr05cu001.outbound.protection.outlook.com (mail-northcentralusazlp17010006.outbound.protection.outlook.com [40.93.20.6]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhse0-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:50 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Mf6PUt3IMueCFqjAbKpaZtmEBUGwp0a6x6ZwdA7+8obK9H401CyaayiUBvQPlVT7gEQmLlLdoh+n1vJlFrSNLDBYE42TxuFgFhpJiOkObsD5xklMIoIuP95Kh4jHur7DRDhVgGFbEFTOyl6kcJynAdYy8tc07T9YZhmcWfguS7YdqD/10Twra0rRjPPegSiuCWNA5KekRjcmzr8yJdXeKxhVNpnmZlDAlQ4Q8aKR+/SueqjLW7OB+aVnCsI9GzUdxtmjurqhoDRe9NrPWgsidIfLQHIEmMpmB8MYGxclXgQdtSkRwwdIaZVlm5RsflpcQMGT+AQi2u6BuMfFWi67bw== 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=5Epj3fD5BItOHfYbhsNznU6UMM8xmdysyPv3YXYuscs=; b=hlUGajA4/ljbFbP3AJjizh0LnNjOKCFRvfOGDNtzb5Bhshm88vuReqT6rgrONUdoPzHBg6olMGurVZuFWymdr7Tki1TOk5g+o0FfDlq+Z5mzzeRmTzFIhSO4wRwz5XetARdH0hQCSEnGJZ8Ge9tBEKud5Z/YL2lv+iIwhS9PXii0iEPgE8Pw0WgOGZxrv3cMQcVK7Tkfl37o6aE4iymUtRJ0JtikFJHH7Q4kMPxwKRwY3lrXYcbN+rvynun7CwQ5sN6gCXem50l9kng0bcXL/Vn3/o579rFC0rf3ywjQIw1A8mp5YoPtbc5dvAME5QkWd7utdO35+P0S37+dj31G5w== 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=5Epj3fD5BItOHfYbhsNznU6UMM8xmdysyPv3YXYuscs=; b=Hd6ny0p3wz8YkdbeNJMIxNJ+Zjue6plE/sAmXUJrJSGT60MPocaAryzFTRMjojVWz/Y+6rBZ+yTySRh0ugRzqOBrq+PnGpRHMrU7GdlH9oGhaoPCKbupfTIu86sYx0fzCsKWYX2d5td230UOlmQB8ceeEXGbETWNMGU+cd06NDg= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:48 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:48 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 02/10] mm/mremap: add MREMAP_MUST_RELOCATE_ANON Date: Tue, 22 Apr 2025 09:09:21 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0217.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:b::13) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: 8e4bdb4f-b3c1-4c3a-d131-08dd81750cc9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?nvF9jeYDy8yhYRgHZCxZZu5lSx/iVuLkv3MPOpfICWf2uMvBZ0XHtR+Ta+HW?= =?us-ascii?Q?5xg7KqzlPMGmYAjrwxSFxKt4k7IlzSH641IYCfG0SIGvlLlmeRVzyMT8AFYX?= =?us-ascii?Q?gSI5pzQC1xwgNcbA2KT6gDPJMOlbdbLC5RJss8xjrN3xP0z/6t26CPUZBSTu?= =?us-ascii?Q?t6i23TFj99+e2rGIi4nKHvCRAH88YnT5XYfqBMpyxwC/loGOl1L5+Xv7Cn1+?= =?us-ascii?Q?E4Twm/5u/LEdx2FszwJtoTXU+XZ4VuK6pw8wS8+9l2fYoz0FAYCVI+I9ktZ+?= =?us-ascii?Q?5SimnN5paLqYPotq/KOuSP6i0DG24S7j99bP0gmZUwwj8JaznhRXUEf5uD+u?= =?us-ascii?Q?vMfMD3MDph88cU9V+QVmR1pyKGVgjNh0M4SUckJwXqSjC+4qEakbhCBztNCb?= =?us-ascii?Q?soSLrPAthkZNXAU36U1ITYp6iQqCx/3ar4lQM0hNLEPZz87Le+UYddusKoOF?= =?us-ascii?Q?ARsg6eRKypRAG4aI8p2wCKvx+FZ6udWW05DcdJFB3/fmr/n0Q70Fm7XTszr6?= =?us-ascii?Q?pWfR0p+OPuOa3ANyI85GdmVS4c+ccAU4d/qU0XvAGudZ03D7LRDu8nEDg6bE?= =?us-ascii?Q?cETQpB/XpicRxujKVZT5ZpyRT0uYRgGn2cOh4AbaT+3JIMybHvYMSQuiVgKW?= =?us-ascii?Q?dRoeh9omr4yVjUTSI4L+DCZ6SBjsZxyJRcnGwCxUFWSRqFvomVQcdEkjhrHc?= =?us-ascii?Q?KcUHx9taQEUBEpiZKIy2f0XiaP02khZhGZ2sc3VeOdv9A103hfPuh4bC2VER?= =?us-ascii?Q?aPgESKurHTV+w6hrgAtEfqCHZDyCvYpjdcSlPL9U97sXziCSb7K29WeF9cm2?= =?us-ascii?Q?K6hWs3hkqRuI3/3yKZyNyZTBzgy29P1bkC/hsGTsVPI0AChzDpeVEzJE7ohw?= =?us-ascii?Q?rsIpn5YFxQWw2iheEOPR+pjdcObt/MF3dy5mZfWK6irjZZ2WjaGtyH0s5v2d?= =?us-ascii?Q?K8iZfn3/yv7jeqyR12XxMvTXLLB/tll72oGWb8/ZulxnVETVYWiVfONqNUij?= =?us-ascii?Q?IfmCHFNtzUkWCtacqbyS6vbOhRSGQsMFOt49nnEN4dW98HvwyIfj/KNF5N6v?= =?us-ascii?Q?qxdDmcHz+qYob4n5lM1t2v8yIC0KYZRtAF7PAy2SCh6H/K7Tu7rSjpYRVjKw?= =?us-ascii?Q?QMlzaStPYDXgsHcQeL78Iom8B6hzBCF7d77KoK7dpnmZCd80YFLENf+qJGzi?= =?us-ascii?Q?KnCrnXB4duTcT/WeBX1Uh4qGCMBwnaCZfjn66zvS9CfEB9ZiEmqjMWZt17Cx?= =?us-ascii?Q?HNZ0h/fgQzn08ZXpDLWSEmYUp9vR0n2d6XSQ65a8fmD/8bxBLmsZAkPhhS2U?= =?us-ascii?Q?ATtlWU0V957NW2pCfI/9cYdu8W/Osn6/+vKElKwixCsYQGgzyGwE5ECtAKzA?= =?us-ascii?Q?k1q+A9VjrxbXVOgJokAZc/cNaUkyKLMOVaqsmhjgPua9oMFRAHXIbgYKJLXj?= =?us-ascii?Q?3s6vhoHS5Yo=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Pdc4xvuaz2YyCBpX/4+vSpeRsokUovAX7ICuAKE9qFezFtD6OYLiJd59Tvd/?= =?us-ascii?Q?biBQmMd5qjvMw9DBysH+IrKO/qMWKGGWjiO49XfCZSKgsXfb1IY44B095M0g?= =?us-ascii?Q?fCNdnpp/LUP+Q+VbBEZoOLi3DJnxf48YLqgNjLTr6G0o7ZxbIZRkB1ZbmHcD?= =?us-ascii?Q?9/4zm8sV88DrGdNTYjbNrS2ajpuf1AskR+NRZHG1pEEYFRO5bjMjbr/+18OT?= =?us-ascii?Q?btHA6DhDsfj9c20L0KQL4gDq3nP9eVehZWM41HyMf4Zfs9sY5RvVUSGG5YKo?= =?us-ascii?Q?ADsKN/BhzYvl6ThLyi4zXSc66eOOap5vbGLEDDNzkq5WDPrW9x7DgiqXAKXg?= =?us-ascii?Q?39mg0uDZlEwThYSp7DFmeaIK25c2bJcNDN2815YiuOYuTlPfFV7cOusArdO6?= =?us-ascii?Q?QpGMSSTA/IlOPtcnGq3mfpqNEHskslOKhEPOqkfvSTXJ/Vm40JNtHrLvVmEr?= =?us-ascii?Q?wo8uW5xDUYpVWrZT+zY+ZT55AGT4lz1gOuWEZpLisMRdc7AhBcXgNLD+KmSu?= =?us-ascii?Q?5XwKWE8i0ZeaD7H9oV7FbUVVcKsnBfLzmrr95yL1fk8qFs9whxT+Yupbk7S9?= =?us-ascii?Q?TWBXTwTPPT0JZEhbRIwYwMzh91j7JDaPAoxc0tqq9N3Sjn4VGON5Hip86eMI?= =?us-ascii?Q?O1oscuavtFreehLLkEVTuHz87Tkd0iLvH2gcrpdFj8O1wg0P8iHoIC4jJNMa?= =?us-ascii?Q?4uRhG3v6vPecwETxLV0bo1sEcYrnPMYnGdjKU7yDC5uveKM2HKmtqI9NzMS5?= =?us-ascii?Q?qRKoM2bxHQ6hKnpun7X6EhgnDQTLWOXDdrp2MeQdaA/D0r5nNsJccjnlFg7b?= =?us-ascii?Q?U08EurQk5Qg0E89mSjyqZPq4TnRpFne1qxYEFUPB8pIG0H12foEoWfNDLFwU?= =?us-ascii?Q?xA39cLrWsYMAe/AGarnpJCS2xzent5US+RAFpZ1nKq1TSkyrVGnIPV9OTjZK?= =?us-ascii?Q?N21Au/Lv8ILOUrmpYUkLbSHgsBiHgYjVBuZnh+YA/yJ//1pZyMrQJp7HOee1?= =?us-ascii?Q?oZz58ZYljllTBA4GLjvfVqAklUF78VV/yYhaVUlb2qw3j+vb99EfWKfoB9ok?= =?us-ascii?Q?k7wNcfLrr0cwOZjSltTcly4sM9fM+s8WSrlVdZN1uSzQikTXfxMAfqQanMiB?= =?us-ascii?Q?1OR9lkVw7t2mozCTVEZLslkylgIJU5PGZLCdwGxfJyG58yPyoJuE+SUFpYnl?= =?us-ascii?Q?xUJ3fzMB28/7FSMCTg35DTF41VXYAQSPTxmFMj+EpdmvMFMSdhVEUaIrwQOr?= =?us-ascii?Q?NlT/hQADWfNXJ5GcVmGnvxbGTleVTm09kELoB9ZOGqLeU3lJGNFI5NmYyI3D?= =?us-ascii?Q?9lVBLnEg5PpNN8WPXmOAC/9xnIuoAYwQKsu89v7cKiZiAfEw2W3MAWmMWN/b?= =?us-ascii?Q?TxBfZXrf4M8v6ejKEGxfsgC4E+psPrndakyr0rPFacrAnB9InIWj8Qq/CU9C?= =?us-ascii?Q?fIpq0nvPM3mOicL27PshnGGPSQRFBmlO+uvXO8bG2YzU228KeRxvpxCPWd+n?= =?us-ascii?Q?y2kpUlQNdl0kK3pLOnJyFH+bwadZ0Z8QcZr6i+TVTD4NJ9u6h5HgTLb/2z6q?= =?us-ascii?Q?paOMxBOkiKNWVMLMTxi/t2/IP6hQLzgEX4xJaUPXCUu0ZHQgWiTR+eBzW7bU?= =?us-ascii?Q?Fg=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 4EAJy1iYR4ryM3QrqOBWA7///begGsIFLTpe7BBDpSSbxgu6UVTIttxjD89/DZUBqW3C1spccP3nNt0tv/HIfl2NMd6gmRlujtVG5GEJO4Ms+j+TVrSAjspp7cG0lls1nEfcXVVxsqYwnt1iLAxVJFVAAPMdzU/hh0VjGa2zCkJ7tAF96Q/T4FjG8debRBiq8u8K/juiM0OM6Z8lHfr6s1HivAjPL1QpZevSk+ttG4u5XCWs+NE9YtL8bYciGAuLIUujxlKQWA9Girxd8ar3LhjRWk39Y6b3assYtzwZI4hHQMz1miObjCGkxJanzcSw9raMD1rA+xbihSd3I/Py6klG1lfz0LEJ626SRMAo4Xw/tPSH0+31a+rg1j56ugwWAwR0zG5EYIyjSkQed7xZtFTyk7UOtDWeVxbZbiClhItRppuqIlPmsUCC2JwEpocxFLBIO1nGCSKFoPCH8GPUK7n+YlxqhJBvtStw3UA6bI4lTITVwQcHM8YEtR8G4axSumlM8wtgGPL7o8WVDMBDEDf00EVsJsKEsR2X2qKxIEgf5ua7/jbNaCinDXSEuar8o3CCAXonbOjlw25uHYFjyeT243nY1xrjLpRtd7o0Yvk= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8e4bdb4f-b3c1-4c3a-d131-08dd81750cc9 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:48.3007 (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: quZdGHqHyqGQs+ON7nIyBMgj2imt/tiz+QLOuoKogg05f1l/heAuhV4oL2Zik3BmtbozHuZhHwIJKg8+azeZh0AEWLGFqacDFFc2H4rDp1o= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-ORIG-GUID: iU36dhlj7aw-4xCjAl2Zpt5qfduXprip X-Proofpoint-GUID: iU36dhlj7aw-4xCjAl2Zpt5qfduXprip Content-Type: text/plain; charset="utf-8" This flag is the same as MREMAP_RELOCATE_ANON, however it returns an -EFAULT error should folios not be able to be relocated. The operation is undone when this occurs so the user can choose to proceed without setting this flag at this stage. This is useful for cases where a use case absolutely requires mergeability, or moreover a user needs to know whether it succeeded or not for internal bookkeeping purposes. If the move would be a no-op (could be merged, or folios in range are unmapped), then the operation proceeds normally. It is only in instances where we would have fallen back to the usual mremap() logic if we were using MREMAP_RELOCATE_ANON that we return -EFAULT for MREMAP_MUST_RELOCATE_ANON. Signed-off-by: Lorenzo Stoakes --- include/uapi/linux/mman.h | 9 +++++---- mm/mremap.c | 35 ++++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/include/uapi/linux/mman.h b/include/uapi/linux/mman.h index d0542f872e0c..a61dbe1e8b2b 100644 --- a/include/uapi/linux/mman.h +++ b/include/uapi/linux/mman.h @@ -6,10 +6,11 @@ #include #include =20 -#define MREMAP_MAYMOVE 1 -#define MREMAP_FIXED 2 -#define MREMAP_DONTUNMAP 4 -#define MREMAP_RELOCATE_ANON 8 +#define MREMAP_MAYMOVE 1 +#define MREMAP_FIXED 2 +#define MREMAP_DONTUNMAP 4 +#define MREMAP_RELOCATE_ANON 8 +#define MREMAP_MUST_RELOCATE_ANON 16 =20 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 diff --git a/mm/mremap.c b/mm/mremap.c index 1d915445026f..883ff9499e8c 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -1383,14 +1383,18 @@ static void unmap_source_vma(struct vma_remap_struc= t *vrm) * is being moved to by updating index and mapping fields accordingly? */ static bool should_relocate_anon(struct vma_remap_struct *vrm, - struct pagetable_move_control *pmc) + struct pagetable_move_control *pmc, int *errp) { struct vm_area_struct *old =3D vrm->vma; =20 /* Currently we only do this if requested. */ - if (!(vrm->flags & MREMAP_RELOCATE_ANON)) + if (!(vrm->flags & (MREMAP_RELOCATE_ANON | MREMAP_MUST_RELOCATE_ANON))) return false; =20 + /* Failures are fatal in the 'must' case. */ + if (vrm->flags & MREMAP_MUST_RELOCATE_ANON) + *errp =3D -EFAULT; + /* We can't deal with special or hugetlb mappings. */ if (old->vm_flags & (VM_SPECIAL | VM_HUGETLB)) return false; @@ -1399,10 +1403,6 @@ static bool should_relocate_anon(struct vma_remap_st= ruct *vrm, if (!vma_is_anonymous(old)) return false; =20 - /* If no folios are mapped, then no need to attempt this. */ - if (!old->anon_vma) - return false; - /* * If the VMA is referenced by a parent process (i.e. is the child of a * fork) or exists in a process which has been forked, then the folio @@ -1414,6 +1414,13 @@ static bool should_relocate_anon(struct vma_remap_st= ruct *vrm, if (vma_had_uncowed_parents(old) || vma_had_uncowed_children(old)) return false; =20 + /* Below issues are non-fatal in 'must' case. */ + *errp =3D 0; + + /* If no folios are mapped, then no need to attempt this. */ + if (!old->anon_vma) + return false; + /* Otherwise, we're good to go! */ return true; } @@ -1465,7 +1472,10 @@ static int copy_vma_and_data(struct vma_remap_struct= *vrm, struct vm_area_struct *new_vma; int err =3D 0; PAGETABLE_MOVE(pmc, NULL, NULL, vrm->addr, vrm->new_addr, vrm->old_len); - bool relocate_anon =3D should_relocate_anon(vrm, &pmc); + bool relocate_anon =3D should_relocate_anon(vrm, &pmc, &err); + + if (err) + return err; =20 again: new_vma =3D copy_vma(&vma, vrm->new_addr, vrm->new_len, new_pgoff, @@ -1496,6 +1506,12 @@ static int copy_vma_and_data(struct vma_remap_struct= *vrm, =20 do_munmap(current->mm, start, size, NULL); relocate_anon =3D false; + if (vrm->flags & MREMAP_MUST_RELOCATE_ANON) { + vrm_uncharge(vrm); + *new_vma_ptr =3D NULL; + return -EFAULT; + } + goto again; } } @@ -1850,7 +1866,7 @@ static unsigned long check_mremap_params(struct vma_r= emap_struct *vrm) =20 /* Ensure no unexpected flag values. */ if (flags & ~(MREMAP_FIXED | MREMAP_MAYMOVE | MREMAP_DONTUNMAP | - MREMAP_RELOCATE_ANON)) + MREMAP_RELOCATE_ANON | MREMAP_MUST_RELOCATE_ANON)) return -EINVAL; =20 /* Start address must be page-aligned. */ @@ -1866,7 +1882,8 @@ static unsigned long check_mremap_params(struct vma_r= emap_struct *vrm) return -EINVAL; =20 /* We can't relocate without allowing a move. */ - if ((flags & MREMAP_RELOCATE_ANON) && !(flags & MREMAP_MAYMOVE)) + if ((flags & (MREMAP_RELOCATE_ANON | MREMAP_MUST_RELOCATE_ANON)) && + !(flags & MREMAP_MAYMOVE)) return -EINVAL; =20 /* Remainder of checks are for cases with specific new_addr. */ --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25003238C2F for ; Tue, 22 Apr 2025 08:10:08 +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=1745309411; cv=fail; b=P6fIfKWzvqDIMFcQE0uPdu19cNBzlJBtMw8WPr37zL3EdtzMBELtUUMMHSwooAFHQyFYbnVuMSn38akP9+4jX028V1GfQH4MqwumDoxFhT4jhSH2+3TTk7WJ7vh40OTViUK0R9M/V1ubdaGcrSSlRrVY6H9g8gPp6zwts1bbRww= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309411; c=relaxed/simple; bh=Fupl4z2TcH+WS4XjsvQBa8gAwbCW2hAQ+oCC0Dvzwac=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=RMX6p12/YWj77+Ph5UXZsoB5GXnhHCn9fn5xGw7e88mkWr0NdppUzyoCbTK/uZEm4zltJB1OWV6wftU+N/ESj7d0kAhmkJBZcZVkpbTZnBUvJhnzaCRUY2nVS6PaTLdU5/0kEli+As0nxy5nq1oaWzRRctUTalrcI1Gmo97bDnI= 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=OBE86Vlt; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Eqh/NeET; 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="OBE86Vlt"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Eqh/NeET" 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 53M7MxSL026357; Tue, 22 Apr 2025 08:09:54 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=wSV4zN21Wa7EchPbF45UaiWDq/8ezLpFW+z3ul22b2k=; b= OBE86VltrOaZP1tmGTrTDiy53VSH+kX5IQhdXmaYHyXsr9zWhSNcywdN1Ncr1SAA 42AlHcmB3galUZST0ksK2a9OQbDJ84dj5Qwp6G6Q9A5zUWDED4i27LSGH55j10aP ehLPXKfx0vVsO/jVn7DhOgxdhFHPVsmzsdAlfzHpH+DAZ6W5ouggucvWfLTD2Se1 2OmWPdudkFHWjafKbzdtDxssvL5PnFv/veuW5tEYKLWpLDcqMDvx0fGyhPkl6w9m QknVw4HAqYNYgao9yOZsfOz9Y/S9cMJplakhM/A1KOgL3oVLKlvN1I9SAd0koqGY HlZTe75wO1yiI1WlLjiSeA== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4643q8ux5p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:54 +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 53M709EG021160; Tue, 22 Apr 2025 08:09:52 GMT Received: from ch1pr05cu001.outbound.protection.outlook.com (mail-northcentralusazlp17010002.outbound.protection.outlook.com [40.93.20.2]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhsf2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CM6lqtIyGkRpsey7hg+/BwV/U5elIt+zOZLm5aCvTQyIQRG/Qp3d81bHJae+IMk4DW20u5qpTmzR5RcntM6XIDZ1vvxBLPWqAVX1CHhPOjT9Kqiz/fRp+HXI3UcmoAzNrafw0+vl2xKJ2Y+paD4FzJKqI2UFJdBoa4MIg+nG6BV9qvrSC2YVxmBU8t6QO7TBNUfaZ+OlVwDd4qqkYb9TTp/zJdEVpqLA8IgI/eRGbrDTSjDixJgCYTTJSHAIUOyn22yoKv1AiT6F2LWlNIP/uI3c9kbn5F/xqn3RyP3J2ig9vE1AlQw2YpiRwIiSuqpTfN1JW7NFGKmZWVOvNZ8giQ== 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=wSV4zN21Wa7EchPbF45UaiWDq/8ezLpFW+z3ul22b2k=; b=MFp8FQWPNhlYxdnnthsrKfQtHwyTJfSQMWwK+EO5DzP20AplE0JrMYzzNJV4xh6dVPg+y+4Qh4tsmnMyEepARc2Y1oCzfel5kcpOFrijXTYlslputj7qCa5BE5TMfazjT+A+5ewU9Ipi+886yMD7VqqbVxo88Au0y+gtro76NZ9K8iMNrRqwAwYby+HPwzXZ0wrPF6DIkt3ptajSouDmQ85NFpSbr9gzVvfRZ3zlT1Rp/OOwYo/LxGsce3dOmg9BK9uVP3uwAgzd/ARg90vOdTpIFmfJbILEnewCFyOOcNQasnQhN29i1hZHgO7bO8N+4iRX2BS5Ez/GHwpiJX9vqA== 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=wSV4zN21Wa7EchPbF45UaiWDq/8ezLpFW+z3ul22b2k=; b=Eqh/NeETRYLSI+bwTreUMnHtZ3LfMm7rtnnZmLa7ZL+Iej086y9cVmGSShpQ2jORv5b5jj8So07pDNN6+47C4IeAepbllOXBI8bwgVzUnT2tJXNm1tiQ6iv8R7+NGd1tEcs/ZhRr6MGgpfn55bG+hV2fmKjflq8XmviokZgNDwU= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:50 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:50 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 03/10] mm/mremap: add MREMAP[_MUST]_RELOCATE_ANON support for large folios Date: Tue, 22 Apr 2025 09:09:22 +0100 Message-ID: <59f428f2981d4a3349e8fb5c3a01a782fd5de2d1.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P265CA0186.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:311::13) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: fd5762c1-d4ab-44a1-28b6-08dd81750e33 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?t7R5ljsPCYMq1UG36TZhI3ZP+JFBTF3GY9wqvHMkdW2jkFCJIj1bIiuKxU9v?= =?us-ascii?Q?62nSOzIPtjoYsIK6UY+eqtZxQ6WqNQCR1xs+liJkedYkFesmDOov4gJ2WhiB?= =?us-ascii?Q?rrklk/OKzXC3+CeHwnh6377NViTxoPMXBPlqBN+ZouKFy54AgRs0k028Aajj?= =?us-ascii?Q?dmGDF2KxeD4XacqxwkVFyr5jsyPKfEmdIuD+IWTeTmQZoPK4hDkfZSQaf2OM?= =?us-ascii?Q?/ABmtL/nxFXSRJ49TMGMu0rTxx7+A84UIBVGPOa8PltnF4fEimHHZSDTmuxJ?= =?us-ascii?Q?DnfnDMH1lV2rxXGsPqypxA/qGOEKafTmkMlCM6dSZjcddsj5gzTr7SU9hmQM?= =?us-ascii?Q?MordF2/58pvVZk4/OQ5u4lu2v7IEPS8pWFjCUwBqotLPECQBcmT4NWFhvi8F?= =?us-ascii?Q?nesS5eAWloRjNRisHch2oE3JHhHY4W5boKn8zrNByMbraZ0s1VmrAaT0CZlK?= =?us-ascii?Q?vVjYQv9ojLaUeBxAkriclsHXoHQEhcpohDgigitvMaLLh2AWpQzYO8w2w1O3?= =?us-ascii?Q?ZIThD17Wq39rji6rE8QLEjvyhXEnYTT+FuClSWVmRDgff8MfniYGq/TTsPlP?= =?us-ascii?Q?f9OKdXs5+Wo5LXTPyFzRJzfoN8xzjuL3K69SNXuey+B5LMiEGvtuADNaXuJf?= =?us-ascii?Q?kdihDnK7pDa7ukVEnk6jnbYOtaBvGP52za6nlHHGPhbabRH35gcdjh01ncB/?= =?us-ascii?Q?EgoHAMl+5uFmi3xRXOWFvu7M7MRbEhJwfXfsWxwmxb52EZ1Nh15vLLf16JJX?= =?us-ascii?Q?O+Wj9jC8Ph+tqI+Am9xa9llZyV0P0BWUPOAqdriTDLaGkuBQQqBCp0BBu3dg?= =?us-ascii?Q?5k6FWdIdxvZv3EYLYht/Vny+UzUtWCjcyYdgujp+WKAxQaM9jTgPWYz3WkX2?= =?us-ascii?Q?aYnZbrITikHc0WXnVZ2b8z7oosjbQt2Ic4LddjxC+quucbcziw/mKehLV1k8?= =?us-ascii?Q?Kta0mLADftKK4h/v8kdjzAZ/CmjSiHiH4JWp7GvaLP7uHcgInYTpQMc3j3MB?= =?us-ascii?Q?3fjy17RtqfCOzfRvmP9BJBjiCrdVSRVNCRp7MP2oBoLAgCEWaaJVnSr8R7ex?= =?us-ascii?Q?xX3KhGtZUNm4TxxKaFAoRH3BuxXY+/dE5wAQWxD3RVgoDWAmNcL5mgmhQJ4V?= =?us-ascii?Q?Wmo0BFToDNyVFSKydx7qejwfwaXHg5tYLySfSY8Npdza74EOVnP6fXmPyfmV?= =?us-ascii?Q?YrsdYzYYFOOFItbPQW70ptrCEuMDa6IDVUPhvA1IeqekrHickbBkbD03rYhN?= =?us-ascii?Q?OAjEPBGhXgPTzZz+OJW7dM1NOWa2xcihKRr6T4bcORqkp3QKT5DQkt4QnW3G?= =?us-ascii?Q?Q5L+ktSrJtucXTlpTZTc34Om4DktoM6FLveq4emQTt50o6Kz5h88Xchd01X1?= =?us-ascii?Q?3G7lXgTPPQz+JZzZuzQMOj173j64Kt5JQ1VjdKPEgzFy6zc7HJVZXmaoza9S?= =?us-ascii?Q?zRks2u+v2ic=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?K+OWyNntsXL2RiWSxgDSs4zASz8k/E8al6vpUu+refDGD0u0/F3vLesd5VA3?= =?us-ascii?Q?RdIjuRl50xgkaagR1f5RuFXCo1K/JpZghvVr9gB75Lvp1m8CAcUnym+qBlCb?= =?us-ascii?Q?Zua0XnryqIqW+3f1S/fAw2Sa3nuCiRV6+dSZRwJwIVaagb9KyFN8yMs9masy?= =?us-ascii?Q?yUweSIBy6xfmy3uQ8OMRQj1LLFj88kygL3dK7TbuHbW4paE+JmJdOAFW0K+0?= =?us-ascii?Q?RxoCyazZeD6le7mYYbQziBwH7CT2lmwjNg8ia+2UrN4fBvTCM2KW06eozgPQ?= =?us-ascii?Q?nKCHOw3OpxurFQyEdJdIzEE+7jPBXLsxPRRM2VrSimYp63zi2McY9qBpkcjO?= =?us-ascii?Q?X+9EAHtMZ7+GXIeM3LNXpvIkvrqAr5p1Vb9Pi05TFTn6FAquYcW+MgUSLNQd?= =?us-ascii?Q?b1PtB1QYvum2lT2IEh52DqLk17bK5tJTwRq8gda77AYKvQL2CpHOjpIByQPc?= =?us-ascii?Q?gqB+bZwam3v25ohQ+2fHd6ifOaMUOxTs08QbmeiBZv3wEiLxmjR062Jy1Q99?= =?us-ascii?Q?S8hYVrzBLmRqcMdaT8OZDPk2JXO9I7K6E9qWuDc3WzcGGwU7o2Xhos/GdbXF?= =?us-ascii?Q?CAxhrjNNhtbdOehgKguJfnaxS1FdYdY4ZpnAjs8ea+YencOXE4KZkQfgefHz?= =?us-ascii?Q?YHIFrz7WIIcNAdXTgdP6QdP+KUQDnh9ZqMzyJgjHyLMao6cE1oFUXgy0XcFl?= =?us-ascii?Q?YctU3IZX0Eg3zTKdI5Jh2Mc7iJSNBuEw6uWrCN/M4MV0OPbwCzIJgcuLMkwz?= =?us-ascii?Q?z2+k1a/thg6dP93y6+bjOpWGiqhf99ictGk9GhN1EbO65zW0zkBxTPDeZQB7?= =?us-ascii?Q?jTy3HqGlOH5tObaB+QhitxUuvKkUOwSkc+BQoR2BcFIA7Sh12eNmdkwYoYBO?= =?us-ascii?Q?qji9dpCIpXUORynwZdjvAwOuQ337GVRnQL2iVUMvj0L+QMULxDa7hk8+fECj?= =?us-ascii?Q?aGphw+0BqjUenciK6UrOtVxY8c97C25TGaNe2PRp9q1RGK6ivHRQDOV3290m?= =?us-ascii?Q?Upfm1D2tdGS8ciJ+cI94Apfql4D27kmKs6gh3H48/39P/JSPOUg9CTO5xumM?= =?us-ascii?Q?B/ekEbK+qlzKA/UbyMOGG6VwyNKMFhcQIsahlBXA3NKN6yl1EniIdxklsVrA?= =?us-ascii?Q?F+m3sOzVIBY1T9lHfGi/GgrUSeTQyVheR+VVkoJaXOlR30KcW0dCvcp6u82f?= =?us-ascii?Q?6NH3XHOi3u9ntJzG9K8kYjymaM2ZXShnSOJPTfcg+JwIQzRMKDsuBg1+l7Yq?= =?us-ascii?Q?1SPePVVMTMksHriF9e+gaye8NscWiBiEipwk0BvBU4+DFKFPszw5v/DDtYGg?= =?us-ascii?Q?DMmBdrx6ySsbHz6PORjXGOIlq+W51k+nCvD0hIHAEJ9EGEK2il/kKedtOkQN?= =?us-ascii?Q?zXR0HnArFuqq89s/wm7iJl3L6CC9zQPIfwfj6d1IH7l+2UFz73OZzu0ggNVM?= =?us-ascii?Q?z9tnqy9l7p2/2p8oirEtmXWoq/cEdcD1nXWh005mw7WdijhNHvS31XsRt12M?= =?us-ascii?Q?ofahUn8ThL7ZWvZoLxzG4golqkS2DqfyHUbhTS5X0OR0xnBvMYd9L9uksAW+?= =?us-ascii?Q?u3nBY5DCaiQMw/E9Ewb5vteZghCIJEPYUEbyDKLFz4AztQPjm+VtTjXeNuJA?= =?us-ascii?Q?PQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: sptZT2DjJ6Cmot/+W/jmaVLMGjxME9wg0nriaDjuvCOujIiYge+nQ2lDWVyaR4T45NmtwdzJwv3PQO3nakjmGrpXzx4gAllplDyJM1Cv36OqhCTogyGc5U+4URrFqWkkIr954slTq7F7GZsHeb4iDzVTmYgrFthKrYv83gxCeYac5M1XKmKTnWJdwSSuhGXQX4wNtbX13Pp/iHfkyO1YomMGuD4alnY3vDauw4X+A+kVCG26Q9AxsOQrxt9odRjgOQUphywAyXKrCWINJnp16ogavXPQrPSNHoEakg/WObFkgVEcXl4z5g/M0orvOwRGkLQBactHsLF5RsbFB9d6i7dEORAqgxz9a2m8MzFUlJON+XCgawgNlX85F8bcGDI0g/x4y0ODPx4JaMIPruUalPRzT2lhwmeC6B7s6MUjavJSIBI+lElfZ4kmiBgpQYVxwa0wTkV9+ONzQvzenAHdmptc/TJirRAegPQ67LB2vwwZN5cgJZiU1jwHF26jhrEA5EGZtpk/tnRI09lZXXFyzoaOm/zO+bysTOfnR6X8Pxt4qkAZ3naozD+ZT0/QhavhOvPnyiyouw4LJ4nY203QJUDclCE/aVmFkTwjCpEzkRU= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: fd5762c1-d4ab-44a1-28b6-08dd81750e33 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:50.7625 (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: f74v+BklhWmCQk3RO07J5kutM/9/etQhZHT1TdClQR1bu3D299sbpJYH3b7fDv7s3XAmfPiplVvw4wbXGhBKDhW+QCmdwNBMvSs1zSEGiiE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-GUID: sie6S85W_KaTsEytWEwUu9D88UhAtnqy X-Proofpoint-ORIG-GUID: sie6S85W_KaTsEytWEwUu9D88UhAtnqy Content-Type: text/plain; charset="utf-8" Larger folios are a challenge, as they might be mapped across multiple VMAs, and can be mapped at a higher page table level (PUD, PMD) or also at PTE level. Handle them correctly by checking whether they are fully spanned by the VMA we are examining. If so, then we can simply relocate the folio as we would any other. If not, then we must split the folio. If there is a higher level page table level mapping the large folio directly then we must also split this. This will be the minority of cases, and if the operation is performed on a large, mapping will only be those folios at the start and end of the mapping which the mapping is not aligned to. The net result is that we are able to handle large folios mapped in any form which might be encountered correctly. Signed-off-by: Lorenzo Stoakes --- mm/mremap.c | 327 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 297 insertions(+), 30 deletions(-) diff --git a/mm/mremap.c b/mm/mremap.c index 883ff9499e8c..48a2fa7e91b0 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -77,6 +77,7 @@ struct pte_state { unsigned long new_addr; unsigned long old_end; pte_t *ptep; + pmd_t *pmdp; spinlock_t *ptl; }; =20 @@ -532,40 +533,67 @@ enum pgt_entry { HPAGE_PUD, }; =20 -/* - * Returns an extent of the corresponding size for the pgt_entry specified= if - * valid. Else returns a smaller extent bounded by the end of the source a= nd - * destination pgt_entry. - */ -static __always_inline unsigned long get_extent(enum pgt_entry entry, - struct pagetable_move_control *pmc) +static void __get_mask_size(enum pgt_entry entry, + unsigned long *mask, unsigned long *size) { - unsigned long next, extent, mask, size; - unsigned long old_addr =3D pmc->old_addr; - unsigned long old_end =3D pmc->old_end; - unsigned long new_addr =3D pmc->new_addr; - switch (entry) { case HPAGE_PMD: case NORMAL_PMD: - mask =3D PMD_MASK; - size =3D PMD_SIZE; + *mask =3D PMD_MASK; + *size =3D PMD_SIZE; break; case HPAGE_PUD: case NORMAL_PUD: - mask =3D PUD_MASK; - size =3D PUD_SIZE; + *mask =3D PUD_MASK; + *size =3D PUD_SIZE; break; default: BUILD_BUG(); break; } +} + +/* Same as get extent, only ignores new address. */ +static unsigned long __get_old_extent(struct pagetable_move_control *pmc, + unsigned long mask, unsigned long size) +{ + unsigned long next, extent; + unsigned long old_addr =3D pmc->old_addr; + unsigned long old_end =3D pmc->old_end; =20 next =3D (old_addr + size) & mask; /* even if next overflowed, extent below will be ok */ extent =3D next - old_addr; if (extent > old_end - old_addr) extent =3D old_end - old_addr; + + return extent; +} + +static unsigned long get_old_extent(enum pgt_entry entry, + struct pagetable_move_control *pmc) +{ + unsigned long mask, size; + + __get_mask_size(entry, &mask, &size); + return __get_old_extent(pmc, mask, size); +} + +/* + * Returns an extent of the corresponding size for the pgt_entry specified= if + * valid. Else returns a smaller extent bounded by the end of the source a= nd + * destination pgt_entry. + */ +static __always_inline unsigned long get_extent(enum pgt_entry entry, + struct pagetable_move_control *pmc) +{ + unsigned long next, extent, mask, size; + unsigned long new_addr =3D pmc->new_addr; + + __get_mask_size(entry, &mask, &size); + + extent =3D __get_old_extent(pmc, mask, size); + next =3D (new_addr + size) & mask; if (extent > next - new_addr) extent =3D next - new_addr; @@ -795,6 +823,165 @@ static unsigned long pmc_progress(struct pagetable_mo= ve_control *pmc) return old_addr < orig_old_addr ? 0 : old_addr - orig_old_addr; } =20 +/* Assumes folio lock is held. */ +static bool __relocate_large_folio(struct pagetable_move_control *pmc, + unsigned long old_addr, unsigned long new_addr, + struct folio *folio, bool undo) +{ + pgoff_t new_index; + struct vm_area_struct *old =3D pmc->old; + struct vm_area_struct *new =3D pmc->new; + + VM_WARN_ON_ONCE(!folio_test_locked(folio)); + + /* Impermissible. */ + if (!folio_test_large(folio) || folio_test_ksm(folio) || + folio_test_large_maybe_mapped_shared(folio)) + return false; + + /* no-op. */ + if (!folio_test_anon(folio)) + return true; + + if (!undo) + new_index =3D linear_page_index(new, new_addr); + else + new_index =3D linear_page_index(old, old_addr); + + /* See comment in relocate_anon_pte(). */ + folio_move_anon_rmap(folio, undo ? old : new); + WRITE_ONCE(folio->index, new_index); + return true; +} + +static bool relocate_large_folio(struct pagetable_move_control *pmc, + unsigned long old_addr, unsigned long new_addr, + struct folio *folio, bool undo) +{ + bool ret; + + folio_lock(folio); + + /* See relocate_anon_pte() for description. */ + if (WARN_ON_ONCE(folio_maybe_mapped_shared(folio))) { + ret =3D false; + goto out; + } + if (folio_maybe_dma_pinned(folio)) { + ret =3D false; + goto out; + } + + ret =3D __relocate_large_folio(pmc, old_addr, new_addr, folio, undo); + +out: + folio_unlock(folio); + return ret; +} + +static bool relocate_anon_pud(struct pagetable_move_control *pmc, + pud_t *pudp, bool undo) +{ + spinlock_t *ptl; + pud_t pud; + struct folio *folio; + struct page *page; + bool ret; + unsigned long old_addr =3D pmc->old_addr; + unsigned long new_addr =3D pmc->new_addr; + + VM_WARN_ON(old_addr & ~HPAGE_PUD_MASK); + VM_WARN_ON(new_addr & ~HPAGE_PUD_MASK); + + ptl =3D pud_trans_huge_lock(pudp, pmc->old); + if (!ptl) + return false; + + pud =3D pudp_get(pudp); + if (!pud_present(pud)) { + ret =3D true; + goto out; + } + if (!pud_leaf(pud)) { + ret =3D false; + goto out; + } + + page =3D pud_page(pud); + if (!page) { + ret =3D true; + goto out; + } + + folio =3D page_folio(page); + ret =3D relocate_large_folio(pmc, old_addr, new_addr, folio, undo); + +out: + spin_unlock(ptl); + return ret; +} + +static bool relocate_anon_pmd(struct pagetable_move_control *pmc, + pmd_t *pmdp, bool undo) +{ + spinlock_t *ptl; + pmd_t pmd; + struct folio *folio; + bool ret; + unsigned long old_addr =3D pmc->old_addr; + unsigned long new_addr =3D pmc->new_addr; + + VM_WARN_ON(old_addr & ~HPAGE_PMD_MASK); + VM_WARN_ON(new_addr & ~HPAGE_PMD_MASK); + + ptl =3D pmd_trans_huge_lock(pmdp, pmc->old); + if (!ptl) + return false; + + pmd =3D pmdp_get(pmdp); + if (!pmd_present(pmd)) { + ret =3D true; + goto out; + } + if (is_huge_zero_pmd(pmd)) { + ret =3D true; + goto out; + } + if (!pmd_leaf(pmd)) { + ret =3D false; + goto out; + } + + folio =3D pmd_folio(pmd); + if (!folio) { + ret =3D true; + goto out; + } + + ret =3D relocate_large_folio(pmc, old_addr, new_addr, folio, undo); +out: + spin_unlock(ptl); + return ret; +} + +/* + * Is the THP discovered at old_addr fully spanned at both the old and new= VMAs? + */ +static bool is_thp_fully_spanned(struct pagetable_move_control *pmc, + unsigned long old_addr, + size_t thp_size) +{ + unsigned long old_end =3D pmc->old_end; + unsigned long orig_old_addr =3D old_end - pmc->len_in; + unsigned long aligned_start =3D old_addr & ~(thp_size - 1); + unsigned long aligned_end =3D aligned_start + thp_size; + + if (aligned_start < orig_old_addr || aligned_end > old_end) + return false; + + return true; +} + /* * If the folio mapped at the specified pte entry can have its index and m= apping * relocated, then do so. @@ -811,10 +998,12 @@ static unsigned long relocate_anon_pte(struct pagetab= le_move_control *pmc, unsigned long ret =3D 1; unsigned long old_addr =3D state->old_addr; unsigned long new_addr =3D state->new_addr; + struct mm_struct *mm =3D current->mm; =20 old =3D pmc->old; new =3D pmc->new; =20 +retry: pte =3D ptep_get(state->ptep); =20 /* Ensure we have truly got an anon folio. */ @@ -851,13 +1040,55 @@ static unsigned long relocate_anon_pte(struct pageta= ble_move_control *pmc, if (folio_maybe_dma_pinned(folio)) goto out; =20 - /* - * This should not happen as we explicitly disallow this, but check - * anyway. - */ + /* If a split huge PMD, try to relocate all at once. */ if (folio_test_large(folio)) { - ret =3D 0; - goto out; + size_t size =3D folio_size(folio); + + if (is_thp_fully_spanned(pmc, old_addr, size) && + __relocate_large_folio(pmc, old_addr, new_addr, folio, undo)) { + VM_WARN_ON_ONCE(old_addr & (size - 1)); + ret =3D folio_nr_pages(folio); + goto out; + } else { + int err; + struct anon_vma *anon_vma =3D folio_anon_vma(folio); + + /* + * If the folio has the anon_vma whose lock we hold, we + * have a problem, as split_folio() will attempt to lock + * the already-locked anon_vma causing a deadlock. In + * this case, bail out. + */ + if (anon_vma->root =3D=3D pmc->relocate_locked->anon_vma->root) { + ret =3D 0; + goto out; + } + + /* split_folio() expects elevated refcount. */ + folio_get(folio); + + /* + * We must relinquish/reacquire the PTE lock over this + * operation. We hold the folio lock and an increased + * reference count, so there's no danger of the folio + * disappearing beneath us. + */ + pte_unmap_unlock(state->ptep, state->ptl); + err =3D split_folio(folio); + state->ptep =3D pte_offset_map_lock(mm, state->pmdp, + old_addr, &state->ptl); + folio_unlock(folio); + folio_put(folio); + + if (err || !state->ptep) + return 0; + + /* + * If we split, we need to look up the folio again, so + * simply retry the operation. + */ + goto retry; + } } =20 if (!undo) @@ -904,6 +1135,7 @@ static bool relocate_anon_ptes(struct pagetable_move_c= ontrol *pmc, .old_addr =3D pmc->old_addr, .new_addr =3D pmc->new_addr, .old_end =3D pmc->old_addr + extent, + .pmdp =3D pmdp, }; pte_t *ptep_start; bool ret; @@ -953,29 +1185,64 @@ static bool __relocate_anon_folios(struct pagetable_= move_control *pmc, bool undo pmd_t pmd; pud_t pud; =20 - extent =3D get_extent(NORMAL_PUD, pmc); + extent =3D get_old_extent(NORMAL_PUD, pmc); =20 pudp =3D get_old_pud(mm, pmc->old_addr); if (!pudp) continue; pud =3D pudp_get(pudp); + if (pud_trans_huge(pud)) { + unsigned long old_addr =3D pmc->old_addr; + + if (extent !=3D HPAGE_PUD_SIZE) + return false; =20 - if (pud_trans_huge(pud) || pud_devmap(pud)) + VM_WARN_ON_ONCE(old_addr & ~HPAGE_PUD_MASK); + + /* We may relocate iff the new address is aligned. */ + if (!(pmc->new_addr & ~HPAGE_PUD_MASK) && + is_thp_fully_spanned(pmc, old_addr, HPAGE_PUD_SIZE)) { + if (!relocate_anon_pud(pmc, pudp, undo)) + return false; + continue; + } + + /* Otherwise, we split so we can do this with PMDs/PTEs. */ + split_huge_pud(pmc->old, pudp, old_addr); + } else if (pud_devmap(pud)) { return false; + } =20 - extent =3D get_extent(NORMAL_PMD, pmc); + extent =3D get_old_extent(NORMAL_PMD, pmc); pmdp =3D get_old_pmd(mm, pmc->old_addr); if (!pmdp) continue; pmd =3D pmdp_get(pmdp); - - if (is_swap_pmd(pmd) || pmd_trans_huge(pmd) || - pmd_devmap(pmd)) - return false; - if (pmd_none(pmd)) continue; =20 + if (pmd_trans_huge(pmd)) { + unsigned long old_addr =3D pmc->old_addr; + + if (extent !=3D HPAGE_PMD_SIZE) + return false; + + VM_WARN_ON_ONCE(old_addr & ~HPAGE_PMD_MASK); + + /* We may relocate iff the new address is aligned. */ + if (!(pmc->new_addr & ~HPAGE_PMD_MASK) && + is_thp_fully_spanned(pmc, old_addr, HPAGE_PMD_SIZE)) { + if (!relocate_anon_pmd(pmc, pmdp, undo)) + return false; + continue; + } + + /* Otherwise, we split so we can do this with PTEs. */ + split_huge_pmd(pmc->old, pmdp, old_addr); + } else if (is_swap_pmd(pmd) || pmd_devmap(pmd)) { + return false; + } + if (!relocate_anon_ptes(pmc, extent, pmdp, undo)) return false; } --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60E1E23ED56 for ; Tue, 22 Apr 2025 08:10:10 +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=1745309412; cv=fail; b=pgX8tSYQclDykm2uQ6xoISyYhpV80iCz9ro6wRcM35ixuh9KtYqAxs1pj+yt7pK/9XcqoFIixoZNFQ86q8H/kb++RlZ1xNUtUiD/UXrPCVlEFby15liVlG0cbeXlmZWsOLrkmdy3yWbGZBXdUXyLUdgR4ta+Bocmwat9ooJkJsI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309412; c=relaxed/simple; bh=N9VWcreQKIkKQlQxYTdQkEYZjvCMC9v9olqXlRWcwAw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=oToFPmiEBpB5h7zno4YA6Tb9m8QiNSgzqwVjvQrFXW85iJjP8wJc5mgbAa2pjbgvMyn5hvAFkEsY44kxTm7Go9MlxorqeyRlztg21wceVEUcKtPkkmmc2KgvoV54e/TIIafxx/IfyROoPr6FFcQMKOZT0Db1g3pDR4RKcyGW6qE= 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=SXuP3z4G; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=mL4k6udi; 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="SXuP3z4G"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="mL4k6udi" 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 53M7NO4L008045; Tue, 22 Apr 2025 08:09:56 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=UvUEHwgbvWvHdYKMZiKN9Ao8MJG4FEQMhAk1hOqsSdM=; b= SXuP3z4GW4OjmTn0wFwqOCmbTqUoFfz2vxLBGR9cAVwvxn35w7LCzvAiO0rPvjoG DfRVF7qTD8P6FD6vX3SMbm/yc71/p5OZoINaNRcHR3ycV65uQFZrkIxOQPmGiXdy jNw9RYRIMwOxoV/sYb1O7JbafTHMztjXVtULNZHOZ52nINNh2Vtjn+z4+Gs/DCKi fzsncp/kqVGs1vex++FGMvsQ7Flwwgpx+BSh9uInz6EY6UC+yVIN3za9D23qMLN1 HUbYoJRUV9YzYankhEv2wXjOoDK/Z8o/ijJHjpvcWC753gIigoP313JMyQuns2dE y9azjRhtSljb6CMXg8TdfQ== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4643vc4143-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:56 +0000 (GMT) Received: from pps.filterd (phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 53M6T6Ms002279; Tue, 22 Apr 2025 08:09:55 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010006.outbound.protection.outlook.com [40.93.10.6]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 4642991r4p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:55 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=UU2wR0KqVskO1HV2oqQ3jwHZULlxI2xAbE/wLO6gZBazXObnzGQ1NoM8w5ghpjx3xc7BdzNzggPtzUv5fkY/ZViXOmeP8ppQcQPkhJjF7GmH3oLDqOYEiY9Oy6jgNq6Dd/Q8HU9e8HSoiFkGLYW5GCy9ZTu5BIHIotv/4xVEvNs//QQJP/I2Kym5eP2xteE4xoWW4qle05wpi789CsRYzIaxJpIqdBDPpVlOvpwxP06YhMFbhaYkcy+M8dDayJBhi+iK/D8+P8dRwV9RfiC7P4BsFhAI0bjpZwg82jaeIZZGkkPzHxZj3R8vha+K33SFULU/Trh2ZRJ19C7Ur2KyjQ== 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=UvUEHwgbvWvHdYKMZiKN9Ao8MJG4FEQMhAk1hOqsSdM=; b=uXDI+TTykx3qz3vmixrxMWGv57xLfylMAHh0RpS8zPWSlNWx1VoskeimPEc94DbvK8mJk2UscliqaFyB8QBrDnrmFjafn0H6EUnShlf3HQ9bXtWMjFBe5c7PSf0A0lv6F2jzHoQ6dpj3fqvkZ7DAZlO7/+0RuvymdLA1mEI7U1M0ehzOiqOevJlOyR3Phq8xnt9JGIdpgDVIing5e2IZbS42n0wMqP7i8amTE/vcuCqABNxkwxkmuWb3TQ1KBTmOBL1mlpNLyVzilp53LwF169TgXV1mZ6kKdHFDGJz1VdrBoJldFPEtki7aSKWlFyTjTKFWWHBIOZlUQtMUMlBBgw== 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=UvUEHwgbvWvHdYKMZiKN9Ao8MJG4FEQMhAk1hOqsSdM=; b=mL4k6udizAYaJ0KSDxYfvmepJ5cuUJaA8Cq0NL62WiddLMs0CWhV0/o3Ewo9FNWFOgEyYEpNNF9fpoSGG4UCGKgIqMJHCZvRZIBRKjYFSqWnhNPELKEoBs67jBqnF+ffhnjIjdPTvNYQ3he7bKHLsZ/O1LH3kBrAf+wsAd3oM1M= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:53 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:53 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 04/10] tools UAPI: Update copy of linux/mman.h from the kernel sources Date: Tue, 22 Apr 2025 09:09:23 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0144.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9f::36) 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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: 96dc4851-12c0-481e-6531-08dd81750fb5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?lUBum8WbKb/iv/8dQDzBB8z3q2jPLLryJBCv7wkzTPvSrusGUP18KqZRRABU?= =?us-ascii?Q?by4PjPS9RkX5/tYX8JDP8EpTTC7h5x4gfJB6uP3Y85E6eKRxX8GmXfBVcWCC?= =?us-ascii?Q?yd7txuXg4svSZezbIdaYBH/PhtIYFxV4C1ZZVKNh5CNEFvzvJje3dpVFT8qI?= =?us-ascii?Q?TZ5LiPG3tOR2XOqiP0V5RjiBNcvP8MzAlanS8N/5jX6DPVHvDJng8BcZBsjW?= =?us-ascii?Q?7h/lFaiK7NlSaBU++HHbDujKk29yEG79mg3nxX2SrAbav46nrR81Qm8bG5yb?= =?us-ascii?Q?cRnBeFQuzeSwHTUQ7IaOAHa7vIfmmoZg7cML42B29jRI+Pu8wTnqntKIj/P2?= =?us-ascii?Q?mRBKJPI8x83D5xxXs6Dnarz65SCb0nHlN131gjPULs8g35aojCUSw2PhETH+?= =?us-ascii?Q?BQTBJKF43QgT/sd5OGgJYye6CUVkOHtumJm/Ry72zhBabxpv9w3mIUiZlESt?= =?us-ascii?Q?MJ+y8mJPcIXpn2zu5niuCxpLiuQzeH+P1cNMbuHf8atAwN49vUoVlKk0YWUJ?= =?us-ascii?Q?5qIudnyIPWZNCZDvzdCq8yfXxTRQht7yJ7Ccx6jVqBL2xR9R0sce7JaT/g6p?= =?us-ascii?Q?/nVXTDIo83Qb9IzBzB153aeRL1TD0IrE23lfvLcJ60p1Y2HJP21PyvCJQViX?= =?us-ascii?Q?3YI4bMXpw+F+kY2D3ENaEKqe1bxjG8SNairkBiwyA9O3DsazDh9NOm1a3JG9?= =?us-ascii?Q?im88nLtdESWG5cUHmQuc9RjlsU9jWWdCviZaEHBW0VtvNzyPWSvrf7gjeB5z?= =?us-ascii?Q?WwFfJbiIWzy/w8xHqyg7nwE5GtxtsHKa0ZouL4mQKFQIzV1rSCZkK/j2yasF?= =?us-ascii?Q?m1gAwG0ZiR+BmymTF0fy11G3gCoTyar8w4o3H432fTv+Tt1UufzrcjC/TsWh?= =?us-ascii?Q?2bQZiQ9LmpX5lnAhqpxRiK1kX533qMEfb45dSoAuYPtmmN3iKE3AlKTx8VsE?= =?us-ascii?Q?xWwQnradK5Ew1JH18s9TsLce7BNG8NkW/eCGH2wIgc2KuzySZdxSO9Hbo43B?= =?us-ascii?Q?CbEZB/c8u49M8xZhEJ+bzDDk0cE/MESi+02fPXvPNqHfu/9eItw4WomDoFxU?= =?us-ascii?Q?zZbS2f6IiJBaNTsTuRVvudGg3U1XpX0WJSpLK9oVWJpVxf4DlKYGpldRz+rV?= =?us-ascii?Q?WkMk5p63mMqsl7KdrxDjS0Sl+fpttXLAJS8je9QSsbQHdQKqHwgOld5wca49?= =?us-ascii?Q?qSq0TqGy6qTNrX+1n5dGOHGqWd2WFSkkFEa8HkrYglfjCiyzrnrwtsT13+w4?= =?us-ascii?Q?2i5UAkowJ++njgbQRRXu5q7/iaqrYGu7+r0K6pNUxOZpuck0AigYIaCPTk/4?= =?us-ascii?Q?B3z/r+MUCbrpZoHPgGCil95qYAuOwFL+Sk8I92OgQ/A3eKE28xDtPPA5EP3r?= =?us-ascii?Q?iOvzpVHuQhhMMeh2+S2+1piHBJVd4cPTvwM35UvhnB/OPjPdQg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?GVQfS2olUSbNl6N+ZsZ3BhlyBnCLCRgfhlwbbt4vmLwwIXqhq0WZOzfD5xKa?= =?us-ascii?Q?KRK/ahcpt921V2Pxb7AAxPinWQ5JkToOwjhdU/pncBQAaAKaq+F7u7gLSWA+?= =?us-ascii?Q?th2pzNkGA8eZ2et6OGcg1ZRRQi3fJN7WYKeuvHgyvn6Qo3gFY606jocSkXF9?= =?us-ascii?Q?anOx0qx2lstYIXRRAnQxghTSu+qD8BFuVnuPZi7kuCajOrPVB+OgBeIknPfS?= =?us-ascii?Q?crJ9UxpvZwm7CDaumtEwJb6bnphm4MOvA85hcWTUCRuWykOANsbzAOEa12d0?= =?us-ascii?Q?TNLSQu7aTd/wVue53Qx8aMtXOcwcOHws4pFUtUL/1Ez0JIbVbQSU65BLfVuu?= =?us-ascii?Q?QlxpJsHwfMRGy/JV8nYIBM6X0t1aWU3by1YI7mvqeZlr/sDcSsiPWBZ1gz8p?= =?us-ascii?Q?xFSLa3PAaLo0e10muFermoXNU4RuqIMCvsxD6LksRhwh7/jssOZEO1Ta9ulL?= =?us-ascii?Q?Zr/vORlL+gVjBZPYKK5rMoavThz4mGmyBOWBHd2wFp8cdYAWaswoIL0+0zVV?= =?us-ascii?Q?UYuSFhSkrmyWuZRHlzDTlgTl6yG8etSE2qu9w1wClz4Zo5DpdsOYxUCvscEr?= =?us-ascii?Q?r8qEO4TnMoVOyRD+XcY/IaRtu8S7oy7wYaLuo5uvliP5jhOUuVlnRD/djh2C?= =?us-ascii?Q?rx3EbC0Wd8OGt4JYkJ5cKnYdSB4w8m6W1ueKF+aX4TzqHaojc+M988Wp1Ftk?= =?us-ascii?Q?GLrhqGck1lsDOWGMWl7S38jhxAA8IgOs+eJIwXUY4tWvO8lsdznYoRrf5s7n?= =?us-ascii?Q?64lnmw56BlkFaH+dOd8Ig7Ykm7XL4e2G/NNMNUCToxhJzYXkc8OmRSf0PRtR?= =?us-ascii?Q?GCCmIvyT9W+01vaoXvyga63maZAcWCmOv64KwBVlK/2N71EwyykQQUYii9p/?= =?us-ascii?Q?R1ltmnuzU+k2soyCWVHI7Ota33kD8ird3IL8Xjo22ONVp9EQt5jWaij6VfX/?= =?us-ascii?Q?m2FFbjlUjyrG3NDB9uxYx9mNBm6XztHzYd3L1N0StzjbXsXUABl/J/QW4F/7?= =?us-ascii?Q?6Xur1mqSdDVKeCgj1l8yH69jdtz6zMH/1uQ2DlvBWWq6/yJSw9RyV3E+pZBy?= =?us-ascii?Q?RcOt/vJkwSxqtD781WguBaCR1FbNp0mF+t4AM6KFHjLLkJg+kOWLtuxNSrx3?= =?us-ascii?Q?xUbyAz7nhlMR0NlSVoZxbohnygjuGDiV5NBwWk7mokBjT18G39TfZoD151Kt?= =?us-ascii?Q?y7+1JOSNHMWt8Vc8O5/woTVeSpzErWIwP9tCcslbIxyu2EO/ZzBUG3bnqh38?= =?us-ascii?Q?Qh793TxKlq9bi1A80BRgFxfn+61icwdLYG2Tq0/FFwIrAvkd1I06EAsIcpK9?= =?us-ascii?Q?Qv7xl9Q4lYNG5qtCTG0DsmRO3UKTN8KJ/IZRnvHw0nbZM30ZIfVJSYSX3Uvn?= =?us-ascii?Q?vXPM8wECIynb2IG+Qh0VtEMfXPUhguNXK1klI3GUCpOeAuq9YWbSLhh7OlAe?= =?us-ascii?Q?eY14mOt6dB2zF0VNCqwpYldCk9ILGEblZaltK2G+Zo9ZHGYtadqhXRMZQNCy?= =?us-ascii?Q?BS1/yG6lNeyNl1aexo+ETVi6n+KM1qYjDt9FF8tYWHLzJIS0rG/MzR8tTCQo?= =?us-ascii?Q?ztMixsj1X3pnqgbESRKIsWL7ZEzc3PypRn7Q/nhKaNLhAwsvQAWzfIzbN2Ca?= =?us-ascii?Q?jQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: w5dX4amHMT00Y3stW6AJoHqCoPdb1uzpFNj8jSAh3wS33vokfqKjGJCK0tDKX+p2fZTdjfgbYvSzScwTPqbrIjJYWlE4IiEqJrWPqkbiVbU0Pit/8OHQgDPaQ7XDJvL1HDYDLTWVJ3PC3gM+tR8H3yII4XAixd8C998jJRrFLUZhiw55Hr4wpL8I7A0B++YP4f6mPOg51VPJsO8j8en4ZfuSZ/ejXDmSy2beRlfYnwjJ6axWoIMxIiFra6nGp0piXy9IKxkmJZ9Hn6AWja6nmSPXAXDutUIFbbl8FazcFFm7gA0YBgtsOdLtbeSbaNpwh3EnzXwSknoRjrRXslI81SahJKUfDAJyEmruQr8+CVoWWQ9tBlF6yjV6yPRId8NeXElyv1Nt41bQ/GvfXdWSfSALq1IZqp4r9YyVoc6EOrxbN4gBG1H5hNrxmmmZvraVm1UGWQ3kfZWjRlb3Sc9Z2PT8qZPkXJsSuQSFUAub6Zt+w6bjR62Nen1nW3UzLaP0w2oCj/pe1HkpsKeSU5FVJ6azuaAviuQyv586Qg6/l37RiuxtI/2J0SSGvF+8BTh5tu9RsOGKAPsBm/Xu1CHL0ASdQuYRqZGZjsvT7MtSrAY= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 96dc4851-12c0-481e-6531-08dd81750fb5 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:53.1804 (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: Sae1o16edRUiqjRzg1qKbe0mN7/p+6uu1PGOdhrgPGd0MOzumeL+12FZMO98vTEmarRFgnBbxsDEIzIoQbeCAUPHbT8+BQ8bQ/q3jdZsI64= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 bulkscore=0 phishscore=0 malwarescore=0 suspectscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-GUID: w0JPJM_dkK9H4fbIPeFYweZecKVGwb5Z X-Proofpoint-ORIG-GUID: w0JPJM_dkK9H4fbIPeFYweZecKVGwb5Z Content-Type: text/plain; charset="utf-8" Import newly introduced MREMAP_RELOCATE_ANON_* defines. Signed-off-by: Lorenzo Stoakes --- tools/include/uapi/linux/mman.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/include/uapi/linux/mman.h b/tools/include/uapi/linux/mma= n.h index e89d00528f2f..a61dbe1e8b2b 100644 --- a/tools/include/uapi/linux/mman.h +++ b/tools/include/uapi/linux/mman.h @@ -6,9 +6,11 @@ #include #include =20 -#define MREMAP_MAYMOVE 1 -#define MREMAP_FIXED 2 -#define MREMAP_DONTUNMAP 4 +#define MREMAP_MAYMOVE 1 +#define MREMAP_FIXED 2 +#define MREMAP_DONTUNMAP 4 +#define MREMAP_RELOCATE_ANON 8 +#define MREMAP_MUST_RELOCATE_ANON 16 =20 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4773C2512C3 for ; Tue, 22 Apr 2025 08:10:11 +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=1745309414; cv=fail; b=bJNy+dZU6in9YbDF+wHPz+CXNYPQfrlYD0T4qAQBP6/VJYWzF6Se2vUTaahV2UTIw50i8eifZRiuZd5HNcskYIVBmpHIJfPio/qRF5uXM8MkHVLb+NozDqPXc93i93FLn2yNEDrSPzuDhKwXe3azeWK1cqsps4Fn8v3GDwigdDM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309414; c=relaxed/simple; bh=YyQm0zfnE/GOX9hQuT2madoohBV4GpKMgHhgEwC9IZw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=YoNvmrPn+9wR/n+7iqtrLlYJ1ZS3lAgVU/3N8CwLmYXJMnLVNr4R28/djXOWfu6uqH9aQVRT/KjZc8X7mdGwdP2kqaJuXtt6AWJ4rXXc6/uCuOrWwVjzMN0abjjvJKlA97Q0ZzyxMKEglCzeiTYfAxMERkT/w28TERtIQgRqUt0= 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=ncJUzFOU; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=MdacxFe5; 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="ncJUzFOU"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="MdacxFe5" Received: from pps.filterd (m0246630.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53M7Mx1b016175; Tue, 22 Apr 2025 08:09:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=AjGL/kfeyRYEIw308dmqe7ZSy9pdc5LmotsX6koWyE8=; b= ncJUzFOUHrdBy6zWcDrDBOL7WcJeZYOFu7iHPzOs8D16+p2mPII54xeCFZdhIV5p mr9shfPahjENU/RjiOG8QNj5G87nL9OWK0BT+zBhniR6L6ss/xwlfSkdWbh4xQnX I7InMf9iVmEuoiaN2oHnHqXoECH06hK7FXICtTkBHwXX6zGEUYlN9jbPl+u1msV0 /TkjnlV09f8EyZ5C0pqcHaIAFo8g5tx7qc5WXpAdPxKbYnAeVN0s8WeQ5dOTUOV0 VvKEb+dK+aOKkbJyFLmqJ3O69yyB6Yuog6M7YktRs9tv1SsQNoKlAF/nXRobg5rM K+z2agyRxpKe/c6Kpx3mXA== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 46428c3yh1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:59 +0000 (GMT) Received: from pps.filterd (iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 53M74DRX005845; Tue, 22 Apr 2025 08:09:58 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010005.outbound.protection.outlook.com [40.93.10.5]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 4642999cm2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:09:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rYI1XR6wZkE8eO78T7m5zMvJyXLl6dAhCO+z793Sz5VuT7MZMMVTf6VORNGnvzxC2nV040wemZn7cPDVC9bBkY5TEAo5APJCNJsIVrQ64SakpqjZ7yhbaLHDGdqGE0tNV0UU6Z+TyU/brcrtgSusqM3whryDzJ67zD6D/1ISHVz5rdUtgjNCb0CfIAsOy/bxCzZXrBCn+4KupVkDH3litFat+w7AkoMiy7ck1DGaiZ1ts8wJO0HwEfljJtIJtfvlr1gQm8GfhjxUicH33kZf6Zs+lwocLP4crLcz7tnd1+JXe4ZDQWOh0E1MqVyl8Dbf2K5OFWnIioBtlfMrW3vcnA== 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=AjGL/kfeyRYEIw308dmqe7ZSy9pdc5LmotsX6koWyE8=; b=wRWuYNIiZVsapGDw++g/3ULZrm2XRhZfQUYMNq3omsipwnsBTuGmJLluRaeK8meods/CJP5sE0b6FHP5eV+vQVucqP6CraBXKKy4w+rWBY8mSadoP8DSfzpoY1teb8BG+1bdQxjkTKuHgNZtVViztPOQmb98anxbOEwXxJlJot9fJDSPuOfDB6KnAZe3UPQbU1W1eB0dNAEdyb/lQw+3cMtriQwsspbNhgP7/ZyHrBbRhB7oQNoMqdvPaTFPuomMHOvmpJCrfJumMZK51g9Rf9mKq12Edg9JeXV4FmayLMVUq/MYwcQO0yq/816X+7wlYEEw2gLyWqY5NbDw0W5PQQ== 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=AjGL/kfeyRYEIw308dmqe7ZSy9pdc5LmotsX6koWyE8=; b=MdacxFe5UFjIDfrA9CUevjHHgtuDK1yz+xK0rS+FCtNGdF3Q8bLqV1t69LV3LiG0qube8zkQgblLDUs/rP1LJobw2kCwmRORwXizcEpxolKb4MhC4s2yRqtdQSuhMU3OEsvUKTxm8EYTdMOmENP2z29F1aUJvVvXPNl7hrWlxqI= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:55 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:55 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 05/10] tools/testing/selftests: add sys_mremap() helper to vm_util.h Date: Tue, 22 Apr 2025 09:09:24 +0100 Message-ID: <9e983e05e345419361ae3ac4e4a9f8242d3cdaeb.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0356.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18d::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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: abcd43f3-6166-4dc7-aa69-08dd8175113b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?Q3sDO+p4nbtxMupbfxLfEZNosRM6NHQ6Zo7gi8WBanVje8ZhChO5SKR523Vh?= =?us-ascii?Q?cXgcj8BhkBWFHIe3+2csmQqBefCVZxdt3jzEmpdAt6pOsVgusHhTEY+uuH7x?= =?us-ascii?Q?eEUs3nZId4y6uC4JWTXVoQ4hJ2CdrlyVdJAA9AK6qq13z375c3yfYg7wMHdt?= =?us-ascii?Q?ZVDpq37tsYDu/mHiYWXT/JRHKsplWOXmBt5x8KQqQFVPdRcnGMyvwvb3yzL1?= =?us-ascii?Q?zO4LQil1UTVu/+EQCHm0oOpDnAA9Qa7dqgwxPNjt85W+WVwEWgjahIFVgNd0?= =?us-ascii?Q?DPjTmGs3J8BGWJuSNHvxfAo6rAlS1YrTC8NasVSXEs1UdPL2Ypes6ApAG/Nc?= =?us-ascii?Q?bHCBlEXMFi0WCcIz9yk6MHeqMbIBN7zXtWZbfcuzfNx+9/yHRWYlBnHnCjP2?= =?us-ascii?Q?C3gWZtXDITbgTbjEx2d6BdqxJVfs3f0eVdaJ8IEJkVtTiYj1N2WfbeO/ixxj?= =?us-ascii?Q?zf3Ei04R4XmZKDbZZ5uLEXC+UqfBF2j0lf/N2P5SDoqKGNtQizZMt+PehC9X?= =?us-ascii?Q?dEOKnDuolgr0DzrbtaWhnhiujrI7O91c0mjLqXRRcSVDipvh/YLK2wDNYrbr?= =?us-ascii?Q?u1stP6My7RpUe3SjoHf6d0zBUUbCnM1FGFMfAzc4UIvxwTRjaBFwYPMM++um?= =?us-ascii?Q?Sxtd8FEOEU0H3J5bZCCK8CcsKokFPfADwJ/w4kZdImdxBW+ZqkIZjHqqUxZC?= =?us-ascii?Q?4GgozQcaCAucU0myvEYyRsN7p+PMn8pB3DGQwDGZlhC0oypD0eUGn7bBHMtm?= =?us-ascii?Q?B5iOKPp8fhH1DhWUZ3+azfsVdwUp52qhc5gm9dO1qXL8k3qtbgUS95b7cZ+F?= =?us-ascii?Q?eMOyBJOcfyi8I28zCPqg/BLWwSUsHJsHIDx0i7tHWWrIV/vWlCP3G+UA4K2D?= =?us-ascii?Q?qDta2PllUFxaw0zsy2Jq6PLZuLCVQ7lwBtLQ+uc3TRJHMcFlCd9v1fM+d2nc?= =?us-ascii?Q?rHYHyIAwYFPET3GJVhEA08107I0Fo6HK4HNJ/lI9NCa2ZhVQcm0V09wMFzZZ?= =?us-ascii?Q?yxTIFqBPdcKzU5Ytz0akehkDMCddbhxcwdFnbzVeXv20Eo1SE/C/0405wLMM?= =?us-ascii?Q?AGsfLxCeWnGNFRBidRGOOaBpbTe/7zJU4lIY/cl5hJwZWyNyZNYr7tx57O4t?= =?us-ascii?Q?/DPQ378/3VJH0i0TpCKke8lPLoSO6NbUaWfOjlroQo3VHN3UdpoyAc3mfrXU?= =?us-ascii?Q?MLHm8u0s6ySlfkM+qkxmJ//gLCSjywHNRXooZkybyhgnJzeXXFeyGRVfcing?= =?us-ascii?Q?73tVPJ6z6460UHtBci4WVsmER8t9KGYCX21isfJLec95bsTxUbdMLPddcrwG?= =?us-ascii?Q?FR0HDsCdUkGQzJVsGdDNlCGg6EXsIAlakX6Hqb5CvYvJSm6YOyCh1ivjdtnN?= =?us-ascii?Q?BLjiG7zaAif5VpuY8LE1v3nF2BK2GyOYIL9eKNc3Z3Qn8CoZy0DYwzoEPt7x?= =?us-ascii?Q?suk42HrhXG4=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1Ts9nixdjmxZx2mV3WTXa/fNxV/r4IMA3bzOp0Db4fTeW8JQOL95odPSB18H?= =?us-ascii?Q?eAmWDEk9Rg9pwdLOq8bWI9n1SMJd44xjDtAyUqxC7ssUdxBI+omndB4R6TbP?= =?us-ascii?Q?/me9OQ7VDlnjMcHGSKHcjXA+I1owKKLOUo6GeBPKZlKiSGUm0frNAUUPzjX9?= =?us-ascii?Q?wp0/j95xrsoeYw2RIq4ClnG+uYhCFak4vzGM1YRHEt1vIeEfiOstmKt31b9Y?= =?us-ascii?Q?QMoKvh87U8qGy3TGtTEEtiLzQYqm54keIIGf/RpP+OQvrJd89UIRU2eZbTIK?= =?us-ascii?Q?HUhbYrzpW/UCEPC9Mfk+id78TW2aldw+UqcvfOwQaFYaTiUdeNVaiaozY3vo?= =?us-ascii?Q?m6Whfj8FYTv63lSxJkV+zsmBSqHRRtDEw+OaIzlDTOGDlYVFm69yJuGohmcp?= =?us-ascii?Q?HKfTENo/RfheLlNCHka5rqNphSrDqdcsYPUKL8jqw2Z26ejWzhtLwPx1mKxK?= =?us-ascii?Q?mdMnihCkFM1Nb5CWCXfH6RSDWs+ugvlg1DXgaFvpPaYJDNFeeJFvqM8qYBdW?= =?us-ascii?Q?M9q/SoZWWxwIE4IIsYzeUocijAIk6Y2bGJujW1H++QtFAVtGeNQrR0PFpVcC?= =?us-ascii?Q?m6/NtuUEpecZ+3BAn2iHmdEyQqMlD98Ibpf7zBtWdBblhyieEFtJyhWADsdT?= =?us-ascii?Q?BoKlLiKEYAsgYvZOZRv50Vk71DMHnbp+THQIBfBW20Mfaolv2EkYxzX3i/KX?= =?us-ascii?Q?dO37yRN7Epufvaj0XNK/aBLhA9bVa+ekA9sFZOVCGIGmVRYJ4R7KHj6DVj03?= =?us-ascii?Q?HsS+qbM++LqGQ5N0MHwvMvHQMyHGiNZ4sljFOFdI++uUUDBymk5T/UMdO4vx?= =?us-ascii?Q?Fx83J3QWFcAzCrzvu7tj1SHHJIX9or8p7hlTCLAAlC3klz8y7EdMnsR4Dz3W?= =?us-ascii?Q?myufnvE8n0RtqiXYstqA51aNYv6kvuKzUIVAQr1w7ysLcvatYFcl+SCGiBY6?= =?us-ascii?Q?WRm/SBXwyFf8DGOdNmrQtVG3m4g1NoATw9D2FrZQ64PsUY/Efe+V94rV8DLy?= =?us-ascii?Q?Ya00z84I81iB+Gc70ckwx/DHZHebrKH5BCVZdSoOVkJFItbN9EobYAY6bl5U?= =?us-ascii?Q?cWB/teHf7glhFG3fOEtX0s56pJB7RHwhLC5p+W0CfiDyR17zRfvap8Fu7vQY?= =?us-ascii?Q?IpDRydMCwGNV2rX++f/jWd0Y8N3mYeCL9q2FByEDft/H9Qt0N3d3qJsyKH5c?= =?us-ascii?Q?X1mw6RpINrl+QAQcr4ixyD/1hOJYCc+4un1sLA6XksmlKKk/1G7UsE2mppsq?= =?us-ascii?Q?qLD0XGMcGWzbVAQVKcf93gBAoLypTcHKxXKDBPICBYB5LNlrUbbeIDbsBv6/?= =?us-ascii?Q?MMH3IHYrpNorSb1jgx9F5D++DqSAD+JvoybCCRa7RH3zPgweTndVdHZSY0/c?= =?us-ascii?Q?G2q0yYUH6TF1ijJBqC9GZEw2urPepq2Ng4uFBhxkwWA453xY2nIvXQ+E/itb?= =?us-ascii?Q?MWQjqlgzczGM23pYaJcS+91rQ5xPq9lYrxCnaROsDwR8fWom8JEqS5HclF4X?= =?us-ascii?Q?pV7YhbdcdrznT6e7UsqlEr370YCsiBiHRk5Xv62zNrIkHv6V/dGbCzRw+ors?= =?us-ascii?Q?24CQaPjU7OdTp25G8jAKeHwuxX42FxHRbedAYE4UFq6fANwPABFJj/MmHJnk?= =?us-ascii?Q?sg=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: TSquZ4HqN/m+4T9Rxc6k+OquID5gjfI5Thjc8YlotvjTrQxNcvEbzXy0w+g7vNuTt1TQXm3EDRomdgyeODxLQkElEObcZ924QKwkdkvj7tj/KrWwE5gIjPavYlHHqAzn8TPGi4gBR8uXNNTeVwrEIkaKZPH8p0eLcXcl/ZDDBuEHsnl/cc5dXxmKM5wmwLSdhPvNGm4O7xsqD8pVr/yEu161z8LGsevf/DgbpB9K6Yh1SlRXGW+nrEPdXJemJH6W4jt/kGOt2zzN5hWW0ND4mIj8N7bGwCY8njyD+81iCCGbXZaTqSE6d6qaJWEg8aqY84O12HtyZUzaM9id5FwHeL0pUGMYbXsCOgjwmIB5kP8xQdspdg+/qriwOu/TEIGGbWlFvoZhfFzUxqoZq+8KYJx91l3krZ+qHUu9MM1LNIx9IuJ2PmpwHdtWrvGVhYIHfL2aDrpr6pEhI4g/FrDG1Q8hVSkaMkhP7OTSAM2t0Q1z4C/eaHWvCD1YS1H48iYDQjhameenxQj8UTu8BtVJpZzBE2MZCH+C/Az3z/icJIl2xp4UfWjbGntDiQXkxa+RfTQYbpp4zZeJztMzGrywN+0akyhakv3qqn9G9mDBLBA= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: abcd43f3-6166-4dc7-aa69-08dd8175113b X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:55.7983 (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: ksDIFH3TGTOb8zLYz07LBQXC1JOrA/HmBm/BTaSbN/2l9q1uZ+aOyLchx+hyejkkKdqknoLB6QzgzzFrFFGsrZB8OONGp6v3wUHX+F9VXwU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 bulkscore=0 mlxlogscore=999 mlxscore=0 malwarescore=0 spamscore=0 suspectscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-ORIG-GUID: fK9G8YD6YeYeuvzzjw4FuADFE4FDc3fT X-Proofpoint-GUID: fK9G8YD6YeYeuvzzjw4FuADFE4FDc3fT Content-Type: text/plain; charset="utf-8" Add a helper to invoke the mremap() system call directly using syscall(). This is useful as otherwise glibc and friends will filter out newer flags like MREMAP_RELOCATE_ANON and MREMAP_MUST_RELOCATE_ANON thus making it impossible to test this functionality. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/vm_util.c | 8 ++++++++ tools/testing/selftests/mm/vm_util.h | 3 +++ 2 files changed, 11 insertions(+) diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests= /mm/vm_util.c index 1357e2d6a7b6..a2f07b10c0e7 100644 --- a/tools/testing/selftests/mm/vm_util.c +++ b/tools/testing/selftests/mm/vm_util.c @@ -486,3 +486,11 @@ int close_procmap(struct procmap_fd *procmap) { return close(procmap->fd); } + +void *sys_mremap(void *old_address, unsigned long old_size, + unsigned long new_size, int flags, void *new_address) +{ + return (void *)syscall(__NR_mremap, (unsigned long)old_address, + old_size, new_size, flags, + (unsigned long)new_address); +} diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests= /mm/vm_util.h index 9211ba640d9c..434a96b33738 100644 --- a/tools/testing/selftests/mm/vm_util.h +++ b/tools/testing/selftests/mm/vm_util.h @@ -95,6 +95,9 @@ static inline int open_self_procmap(struct procmap_fd *pr= ocmap_out) return open_procmap(pid, procmap_out); } =20 +void *sys_mremap(void *old_address, unsigned long old_size, + unsigned long new_size, int flags, void *new_address); + /* * On ppc64 this will only work with radix 2M hugepage size */ --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BE8B22A810 for ; Tue, 22 Apr 2025 08:10:15 +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=1745309418; cv=fail; b=W0mzdLi6CY7u+rE4+4T2+llFOCYp9vuXID5LfVXhybbCggeY/yv0bTfJYKa3h6thoS4lzvJNJV6k+eokicbLgjCfJk2gZ1Pcy9vlaeufb9knXKYVF5HAhTwwcVIChqugn6d0nOAII5trTFh48eDp7b7aRDN43kGH1tjmedZUXO8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309418; c=relaxed/simple; bh=jKZORa4g14kSfcnKrOuxymjZ8DPEq63yyK58MBFFU84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=QbA+o1zp0H14qPHC8OsLwlRoABo3WeE6X/AnjKse0Ytct7oodjmWFdKwituTHKxZrdpDS+YSN2UQBL1XtH7xgt9jHjEzT7W4OOzpk/BEF/1T1GIiHAqvnSy5Koq6GnesslN7qMaGkUViKMVN91dQE/N/f3kqBmNJ7gkpwisKDN0= 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=FKWVwBsh; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=y0Vpbu3C; 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="FKWVwBsh"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="y0Vpbu3C" Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53M7NQoY026663; Tue, 22 Apr 2025 08:10:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=8B74GaCLue7r0Bt62+R38Fa8FABO8o7zSAGbPu6YmJ8=; b= FKWVwBshesQFTb6116E9wCWM/oFu9kTr1HJuJ8cdQRHdeGy38JrZchaxr3Tmoi4p tbpc2376Hi28wK0AeIIzNgAvz6BSIrVw5nInM7zIWtzJEopprc5V6ViPs0+/nEsI 1QjHdFm0m6TCpuPg8W0Qx/A7qH0p8TBIB0z4ojnogx+mJiURO6xqUbVQw1GMGF3q 7Ku/IOe0tFRA8JwL1ein8tsd4zPtCnkYke7UwM71kv2Av/vNv7ungPiWmmFqtFU3 F6UwwwQQir5n2XxO1I64C9coztowf8glfmVm7sLpOMVRGKJb7sOU+3suepxWn74F hvXY19xyI51VCgPusmmpDg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4642m1uyys-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:02 +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 53M6XkWt021143; Tue, 22 Apr 2025 08:10:01 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010003.outbound.protection.outlook.com [40.93.10.3]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhskd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NzstWzfwzybViuQ4ob1RNmM6EdVsiUSNlStNdKbIhad7wFViBVqNKeCTTbJjiyMX1o3nhgiT9gqrPBV6VK6KC7gySKjzglC2qH9yY8bKd2/dxP82d4m0to0DPxD8b8rTb6vSgysYXWJakxondAODgVIIDRgILD6KGmdh2Gwsw738vjAC7wZHwf3H0zdVfhHFH7sCPResNVnIrHdbyiUAYyXcACZWhKsp/jjPWJ3V0ZXfQd3lD8JRk0XLktKA2VX2TcxEN+++ioBoxLMiq9Aeshr893Nk6T/qTF/sEC4EpyRxwL6y6YApEko/7AdqfuHXVOjntqaatbRdZ9ieLs6CNg== 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=8B74GaCLue7r0Bt62+R38Fa8FABO8o7zSAGbPu6YmJ8=; b=mxq7WfTV7i/m1DO02wTZk9oQ+Y5GqNmdcg+hMRZm3vQA/1oB5gWr1wms4gN8glUGAfC6VFxm6MbIQmAr2kycUxAvPht01QZCDsOea7mt4Wfx7/o601RFnNZHsmeFA19ELYHVdyaY4T26GHxwr9vL5VorbYkiRPJXKAWG32XghFUaXPRspiTXFEqrkCSiydW3H/BGHMRuosyv55salQA2zyzk0FaGLMMR3newnrPX8VwZYtgRIY7C5aTNGhLPkhIlKX0qa0GKDUekm2Gli8xxZug7xv8YlA7KUZHzvho5X8N8SR1dn3Xnr3iGpNen2PGMni79s0/As4hDPkbamQmRvQ== 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=8B74GaCLue7r0Bt62+R38Fa8FABO8o7zSAGbPu6YmJ8=; b=y0Vpbu3Cy/AKjjkD1pIOpE7UhXfUZBkqoueJHfdbkOJAMGCulw+SD+sn+9xtkzgEy37Tg4Zi7MebeU6Caeoh6TvZqY6ZxufrxJaUQV/IdSP/GGS8q/8eVOF/PTC89ITjGapk8zRudAuXMERG0vvEnvmAhduFFNeXaVjN5My3cns= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:09:58 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:09:58 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 06/10] tools/testing/selftests: add mremap() cases that merge normally Date: Tue, 22 Apr 2025 09:09:25 +0100 Message-ID: <12c20c5d02c8f7e6ac6f5b581b6237fcf9e9d7ca.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0511.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:13b::18) 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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: e8166b5b-f154-4db4-ae3b-08dd817512d1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?GhugI1XGKIvCuhHkBevoju1bp+Gm0hMD4BGURy0kaZcLvKrV/624gReuY5s2?= =?us-ascii?Q?IAcbc5VLvZYf+umH0do1qhyWmDodXL+OOzvCvopZkTLw3hXr5t/N168RGNTA?= =?us-ascii?Q?ZnQquaRiumlg1OVUmZ78qHBX0VMvEhsq9BTir1dl6XruLLkZQ+3IKupu8PmN?= =?us-ascii?Q?5m7dzgDQhZTJNYr2Y9XBDPvW4hcH0FZINBxWZABGV9qtZNyr3IcL88NTPfsh?= =?us-ascii?Q?JwL0F3bU99YSZqEN6IK3teLd8k8u3/QaxlaOkOc9U2kTor/lZ7wRPIh1BAOB?= =?us-ascii?Q?Y9tC4eL8dNQ2dIVb7mQUQWqR++4X2tXCCzSzCUWEj6E9kDFDAhrUuQV1x6En?= =?us-ascii?Q?ZoKKFo1QvUAEStsl9kqEcLT59hSha4flDVPJ+RuxQTIYj8fzw+LhiFKb8t0f?= =?us-ascii?Q?YlDuSlLItvs8wMLy/w51V5lb/YPqsoiz/OX5yWapgTRHyw/loAWNHmiRd1dJ?= =?us-ascii?Q?d98O6g55GiVsmjtDzs+DcjMzaXEivJ8PPUtT57vxisqyQly6cU2akqoxvOiq?= =?us-ascii?Q?9dxSOnvT3JpnTK9qonmJfB05IISnLBghyQBxcbuov8C6PF/GLtJk8Us2bFY8?= =?us-ascii?Q?wjeolAINWrcvlzwN7Y+VhZILEIuP+EcVCNkyVbyocMENhHfw5oLzjDSBtm+s?= =?us-ascii?Q?utwIeArsTuV9rMIsDPJczucLMTvT7Og0gx12lIfr/6XUOcemR+CdAaywMarF?= =?us-ascii?Q?KgsorywaOVEhqOZPvenLmjTJMxyfSA+UAjPVfrMoeGbuT7XutIVeVA7rslR8?= =?us-ascii?Q?GmSEFogS3oTcwfhPH/KULQnzEX/VD+K/Lvr+nz6JYbdyXY8F+Er7oHwMClHS?= =?us-ascii?Q?xhuRypdRg0t/Nphk1f9B0jyIHrThwvfyfKoomJIzAFnwVyqRss9JS3WreSmp?= =?us-ascii?Q?WznDjJQSPHCDlZCb8tuBP2biq79EyySy6lsoipKO8Ntdy7YDHyxPh9bVpBRK?= =?us-ascii?Q?/IoBjqVY+SWnRzlHXyUIBMzadGSk6TRx2wzFWjmvfY0xKgv8bBNZptTxcl2z?= =?us-ascii?Q?aOQvMk71Hoxi/DfOInMFP4l0J4YGsvH8mQaVPIdKdUXVgu4eg5oQ0o/iDzM5?= =?us-ascii?Q?mqX5aVF38WRiFo7+sy39FH1kO+tKefsPoPFY62rNyy1iis5lnQWR997CnwO6?= =?us-ascii?Q?VYAWs3VNIi8xE05s3CoTfyFzKdrfbLT/yePe3DXcooCvdEvqcg72KYU6E2AG?= =?us-ascii?Q?JcIAgJouCHFSewMkaJSb+Y+yX/D8lmG1XZoHoxIkC8QkgGiVwLj+j0t8cvKR?= =?us-ascii?Q?/YhnvWrJDcm/AIlEnnEZprwsmh+Jj1EWh1jAdikTm8n56PFF9fW6FIkKJCbd?= =?us-ascii?Q?XPszuEPCoHm/LKktj3hjLNr27ezDwKhP1y5FV/3ZQMOefoWF4iUfp1Us8lBO?= =?us-ascii?Q?olvPBe8k1Jk7IFTJ0OeRCKfTJS5C2rIgFrulFA7x6WBxl4gVjQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM4PR10MB8218.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?X3SnpuLNAhGGI5FjJ2bSjJJg/Lo/jYu5OBvRJbRSiLI6FPJi1llNvHrqppGB?= =?us-ascii?Q?vR81K4b1DXYYktDfR+gZ4nT9SrwhaK37yZU/om8h46qFa3RaoISx/oLns6tJ?= =?us-ascii?Q?AuT48q2IMtsYXPA2kAU4vACNTLpZtldWRq156g7pcG8J89rlEIp4DBOu3Vo/?= =?us-ascii?Q?uBPwC6D/vv88W5awBeBdTdP47bFD2M0x3YgeHLHqh/X1OWlJZYd7x74Bjwj1?= =?us-ascii?Q?wHVFoPUut7g6v3+uPUPwHBiY3CgzN1BTUm2r9BahWy1PBvjB46PkJkGPkXVr?= =?us-ascii?Q?nrLIDhkcxKJFdrxa2QqYPLfqK1ECGTPNm8+TyVy5GcqgcQ7yXzN6aL9MAdo8?= =?us-ascii?Q?dtG88/lSZTklXXALvVhi4XLk/M2SVQmfql9aogt8t5ERrM1PW1CYKjsJIx1S?= =?us-ascii?Q?V/JItmmVCUCIm73xmKtRluG8SZnizrvklBmCWsRxviQFrccJkoOkjO+vs7+8?= =?us-ascii?Q?XULAYKhz5HmjgpAKE1KyBqyysdKWGe5h5ymZ8ZA3j80CWVmCnHPWG07vC/j2?= =?us-ascii?Q?C+ElBA8nfpPe63rQzGg2tpeyRVE47OeOJ22Agobexitz0OXPNOnXFD7h/QyZ?= =?us-ascii?Q?ow8ctLpvpV5qAhnd4IB+sdd7aVhbVbNo18S/gRQT8g2cnOgC4F58rBaBEqVY?= =?us-ascii?Q?eITX9wkSn+jFKZaIUM/p0MqBJ6XyyEOfiyZR6rjXG+5fcouOoB/fgm4UmNnC?= =?us-ascii?Q?1tZC/Jwi9Yycn7ZJW8pKR3Mkei8b6gYgkjjrMX9AlOuWbsPjd0r+x5IKWRth?= =?us-ascii?Q?H7Cq4zfl+ZfXUStBD7YIqKFrfGjC1F0S9027aRHejCQ6n7cwMe/jlvar3AnX?= =?us-ascii?Q?dA65ZYO6cCN/E/uHkk+oumPXL4g0SXnrB3vMbfFMh+6Am8i/Ps87pzrT9lBR?= =?us-ascii?Q?xbxDUQHyrLuoNuL95d+/cH5ElMGoUpquLsBsvDOjfYvBzODcjSVZGVQNO7Md?= =?us-ascii?Q?OCvsNEmZtgvUbIo9fHANNGAhpg9dF021ABo6SR2lOMSIixpSrPcf2cJiN+eC?= =?us-ascii?Q?Px7Yx0dRji03/h4Viy/UP+X5lN6ramVYdqWb5s4xpQBxIEL4lMXvJtvod7XP?= =?us-ascii?Q?YmBwbfxuX2nviq+fn9OUTD34Rt8BnjUTxD59dVCD1z3ypWsqEkIC+QuL/7Av?= =?us-ascii?Q?/A5A7eaQ4Pj9cNI/in8HKIY/bsnkQHY4Mh3Kbaf/YJkPM2NQHDzoppDr9+C1?= =?us-ascii?Q?CkzJyiXaOwLsR6AkrU+DCNhlgi+Hd8J61Nu2JPwr2JZHqKVJYhlPmoksvxjf?= =?us-ascii?Q?v6aZLPMpv1MTMLvcROccdHvLkfI+eHBwg2k37l7vRzWoGSg2yPFgNyM7wMHB?= =?us-ascii?Q?fJgHJEPZ9lHdFXZEntlK1/O5roqKw6pOK18fBWlQqKMBJg2b5b6yX0DFlcW3?= =?us-ascii?Q?wjzNRlkc7JSvmqBPOULmfy4AZehUT4sQ9g29uCAiZ4D4fO73hpxs4CS09uRD?= =?us-ascii?Q?xsLcMvN1SnPvPs6vGfY3eJ19/zUnF63icpU3e2B9jTG20ksJd8+LTscbbzvc?= =?us-ascii?Q?cmOmIT8iw6G8vuRr8jIYmbXO7XzJBxbue1OkNHDbKwsV+akFcKh6g/RtodN2?= =?us-ascii?Q?AxluzwEMswWVhyIhvitFLnjaxm+4VeggsOUNiqoJDegOoDp+fncJ9NN0IQyb?= =?us-ascii?Q?8A=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Dkwz8P0e59sVYkM34TeHfmcc3RgDSb32gOyGrfQ/u28cOEpONJBycJd1du1f9si3Wu3HAOEBOymtW4u/cfzu0LcFGFUl7ie4VawA6FqDZjHmfYc+r0YPTttHzDeKur0/XtQvKiAa3j5ANcHIJUijMoYYwVLMmvgJUsrSeWJyY471ybweL9svEkwJSCnb1R0Dncium0oXdcsMSMWbQe9eLbt3uhlMrdV2nN5aYIok9tJfqJ1OGkzT/UtWWLJ9ifOmtIw6WihWBoFZ5VC6ak6JHEPe3i8Do9znP6v8pz13TeLABUB8sJGLgJR091f9dkhol/d6SLEx5Br9o+4KJT+aMi7aMwEZ4xBCRYprwPo09XXc0YcN3ZUCwhJhUQpYMFDznZ+ucxYKrJ3ZeQKwHBMYJljb2S4XmoIGqzR/VvYpEfyXKXL/55Fv/7aGrrvD4xS5s5DJz+1yhWvY6d6UjvnZodElAqVL2HBNX9PomODFqkSRtLogoxqbfKW/1q2vYEOXHK23EFcyPPth+2aIVLBVXjPWTyynLyraXBfpJGV/JDcXEwp0zzYMnxbdmQDwbM0ionwCzRX/MSINVLO0m9sdrnPQzbP2sZPcZqKrgt9J12k= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: e8166b5b-f154-4db4-ae3b-08dd817512d1 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:09:58.5215 (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: EcRvjvzAqlEi8Hm8jbppKEKP94wvxCkNji4BIXt7DJgDePbzxn0FLOIFNroajAON1qlmLH2egdiQ4s63QmjEjjQeIn3Jn+3JgV0oUaA8w0Q= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=906 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-ORIG-GUID: d5Vc-6VTv6s8vJnTEXHZyUnzzLDKERCD X-Proofpoint-GUID: d5Vc-6VTv6s8vJnTEXHZyUnzzLDKERCD Content-Type: text/plain; charset="utf-8" Use a direct system call version of mremap() as, when we move to using MREMAP_[MUST_]RELOCATE_ANON, the glibc wrapper will disallow this. Also import linux/mman.h (which will amount to the local tools cache of mman.h) to enusre these header values are available when later added. Then, add tests asserting all the mremap() merge cases that function correctly without MREMAP_[MUST_]RELOCATE_ANON. This constitutes moving around unfaulted VMAs and moving around faulted VMAs back into position immediately adjacent to VMAs also faulted in with that moved VMA. By doing so we provide a baseline set of expectations on mremap() operations and VMA merge which we can expand upon for MREMAP_[MUST_]RELOCATE_ANON cases in a subsequent commit. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/merge.c | 599 ++++++++++++++++++++++++++++- 1 file changed, 597 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/mm/merge.c b/tools/testing/selftests/m= m/merge.c index c76646cdf6e6..746eacd0fe70 100644 --- a/tools/testing/selftests/mm/merge.c +++ b/tools/testing/selftests/mm/merge.c @@ -8,6 +8,7 @@ #include #include #include "vm_util.h" +#include =20 FIXTURE(merge) { @@ -20,7 +21,7 @@ FIXTURE_SETUP(merge) { self->page_size =3D psize(); /* Carve out PROT_NONE region to map over. */ - self->carveout =3D mmap(NULL, 12 * self->page_size, PROT_NONE, + self->carveout =3D mmap(NULL, 30 * self->page_size, PROT_NONE, MAP_ANON | MAP_PRIVATE, -1, 0); ASSERT_NE(self->carveout, MAP_FAILED); /* Setup PROCMAP_QUERY interface. */ @@ -29,7 +30,7 @@ FIXTURE_SETUP(merge) =20 FIXTURE_TEARDOWN(merge) { - ASSERT_EQ(munmap(self->carveout, 12 * self->page_size), 0); + ASSERT_EQ(munmap(self->carveout, 30 * self->page_size), 0); ASSERT_EQ(close_procmap(&self->procmap), 0); } =20 @@ -452,4 +453,598 @@ TEST_F(merge, forked_source_vma) ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 5 * page_size); } =20 +TEST_F(merge, mremap_unfaulted_to_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* Offset ptr2 further away. */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault in ptr: + * \ + * |-----------| / |-----------| + * | faulted | \ | unfaulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr[0] =3D 'x'; + + /* + * Now move ptr2 adjacent to ptr: + * + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |----------------------| + * | faulted | + * |----------------------| + * ptr + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + +TEST_F(merge, mremap_unfaulted_behind_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WR= ITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* Offset ptr2 further away. */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault in ptr: + * \ + * |-----------| / |-----------| + * | faulted | \ | unfaulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr[0] =3D 'x'; + + /* + * Now move ptr2 adjacent, but behind, ptr: + * + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |----------------------| + * | faulted | + * |----------------------| + * ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &carveout[page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 10 * page_size); +} + +TEST_F(merge, mremap_unfaulted_between_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* Offset ptr3 further away. */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + + /* Offset ptr2 further away. */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault in ptr, ptr3: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | unfaulted | \ | faulted | + * |-----------| / |-----------| / |-----------| + * ptr \ ptr2 \ ptr3 + */ + ptr[0] =3D 'x'; + ptr3[0] =3D 'x'; + + /* + * Move ptr3 back into place, leaving a place for ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Finally, move ptr2 into place: + * + * |-----------|-----------|-----------| + * | faulted | unfaulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge, but only ptr, ptr2: + * + * |-----------------------|-----------| + * | faulted | unfaulted | + * |-----------------------|-----------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr3)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr3); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr3 + 5 * page_size); +} + +TEST_F(merge, mremap_unfaulted_between_faulted_unfaulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* Offset ptr3 further away. */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + + + /* Offset ptr2 further away. */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault in ptr: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | unfaulted | \ | unfaulted | + * |-----------| / |-----------| / |-----------| + * ptr \ ptr2 \ ptr3 + */ + ptr[0] =3D 'x'; + + /* + * Move ptr3 back into place, leaving a place for ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Finally, move ptr2 into place: + * + * |-----------|-----------|-----------| + * | faulted | unfaulted | unfaulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_unfaulted_between_correctly_placed_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr =3D mmap(&carveout[page_size], 15 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Fault in ptr: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr[0] =3D 'x'; + + /* + * Unmap middle: + * + * |-----------| |-----------| + * | faulted | | faulted | + * |-----------| |-----------| + * + * Now the faulted areas are compatible with each other (anon_vma the + * same, vma->vm_pgoff equal to virtual page offset). + */ + ASSERT_EQ(munmap(&ptr[5 * page_size], 5 * page_size), 0); + + /* + * Map a new area, ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr2 =3D mmap(&carveout[20 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Finally, move ptr2 into place: + * + * |-----------|-----------|-----------| + * | faulted | unfaulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_correct_placed_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr =3D mmap(&carveout[page_size], 15 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Fault in ptr: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr[0] =3D 'x'; + + /* + * Offset the final and middle 5 pages further away: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | faulted | \ | faulted | + * |-----------| / |-----------| / |-----------| + * ptr \ ptr2 \ ptr3 + */ + ptr3 =3D &ptr[10 * page_size]; + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr2 =3D &ptr[5 * page_size]; + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Move ptr2 into its correct place: + * \ + * |-----------|-----------| / |-----------| + * | faulted | faulted | \ | faulted | + * |-----------|-----------| / |-----------| + * ptr ptr2 \ ptr3 + * + * It should merge: + * \ + * |-----------------------| / |-----------| + * | faulted | \ | faulted | + * |-----------------------| / |-----------| + * ptr \ ptr3 + */ + + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); + + /* + * Now move ptr out of place: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | faulted | \ | faulted | + * |-----------| / |-----------| / |-----------| + * ptr2 \ ptr \ ptr3 + */ + ptr =3D sys_mremap(ptr, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr + page_size * 1000); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Now move ptr back into place: + * \ + * |-----------|-----------| / |-----------| + * | faulted | faulted | \ | faulted | + * |-----------|-----------| / |-----------| + * ptr ptr2 \ ptr3 + * + * It should merge: + * \ + * |-----------------------| / |-----------| + * | faulted | \ | faulted | + * |-----------------------| / |-----------| + * ptr \ ptr3 + */ + ptr =3D sys_mremap(ptr, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &carveout[page_size]); + ASSERT_NE(ptr, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); + + /* + * Now move ptr out of place again: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | faulted | \ | faulted | + * |-----------| / |-----------| / |-----------| + * ptr2 \ ptr \ ptr3 + */ + ptr =3D sys_mremap(ptr, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr + page_size * 1000); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Now move ptr3 back into place: + * \ + * |-----------|-----------| / |-----------| + * | faulted | faulted | \ | faulted | + * |-----------|-----------| / |-----------| + * ptr2 ptr3 \ ptr + * + * It should merge: + * \ + * |-----------------------| / |-----------| + * | faulted | \ | faulted | + * |-----------------------| / |-----------| + * ptr2 \ ptr + */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr2[5 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 10 * page_size); + + /* + * Now move ptr back into place: + * + * |-----------|-----------------------| + * | faulted | faulted | + * |-----------|-----------------------| + * ptr ptr2 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + * ptr + */ + ptr =3D sys_mremap(ptr, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &carveout[page_size]); + ASSERT_NE(ptr, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); + + /* + * Now move ptr2 out of the way: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Now move it back: + * + * |-----------|-----------|-----------| + * | faulted | faulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + * ptr + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); + + /* + * Move ptr3 out of place: + * \ + * |-----------------------| / |-----------| + * | faulted | \ | faulted | + * |-----------------------| / |-----------| + * ptr \ ptr3 + */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 1000); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Now move it back: + * + * |-----------|-----------|-----------| + * | faulted | faulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + * ptr + */ + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + TEST_HARNESS_MAIN --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 115982550DC for ; Tue, 22 Apr 2025 08:10:15 +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=1745309421; cv=fail; b=nhJPTK9r72daPmVhMMNZjgNmaEoA3ZnyqnPxcQVosxBR9Xwph+CJS/++JgONSCy6S/Plw+3xEgv1yYgHuIDfkOKTMK67MSWqixhm2KgPVS3o2b18+CIbkMDGHgjfZIWpLwWlIaYYRc2P1yTYCeesi5AHPD02EvcQnpTgCCMULc8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309421; c=relaxed/simple; bh=Wa2teae9la0jj3Husfjg2vd/LdfhSYSQ0U+GUSWPDDI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=LdPZibOBi+MWD+XXzwsLms2LI0IWwUUyj2PkhPuhz2kgnaE5QbxfWgrWcWXYd/rFeI2r2udjsneaaruf8hyDPqMpHlkkTlWsLq9vVtrM3pEpmouX6LJrvYA08bsWELoneIQ/GlaQU8sWc1wyY6sz76k5BEJjRGeXM3RFqRPSiyo= 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=cb3F3Eeo; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=o+Lx2IHb; 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="cb3F3Eeo"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="o+Lx2IHb" 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 53M7NFmo007630; Tue, 22 Apr 2025 08:10:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=r1DKRf/xvB45NQsXWqQvdJTqvAOPSwcBvqRSoBzOBg0=; b= cb3F3EeopsL3jyuWjMlWBQPgZbYxLuFprc92z4JyvPmOQWTuUKbSu/3/hLyfBWV/ hZnSOEMwYy87VS6Qzr6YK6sxY6P1/T3aU/INipww6EH4iXUhkz6dDHsXtat+mTpX a4YDLzwbHPQeH96sf2+wVL5t9cP/QJL9s00K9YpOniL+iXfWuXQdn19ZInAe7Sav j56FopWnrBOg4/DCnxJB0goOi0aBzL5EH5S8MfTQc2QsMKiWqUPeLcm6398RZ8nO eVMtC1ybRy5kuIHgJ4Ppw8Yls9FHGT8aQQxdAXQuIB/8FeOMLPwGXw0wmqGHBZZY XAvWokQYL/etcLFkhTJ+sg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4643vc414k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:03 +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 53M6XkWu021143; Tue, 22 Apr 2025 08:10:02 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010003.outbound.protection.outlook.com [40.93.10.3]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhskd-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:02 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=S2HyO/SKG3dIT8sTI70yQEuNI2X9crfZoy0eJBT/YLDbF2qq4FcraDKb2weXvlztwFy17BUY2Ka9SSGRQDz8EOOKqtHw0/o0c6tXPvu5az1LXoexej/IE1CSOumKjuu4dubwx3bkyTIWEf1BmiFhNpVaFwFSNASYOc7lKWjpw5coy+hlOKBdcWvep3KQlVkzWD4rtb+tAlXOWVOH5gWWk1IzC3aytcExiHSxT4KQffNVqKxrNb6DL91yIMTrjIud0vBOL+xYwmNKiBPZM68jpzC0SS88QleBMtYctjJwqxFI41t2RcZCJ7ENGj/+96sj5Uqdhm7rm8VgSUrdORLygw== 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=r1DKRf/xvB45NQsXWqQvdJTqvAOPSwcBvqRSoBzOBg0=; b=BykyH4Dg9S+o5uh9J9K3fhV9fmTO1cCux3sLckKFStEicyuOXgF/GDiDdFHfbgcSMLa68K5Gl4IQq3/vAAZqOn8gtrHYVJxeA6J9JFtquKTi8AgUc1/Uw0vERjX3YF9jByMzzXu0fUeN783Pzc3ko0Iza15jwrcKgIGRUTP0I+rXQ6K9vLenIddqIHqJhc+KKVhpL2GbJAe0OhlTiFmuQG8b3sG6oASkrH9vjYqRc4xY13eZixN8Kmjwe8sNoPcPyHGNoQh2uvDHwQkZXBQAp+f2Ze+5EOAWa+RE1yYtEHx6Xc00yzAGbXcjIIjde1LQEWz/F35Q8cITFQUWB9pR2A== 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=r1DKRf/xvB45NQsXWqQvdJTqvAOPSwcBvqRSoBzOBg0=; b=o+Lx2IHbrPE5Q9tfbdBrallikjNFliCkvLhqKezRGA0NMdfOEJ9MWnt55QKu07MH6KGQydHQjWBP5JpHusbCcuucZ8HtUKpksJK/Jx639Yzb2YARQBod9gFHg/cOndtFB5eBFqmCE/pZjSCQ/wNTVf4ecLlRwA9z7C+Elyi71ws= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:10:00 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:10:00 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 07/10] tools/testing/selftests: add MREMAP_RELOCATE_ANON merge test cases Date: Tue, 22 Apr 2025 09:09:26 +0100 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO2P265CA0149.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9::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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: 04af1d26-60b4-41a7-a915-08dd8175143a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?civrkv5wfw3vkPEp6tv4rXKLZYHZrTMhFHg+m+FEQnmiFaSDWaTGWe6UKUTc?= =?us-ascii?Q?TmiYWaLqVRABF5J4xj5RUhpY50dn9juz2XXeDcpTAjRqyT0PDL95GV4RsaxM?= =?us-ascii?Q?WcdlnLbgIZN53QVdUig0inKeWw4+1HKGdBmXIYWGEYBiYn5GNKFbJwbDsVuQ?= =?us-ascii?Q?m3PEYDIm8rDqm7xKG6EZu+pXamNH8/gGiR35g8lzm2/DQ14Tvp8pJutiCfZi?= =?us-ascii?Q?k3etdiXZ85dm72gFh4uad2LRk0vpAc3GIj2LKM4fIfFtbPAUU+ShjeFMR8wM?= =?us-ascii?Q?3sxZ6pQgZxoMY5Lu5S4MeSM/1pXYHilkHE1EXk4dqa+R3lFvKRkTsI/FOaKj?= =?us-ascii?Q?krJNcBjr1G1xWC1phP48SNWfZC9VDZYpXIWtCIWrzG0lWAPu9ds8L0HEy1aW?= =?us-ascii?Q?KPbybkiN50LWiGNdRiNRHNO+CKOAzIJol3emruxT2MTJ5yDRGuD/YzjE1jOM?= =?us-ascii?Q?QMBzfO1WyyYMV5ovts+WkmanhbxPcW+Q1laQhKr+LOOE4KpA3Mnawg5ZJwD0?= =?us-ascii?Q?n+CCI99UMqRxwFXArPF0ZLe6RmGn6HiPRSORqKpkOhSLqx2diCTYSxM2aVNQ?= =?us-ascii?Q?C+dl/XS9voLogW20nyH8vBVG1mEjp76zrKl3/3EMLcKjmWoIO7XxwAELeHse?= =?us-ascii?Q?rm4YkVgx/6/+2ScRO75l1d4ja/uVjrQt+zxpCRWcN6Hl7I6I6nfCgHcoi6Qo?= =?us-ascii?Q?4xKF+mi0zmRF9QPg+GAhAX4OvKLMNa2rbdlrKVuEEEtscxoWx5kyeUyjLt86?= =?us-ascii?Q?pa1fYnIN2/ImsHhMWOuDgir/dnTJ6S5fDq82ebeaSD0LOA/S2w2i6v7kg2qt?= =?us-ascii?Q?KT38zWTeFQQID6YltHyCI+ArgUdsi0J1CNmZC21ctDqJ2ipDgvYu9k2w6x6a?= =?us-ascii?Q?uCXox/zR5t9Mh6KDnQiG/iFUmt7gZG6s6EfQ2W+thqztWEQ56HFX5G3HfFaB?= =?us-ascii?Q?FbzgAQnKT0hd9Mdea/KXYVptKMR0W8BUudlE35V1+fa+lsb4USc/9RwL665w?= =?us-ascii?Q?dZ8fs+rMLts4g9eV2fOUrkMmbC9VIAf5SoJpVUf1Rymi23XqYXPY7lLdtcnX?= =?us-ascii?Q?r+9J7vAEnVSnwVvalQaXUMU82PnnhYyh+/oMUb4fENL1lVTX51MUvHUt48LR?= =?us-ascii?Q?XfSa3a2iLUE/zETqwKyxHBaAYGI0nEi9LTu1x+nFEy32KJwymKPMbLxdtjJX?= =?us-ascii?Q?1GXyQMNsBUXCPkboVK5dBo7gQgWxXuDdOgwXGhcf7wroFwSj5J9mDYzNB1uq?= =?us-ascii?Q?oPm7tbhbLiGHYypauVPkMOLzoTvrfGryvovSL2yJeIJGZTuXIz2hRGxOnufk?= =?us-ascii?Q?kEP/TDt9hfdnP9LBFZUk4oKo3JkEUsBX6Fjye450nyV4s6tcusJhC4UDikJG?= =?us-ascii?Q?YQl3IMxTnrM1B5n/TzjuMQ1iwezSZExCNM/ljhrLRkplszS2utTHDQODpz3a?= =?us-ascii?Q?1t3Qm+nDrV0=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?oub2tRdoDXDKqTzS33pKQ815QiCnapib0ytxZpRQ552QM2TrCc7XYlJB+xod?= =?us-ascii?Q?cpY47+PM1QW8/rhXAMKL9/3gpDLBsaIe5Y/bXS3OI2gRK6WvTeKQa9+mLqYW?= =?us-ascii?Q?Q6fiCAhJFC9USrZK5VvY7YKJjYJUp8/cTGz9e7jAMzApl78V8TMEELVJjepM?= =?us-ascii?Q?YoaFOFe2ZBY+3ExT5xXLqgbMCNg96omkRRXdKkrvKd4y1J88AKFCGNctE2qe?= =?us-ascii?Q?/4W69oDgEE8Z75icHzV3rtEGRNzIrlPoh0BeC8uElCDylNVd9s9wQ8oD3zhW?= =?us-ascii?Q?PMjx5j1Df6u3MNDFFVMVm+JBn/1QzOqpi6vhbN6k+Y5WwUnFLlpb8UG54UIT?= =?us-ascii?Q?oMbeXCpmdVhwqKR5YGJuO5YeuiN1egvcofAJwgtMyPWXxMgf6m3ypzEx3Col?= =?us-ascii?Q?6n1gLAuY83Bab3lS3/AAYgClI5Ru34hdQfnS9cjzBxoFDK9Nq11BJYvsfHUz?= =?us-ascii?Q?fgMTl7v2654jvfmUNcGY4NTDrja1yhEmcKCw6DKDtsx/mvQ41Uaio7bWrxit?= =?us-ascii?Q?0ZbqRdowDwhZYfJyN0mBivvEPmF5Y36Ib+YyE9mMnnHu3V2ySXKiymXMPfo6?= =?us-ascii?Q?sBEBWOQ4BtAToit1vIkoJyGAAdVJSokInlkPaYthfJaqwWReBaoFh494Qn2L?= =?us-ascii?Q?TWEaQjGzDU6vRXebS0a2gxa30e9Z7M1cvNr5Hr+9fiHYS7/7sSl8Gb5JTQWW?= =?us-ascii?Q?Q7L/hRWnQeLUa1JwNU73631V+ayunOwZZQj2FXlEtlllBwHZwtHn/ssCY5GK?= =?us-ascii?Q?lD1dsqBd1fGfLUxIlfp93snTlR7oB721mCvgQTlwWCeFy24CVoR6rw+8TyDz?= =?us-ascii?Q?u8ZfuaGQgAKxMnb2O7jNvYrmCTifQXy64jUvbHYJF/SYlzlbME7KmDOKDd08?= =?us-ascii?Q?QWEkCIf3jywuIb5PE4+2mBTkAIJ6HkiJKd/tTgtKsF3hBQHG7Z3jawdSyQmN?= =?us-ascii?Q?iHKBUwef1uQXzyspLMvrDIZvHDLkranEETOfi2UmuYABeJK3tgkqMWuSbmMh?= =?us-ascii?Q?m4sYAR+5OBlKq+KP32HYolStyTMyBszC/k7pyF8WUF8uajhLaFljMhUHqjbj?= =?us-ascii?Q?Ng6ApAVlZAB861JwA0aHf4vqnXiV9rYxoHzCc+DPSUEC5qKX7bG3as2kXCY2?= =?us-ascii?Q?laCl1krlbG/RibN2TnLp622BLfnkggJsc9Tjz6OFWWxY4Rffyyc00ccHfqbR?= =?us-ascii?Q?13ZhPimnbFArze2Y2RyN+5g0P4iSapeoke1NktCxytTSeM/yCppGcBbQW/og?= =?us-ascii?Q?6DsQV3mIKqFsnnXDM4ln4EDRjUKVIC6HpYml4zUNKD2LSQqOXvE0A4QMqqDS?= =?us-ascii?Q?ZqAjc60gBsZQmCW7v+lVhMJEjVEyvIDE3Xn4E5wiHOusVRCZuJK5vKQZh296?= =?us-ascii?Q?7mOlrL90aK7sQ+RcGovkL52tqUq4Nq/wDM/Ue9Kaai+GFJQxAPQ/C6MEZiAF?= =?us-ascii?Q?Bed6GQk/E8Lbl823e9N6T1WW/cLunWpdmFZlIpEblQFkfVi3P913LdGp7KAs?= =?us-ascii?Q?51tdSc7vtKWLgEPZxjrX7jPfFWqQ/dvchIhyMQdA2YYCzXqLai0/Ry9VfRdX?= =?us-ascii?Q?+xmHv5GjkluIs3kGvv9TzPLZQ2FvscXDy/upX4G77qk3GkwwL0fFBgb9O0dT?= =?us-ascii?Q?Jw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: Bk033KJmJRZ8sZ1vbCKUrZmWTlUrbmtIIILX5jY0zrOZF9yVWGicVAKfh1LZFVIjtuGbO3qaICXbziDNgjr45dsS/mxJyinaxATUm8I5eX14xXF1PAuuYv23qk0iCsUCdxxWyQzWP3Xb4NDyD7sXzeuod54VZx+w6RqV2K7LO1of+aXnKDvmxBtlYZUy+sk3nE3GXXkJ4VcyASNoB3SM63LxLzagRcGp+b+o2phOJqTFC6WTQbINVWzYVvhBkilz4vNygsY/bX74wmufnJgkuQx2fylhZPtZOoyhhM4xfbLdBjvrMTueGJuk3edBRsAFjuhiD5WTihSWYolk4etfgXM0+Ju7oSt17lzBqg3aDkOe6jGphkV09YmbBlugCnS1yBUzlm6lTNDg8yj5vgZJX0PpX2iF7osADq29eqL1KbvEyGkrFjjpOj2OImuIOF2gz5NjnNTKvPBgAfx/2nQ+Zqo0i98pDhgGNyXiDC3brbZ+x71iK1cFhbXABO1oXn24vasZ3FGWQtSll9QunFuLIgeXjzOqXhF6mhros0FyA+LmnSOvLyqG3r3op5q4BYCL8xEhCI8FdRJkDVsQCve5xgCnGpON34W2Mx8lyK6K2Zo= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 04af1d26-60b4-41a7-a915-08dd8175143a X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:10:00.8759 (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: 5oQEPzggU/v5H5QJ4N+LdDBaCVPlKkF+ivu96YgVuIFP/GEx1yz6Kfe+uPfuP28t9rCCrmUqTZwfpaRTBR3XOQhLyO90wfZrBuhez5X75Js= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-GUID: LhnpZN3W42X0vbKSpkvfq-_AXyPs4aVv X-Proofpoint-ORIG-GUID: LhnpZN3W42X0vbKSpkvfq-_AXyPs4aVv Content-Type: text/plain; charset="utf-8" Add test cases to the mm self test asserting that the merge cases which the newly introduced MREMAP[_MUST]_RELOCATE_ANON results in merges occurring as expected, which otherwise without it would not succeed. This extends the newly introduced VMA merge self tests for these cases and exhaustively attempts each merge case, asserting expected behaviour. We use the MREMAP_MUST_RELOCATE_ANON variant to ensure that, should the anon relocate fail, we observe an error, as quietly demoting the move to non-relocate anon would cause unusual test failures. We carefully document each case to make clear what we are testing. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/merge.c | 730 +++++++++++++++++++++++++++++ 1 file changed, 730 insertions(+) diff --git a/tools/testing/selftests/mm/merge.c b/tools/testing/selftests/m= m/merge.c index 746eacd0fe70..8d70c24b4303 100644 --- a/tools/testing/selftests/mm/merge.c +++ b/tools/testing/selftests/mm/merge.c @@ -1047,4 +1047,734 @@ TEST_F(merge, mremap_correct_placed_faulted) ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); } =20 +TEST_F(merge, mremap_relocate_anon_faulted_after_unfaulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Offset ptr2 further away. Note we don't have to use + * MREMAP_RELOCATE_ANON yet. + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault ptr2 in: + * \ + * |-----------| / |-----------| + * | unfaulted | \ | faulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr2[0] =3D 'x'; + + /* + * Move ptr2 after ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_before_unfaulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WR= ITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[12 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Offset ptr2 further away. Note we don't have to use + * MREMAP_RELOCATE_ANON yet. + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault ptr2 in: + * \ + * |-----------| / |-----------| + * | unfaulted | \ | faulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr2[0] =3D 'x'; + + /* + * Move ptr2 before ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &carveout[page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 10 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_between_unfaulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Offset ptr2 further away, and move ptr3 into position: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Fault in ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | unfaulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2[0] =3D 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | unfaulted | faulted | unfaulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_after_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Offset ptr2 further away. Note we don't have to use + * MREMAP_RELOCATE_ANON yet. + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault ptr and ptr2 in: + * \ + * |-----------| / |-----------| + * | faulted | \ | faulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr[0] =3D 'x'; + ptr2[0] =3D 'x'; + + /* + * Move ptr2 after ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_before_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WR= ITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[12 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Offset ptr2 further away. Note we don't have to use + * MREMAP_RELOCATE_ANON yet. + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault ptr, ptr2 in: + * \ + * |-----------| / |-----------| + * | faulted | \ | faulted | + * |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr[0] =3D 'x'; + ptr2[0] =3D 'x'; + + /* + * Move ptr2 before ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &carveout[page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 10 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_between_faulted_unfaulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Offset ptr2 further away, and move ptr3 into position: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Fault in ptr, ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | unfaulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr[0] =3D 'x'; + ptr2[0] =3D 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | faulted | faulted | unfaulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_between_unfaulted_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Offset ptr2 further away, and move ptr3 into position: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Fault in ptr2, ptr3: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | faulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2[0] =3D 'x'; + ptr3[0] =3D 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | unfaulted | faulted | faulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_between_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_W= RITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D mmap(&carveout[14 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Offset ptr2 further away, and move ptr3 into position: + * \ + * |-----------| |-----------| / |-----------| + * | unfaulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 =3D sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, &ptr[10 * page_size]); + ASSERT_NE(ptr3, MAP_FAILED); + + /* + * Fault in ptr, ptr2, ptr3: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr[0] =3D 'x'; + ptr2[0] =3D 'x'; + ptr3[0] =3D 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | faulted | faulted | faulted | + * |-----------|-----------|-----------| + * + * It should merge, but only the latter two VMAs: + * + * |-----------|-----------------------| + * | faulted | faulted | + * |-----------|-----------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr2)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr2); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 10 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_faulted_between_correctly_placed_faulte= d) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr =3D mmap(&carveout[page_size], 15 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + /* + * Fault in ptr: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr[0] =3D 'x'; + + /* + * Unmap middle: + * + * |-----------| |-----------| + * | faulted | | faulted | + * |-----------| |-----------| + * + * Now the faulted areas are compatible with each other (anon_vma the + * same, vma->vm_pgoff equal to virtual page offset). + */ + ASSERT_EQ(munmap(&ptr[5 * page_size], 5 * page_size), 0); + + /* + * Map a new area, ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr2 =3D mmap(&carveout[20 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault it in: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | faulted | + * |-----------| |-----------| / |-----------| + * ptr \ ptr2 + */ + ptr2[0] =3D 'x'; + + /* + * Finally, move ptr2 into place, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | faulted | faulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); +} + +TEST_F(merge, mremap_relocate_anon_mprotect_faulted_faulted) +{ + unsigned int page_size =3D self->page_size; + char *carveout =3D self->carveout; + struct procmap_fd *procmap =3D &self->procmap; + char *ptr, *ptr2; + + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr =3D mmap(&carveout[page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 =3D mmap(&carveout[12 * page_size], 5 * page_size, PROT_READ | PROT_= WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + + /* + * Fault in ptr, ptr2, mprotect() ptr2 read-only: + * + * RW RO + * |-----------| |-----------| + * | faulted | | faulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr[0] =3D 'x'; + ptr2[0] =3D 'x'; + ASSERT_EQ(mprotect(ptr2, 5 * page_size, PROT_READ), 0); + + /* + * Move ptr2 next to ptr: + * + * RW RO + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr ptr2 + */ + ptr2 =3D sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED | MREMAP_MUST_RELOCATE_ANON, + &ptr[5 * page_size]); + ASSERT_NE(ptr2, MAP_FAILED); + + /* No merge should happen. */ + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 5 * page_size); + + /* + * Now mremap ptr2 RW: + * + * RW RW + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr ptr2 + * + * This should result in a merge: + * + * RW + * |-----------------------| + * | faulted | + * |-----------------------| + * ptr + */ + ASSERT_EQ(mprotect(ptr2, 5 * page_size, PROT_READ | PROT_WRITE), 0); + + ASSERT_TRUE(find_vma_procmap(procmap, ptr)); + ASSERT_EQ(procmap->query.vma_start, (unsigned long)ptr); + ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 10 * page_size); +} + TEST_HARNESS_MAIN --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9BF202550A4 for ; Tue, 22 Apr 2025 08:10:15 +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=1745309418; cv=fail; b=g/EaccG6Zc7mwwIEM9CZYijD3fC//C2G6EDfkpOtpDb7RTTy6r04FHGAp4P7Iwps2zklII/vmEni+AvHqJbw/8Fvn7BsB0+WtvUDYnMRh8H1Ik2RSbyMdw+gzLfjyByVlIuF+cM8B8wK2jpFvkuwMhgKspJLvY3kXFPrGNRExVY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309418; c=relaxed/simple; bh=pPI1vmYeUYrc5+YozPFLzNI5agegrnsYCWVDOXPURqo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=acdrf5kXHsVGtomX2d8y10/X+GMka0zPC5N4qiXBk6w+MIRKShAI3c1DBgaWlxhzhGeQ7rVwQRZtyo055efcn3/YFw07vbcnMdhBXxErDNIOTEj34yNpn/8CLfPwbrvfxy/DdPtmMbph7rtYL3uY8+PxDTDzsr2CieDtUwQzsl0= 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=fPjnal6O; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=Negb915Q; 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="fPjnal6O"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="Negb915Q" Received: from pps.filterd (m0246631.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 53M7Mw7N025390; Tue, 22 Apr 2025 08:10:06 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=55AlPUUE8TEbDwrhF3KgcH9bxqg16uTOTWsEfqmFR6s=; b= fPjnal6OWrIxRC78jO7mdfgy8Uc2zYREVVgvxtkQUKzMxoa60p5Wm7aDD9iNL2Dg UaYrhsG0P8qU8N1rOG/52vifpMCkBaK3iccaWxQb25ZpMOu+pqKCC/tggJOroICj Bo45YR1efLzdlYhf6zwg1DD7GZcr9LrE8bvtxCBo2r+IhLvh/TgDwAVn0cGPUpYa MlumkcW/K3H4G8CJEv05hEyJBuV4MhfMAsOdsPhEyzQ7SeXhKWQiC8KdbfdDo/XC k1vLy0dKuy11YG+lr/ZO+QZ1xxeEFiGF3i035cFlrK/g93Ep6hPxcYOrDn4tj4lq TMPik/bfboxxuNpDiTLzUg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4642m1uyyy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:06 +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 53M6Y260021184; Tue, 22 Apr 2025 08:10:05 GMT Received: from sn4pr2101cu001.outbound.protection.outlook.com (mail-southcentralusazlp17012014.outbound.protection.outlook.com [40.93.14.14]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhsr4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:05 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=C6pqpq8nzcIC81HLQaDKdcGI5dSZ+KPaUkuOsBipNFzPEUKYMFeaxC4W3IK8hA0DpdPvDZBfvYY9VW8BAW862PWA7X5RGXO+kJJdMchcZAXWIDXWfdcLtTO8w6y6PQRn1MNK/nlkv8KdpiumWQmagnZ6sh6GpNrFAtAOSKAUK7pNaiPWR7yz6yX9xULQQERfUfeGw3GOte9JhZr24/sHV92TayGLILr3RpWC/0qoqQjcTzqVeeVaT8IXUvi8wGwMkgjdhpYgJxA0aLUAFWBikCyu9otNnXJieXeHtiTSKbLGYeUazdwIz7+eACDDmTU74ANOs5nXaDpyS3fLqfSH6w== 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=55AlPUUE8TEbDwrhF3KgcH9bxqg16uTOTWsEfqmFR6s=; b=vi7BbkuhxLabBobqHOIH4NSJolNjlpT0yGGMmldT6B5VnKfDc8U/lKpT+ozv8h5GYxb4Y5gPIlzPxMQXQbMFxtrPkK6V4BXLMQkucSCPdcsATcoCSwYXVzH+eXNhJHIAgwi6fEO0rRMhZssIONUIuUHHGR+IUMdf0ScMEbMonOyw0IudlTxMUeZnWF7kbNsejv37DSdzu+ryMH9hDx1SRWlNMBVcGAClPssBxVWORZtmIYmLoUjOAT4WtRtFmX4ylIaNHZakI1HW3Hu6LbC82/t9yS5cXR+aejNInIQKbYsp39UrUQBKCwwLUENRnEXdNe/D2rbkNgUglyb3+rCu0Q== 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=55AlPUUE8TEbDwrhF3KgcH9bxqg16uTOTWsEfqmFR6s=; b=Negb915QYYWKoxiBnZyMIvBvL7xTfcu87Z76buQ6PhxamZaxmP1CxsAokWYcY4MtrPMlAzUCyTepgsOJCOY/5fuzrSgix5bfSWGmGKGhYgDxU2S8n/fMK0XCzqMlFBWaeTmfAWvrf33LDbq0Kk6rHdfBo/e6CIb7GX2VApna4gU= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:10:03 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:10:03 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 08/10] tools/testing/selftests: expand mremap() tests for MREMAP_RELOCATE_ANON Date: Tue, 22 Apr 2025 09:09:27 +0100 Message-ID: <94b2f296e8d5eb5fd8a0d0c210c4241a1d15d404.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0685.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:37b::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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: e95605ca-df2d-49f4-3c78-08dd817515b7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?zK/onAx6nItfIhrm7mQeUmfBnAmXyzP8NDE7ujc6dE8ucLDcuBE91qDF3pOO?= =?us-ascii?Q?RfFRB4zXlqtDJqjbDP/uH/onOY6mV1G6XbZ0VAlYHM0Y/MoQsKMcpsdGDE41?= =?us-ascii?Q?NbiW5iXpVx32KrtPAKl14eFo5p6knquc027haDzbmatBxejlXXNcpiHLdatB?= =?us-ascii?Q?mSbXmZhyepBI7dohgR1lAL93zPFxOfkwWk1oW3q5ahN2QhuYOyMMlrx1mXAy?= =?us-ascii?Q?uz9BetLRL+DvZ5I70j5pNN8aPqL0ovTMruxQwo2+IBjBzyJPMW9Vi9STop4J?= =?us-ascii?Q?VPCcy0d0NDQDSSRYV2q8GP4R/Hhozt6IEZ7wO5cBLwr7vmNANpBxzhOD40qA?= =?us-ascii?Q?1twfXN/2pDyRrcdCqxibbDXNJnM0+Ki3xpHFkSDtag/txfjY6bsV2xQP/q1+?= =?us-ascii?Q?MYLSnlJau7LYUq2+vxxY6RoNKBmyz8b3oS5GGLt71GOa0KaQBETVkBVdXoH9?= =?us-ascii?Q?3EdDRMu09QBEWzKKrf2+wY2AFjRz+3IMbsI32I+6L8kWt9zkBYjG7CWNjHSR?= =?us-ascii?Q?EmV35xmyTO7M3fUnrGlft5FyPyJyH8d1YO5bRDL+C6wg1XzBbB9WATzUB7Rk?= =?us-ascii?Q?z9RMcAWFeZADoxuxo7liDcFx3nCRTTQcYTf8F+IWO5QioMMDHrB+ed9gJuAe?= =?us-ascii?Q?Orb8ao/+qXQvyogDzOY+lOZpfxXRDBYGuPlyES3isarWuzquPiUiCezjmRUV?= =?us-ascii?Q?R+/uEzs4Azx1EaqoaZnE7wxV5HZ+8IIs8C1hhadvyymjYc9bv6QQMkxuyaG4?= =?us-ascii?Q?rwZRC+Ns+TEuMz2WfQvgpIvJV1zTMNRFKv7y6rtbhodbLlLjYI6urMsJI0kV?= =?us-ascii?Q?pmO6eRGHZZFaO7uxvfg03eFDieP5Hgf8yC6vUoXs5ItaF++7A/5JOu+RKGHH?= =?us-ascii?Q?M+kL7ffpcexUMXGBkJp9tagKeD4+5zbdgV4iWmgZtQn/aMfajU8RtMsqVkez?= =?us-ascii?Q?BM4pKy5Sia66xZAU8IgJumGZtxEZlSmd+hWyCBM9uXTKuMzROfv9wI0towqY?= =?us-ascii?Q?2W0enZYJgcDDwUNC7tP/1etcrTOjey0Pmj7R9/7TLMWdwiH1FYd0Mu1TMCeX?= =?us-ascii?Q?W66XdRy/sgsCjUC2IvzBCG8CmbxsBsy815T2JSXeLdLGzkn6uD5lv102ro7J?= =?us-ascii?Q?Ua+aVJnhDEGW1k61Lq0ujfOO4PReiDktXi943eGivS7iS0PyRYwz7nBzFOn0?= =?us-ascii?Q?9wz9Wx2fRjeNbYo1+1N87QqTkqIFRlZqTckkz9IHpZWxzTDVLRIyaaM9fSmL?= =?us-ascii?Q?h8b8XGOSPzR3n73GJQ7ee1rjh9ywFia/yl5k3wHU5X3ZOyym3uorx+gjAI9m?= =?us-ascii?Q?REw//mapNuM/8Y7gcKVWFV764NhI24Acnv2IwWMUcRC3Z8j1a6Y9e+aWB4yZ?= =?us-ascii?Q?uHj9qc0NL9cdnGMxvkvJZAaW1X9nvqrp/7V5pr3brEuU9+0Po7GkgcITp6y8?= =?us-ascii?Q?DbpnamdWhXQ=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1vPwWRxRdszvUInU9siIw69o21AcUwvkzTARy8up4hZ/36Isl3bUNnN6qClQ?= =?us-ascii?Q?7NHlmY4DD4xqvQaaVEzY8nhU3z4wk7R0DV97X2YrGmUT0ucvidUBKFfSKyoI?= =?us-ascii?Q?+xmpH5NXk59Q3B4LmbnZkaaM3tyP8S8zNHIBwmbQLagulAjAgwFKtqeZQhPV?= =?us-ascii?Q?G05H2PrSIgpZS0LtfXbSkNFHmqHVF+tuTbEpcDifuSZFsIgWO/5PFTbWvP94?= =?us-ascii?Q?Ws1mhTsrRnGon7U6+0h2+75h0UvtByOHyeItXaVaKycspis1rgedtlznMwzb?= =?us-ascii?Q?zblrrkRA+PdQcLEVWRESzFt+BUR4A+oU/8k+cEoYM5Xq7gYnEFH1Xyr3sBbv?= =?us-ascii?Q?TfI3Jm7KhJx2RNLf83bH6A9cBokl77bRA4ok7oJQpRfVZk4zZBDWQDDZbQhz?= =?us-ascii?Q?fO5D2xk+0hdnZtdZh1PJfst6OyEYqq6BzhIB54pdwr8+x9MDdEz3gqfXMKTY?= =?us-ascii?Q?el5crcBEKT26ZQq7AjMtpZZI8It9R3xmWBM5v/au/uSg9ODzbMUmnX5ZoSr4?= =?us-ascii?Q?yN2FnWEtZRZeBsELkpoqWElM909IxE4Dc3gyexBWnQl+dCsesuwehJRYgA9r?= =?us-ascii?Q?fx+rDznwDgJNxDp2zm/pebB2tJnQgBaUpBwpfg6c68tLuGVwSmJQsMNVIYmA?= =?us-ascii?Q?bHA+NOWbnHsKmjjpaSn+H3cKA9kyenad6K6yPO6KHv/jBP/t3O0vnF0cjLPT?= =?us-ascii?Q?VJf9pIWrUe4Y49vVL4UNhr6fr62GNo1gTAkWc8Fu+UXPrT1t1v3vDvweukhU?= =?us-ascii?Q?tLFExMTsBPYqkF6m7nmKcTO+jm5mln8PPaHUd1Ce1oGMSmN1yCe1uiO9QodX?= =?us-ascii?Q?BmOTlLBlocI33rRUiDehR39GNNPqhTg0S7hpXrZLeE/edS/0J5Zt+Nw18hTe?= =?us-ascii?Q?j9cVD6t4IGG2BUbjyEoR5nZZF4VB1F0vr6xF0YzlG8rXNvPmHIyx9+0vPWay?= =?us-ascii?Q?gUQsuzu6r1ApOZvwpct4vQHzpjECsL4Joe5IvhHSLG0XWwomp36/ybQiGwLj?= =?us-ascii?Q?skanEWSsXwzPZHvxxF6tUw2/5OVqb6v/Kw1Xj6VUAbxl4CFUvdmh3pCMjWPI?= =?us-ascii?Q?60rs2pHE2+kuPVQblmLBK0ht4nJ+W1ThJHUbxn13n1C6gFWM4ruDClK367jT?= =?us-ascii?Q?55gu1x0dx8Mmu2riaQri80/ej/YYFzb0GpJGR1h2G56NQfyCXqKUC7c5LKsi?= =?us-ascii?Q?l5iCUi/CGAVRErT2Er+T2QZu7lQVTmicyU3ZWiF+TLgQCuzt1yiSO6LpL9rj?= =?us-ascii?Q?qF0CMGeazmA+3+vhyxAgSifQPTJJCEOz3xL9pav29v2bd8Gijd8xNkPgSulb?= =?us-ascii?Q?+85DcwFWO7/6Dgg+dJidBrCeTR5kISw9i1u8ij3eelod4QJ1ULTRHvoLHY32?= =?us-ascii?Q?W9j9jbvd/eX7KABQyiCUGOAUve2RqHucvK6Xb3Nz8CzxcWx3Bnblh25va93j?= =?us-ascii?Q?VQCr7CWP59o44t9p6d2PwgdjWt7qgWERtp5wQXaaCQgoWNlI7JQKTmigfiOS?= =?us-ascii?Q?f+gH0VSKWdJK9PYUnRaEMRZczGU1UzPeaYsvyF2ES26C4TlIhI7U98g9MLJ2?= =?us-ascii?Q?7B9ralXwGlVQ8rr0+OHUXMjhiUnTmwX6PDTIWdBAsvR1xfEvyCNgS2i4ImiV?= =?us-ascii?Q?vg=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: E6pkLr/sBEVWz89tsl04eze5F2YbX2AWLhHzl+4Na/6Akqk8OYuM0rweEFPiCIhp2Z7dVS+rkcZ8tGh/BnGr7bE2Aa9mrcDDSDoNyjjf/NzikzJaHVDacGQb1dmBPoyodxWBOMY2a5nXo18MIEjnz7I2O0TEC5I2AgmDcs3uLkJhT7NY9XJMTOifbbQrsl30qNnDWzKsX5J5iRXX+yq1nhgCcJfqVFs3hMFGlZ3if8mhgFBMXNV23mNYqgYwLN5BPo14jNh7N8j1IfvgVHcGol37OYosw7xPS7umkLK6h8K7+k/uU86t7ENtJxgqXyEDWD35+RMY4zmqudmiLTrXd3lv6ANt3BfPSvyYwZRXD+ufq2KtVoagWpnzc1Z+sF0xjpSSaPfSL7lTL5PN9PpJPoCOLdCK6o/pG8VNNUxAfDiDHDGBS6JUA4N5XB3/IR569cjogmTjf7QzT/kauoTofiDn0bw8K5hdVWxrDAk5OwNlmC23xlK3K3X6M+fIHSmXNd12T5p+mUcu4P0PFudxdBZKdLY3V4SMuabi3YTaAt8BTgIowqsc6lJg4sb7aFijkzHB4SJ/DC1trgACdTxiB1/MKJXDCZl9vnWjpURJ0n4= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: e95605ca-df2d-49f4-3c78-08dd817515b7 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:10:03.2900 (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: KIfW58DkZ96+9TCZbdmT0w4EscAUxGc/Ds+QyTGgTQpgnLN71hGvpKAbX2KuBgkCvxbzGebVQ5cmcqz4RIdl4rDtyfegwqPDXz4dkGk1sBs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-ORIG-GUID: 4Ah5wgNJMe2HMF0Oa3N5Jp-wkYWbhkD4 X-Proofpoint-GUID: 4Ah5wgNJMe2HMF0Oa3N5Jp-wkYWbhkD4 Content-Type: text/plain; charset="utf-8" Adjust every relevant test (that is, one that moves memory) to also perform the same test using MREMAP_MUST_RELOCATE_ANON to assert that it is behaving as expected. In order to avoid glibc not being up-to-date, also move to using the mremap() system call direct, and import the linux/mman.h header, which will use the tool linux header wrappers, to get the latest mremap defines. Also take careful precaution in the instance where we might unexpectedly fail the 'mremap move within range' test due to large folios mapped outside of the range we are relocating. In these instances, if we test with MREMAP_MUST_RELOCATE_ANON, we ensure the folios in question are not huge. If testing with MREMAP_RELOCATE_ANON we do not - this asserts that this correctly falls back to non-relocate anon behaviour. In cases where MREMAP_MUST_RELOCATE_ANON is used, we attempt to immediately trigger reclaim to also assert that the rmap state is uncorrupted. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/mremap_test.c | 262 +++++++++++++++-------- 1 file changed, 168 insertions(+), 94 deletions(-) diff --git a/tools/testing/selftests/mm/mremap_test.c b/tools/testing/selft= ests/mm/mremap_test.c index bb84476a177f..5d6ff0d1da7d 100644 --- a/tools/testing/selftests/mm/mremap_test.c +++ b/tools/testing/selftests/mm/mremap_test.c @@ -8,11 +8,13 @@ #include #include #include +#include #include #include #include =20 #include "../kselftest.h" +#include "vm_util.h" =20 #define EXPECT_SUCCESS 0 #define EXPECT_FAILURE 1 @@ -34,6 +36,7 @@ struct config { unsigned long long dest_alignment; unsigned long long region_size; int overlapping; + bool use_relocate_anon; unsigned int dest_preamble_size; }; =20 @@ -60,7 +63,8 @@ enum { #define PTE page_size =20 #define MAKE_TEST(source_align, destination_align, size, \ - overlaps, should_fail, test_name) \ + overlaps, use_relocate_anon, should_fail, \ + test_name) \ (struct test){ \ .name =3D test_name, \ .config =3D { \ @@ -68,6 +72,7 @@ enum { .dest_alignment =3D destination_align, \ .region_size =3D size, \ .overlapping =3D overlaps, \ + .use_relocate_anon =3D use_relocate_anon, \ }, \ .expect_failure =3D should_fail \ } @@ -184,6 +189,12 @@ static void *get_source_mapping(struct config c) unsigned long long addr =3D 0ULL; void *src_addr =3D NULL; unsigned long long mmap_min_addr; + int mmap_flags =3D MAP_FIXED_NOREPLACE | MAP_ANONYMOUS; + + if (c.use_relocate_anon) + mmap_flags |=3D MAP_PRIVATE; + else + mmap_flags |=3D MAP_SHARED; =20 mmap_min_addr =3D get_mmap_min_addr(); /* @@ -198,8 +209,7 @@ static void *get_source_mapping(struct config c) goto retry; =20 src_addr =3D mmap((void *) addr, c.region_size, PROT_READ | PROT_WRITE, - MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, - -1, 0); + mmap_flags, -1, 0); if (src_addr =3D=3D MAP_FAILED) { if (errno =3D=3D EPERM || errno =3D=3D EEXIST) goto retry; @@ -251,7 +261,7 @@ static void mremap_expand_merge(FILE *maps_fp, unsigned= long page_size) } =20 munmap(start + page_size, page_size); - remap =3D mremap(start, page_size, 2 * page_size, 0); + remap =3D sys_mremap(start, page_size, 2 * page_size, 0, 0); if (remap =3D=3D MAP_FAILED) { ksft_print_msg("mremap failed: %s\n", strerror(errno)); munmap(start, page_size); @@ -292,7 +302,8 @@ static void mremap_expand_merge_offset(FILE *maps_fp, u= nsigned long page_size) =20 /* Unmap final page to ensure we have space to expand. */ munmap(start + 2 * page_size, page_size); - remap =3D mremap(start + page_size, page_size, 2 * page_size, 0); + + remap =3D sys_mremap(start + page_size, page_size, 2 * page_size, 0, 0); if (remap =3D=3D MAP_FAILED) { ksft_print_msg("mremap failed: %s\n", strerror(errno)); munmap(start, 2 * page_size); @@ -324,20 +335,35 @@ static void mremap_expand_merge_offset(FILE *maps_fp,= unsigned long page_size) * * |DDDDddddSSSSssss| */ -static void mremap_move_within_range(unsigned int pattern_seed, char *rand= _addr) +static void mremap_move_within_range(unsigned int pattern_seed, char *rand= _addr, + char *test_suffix, int extra_flags) { char *test_name =3D "mremap mremap move within range"; void *src, *dest; unsigned int i, success =3D 1; - size_t size =3D SIZE_MB(20); void *ptr =3D mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + int mremap_flags =3D MREMAP_MAYMOVE | MREMAP_FIXED; + if (ptr =3D=3D MAP_FAILED) { perror("mmap"); success =3D 0; goto out; } + + /* + * If THP is enabled, we may end up spanning a range which has large + * folios not enclosed within the mapping, which will disallow the + * relocate. + * + * In this case, disallow huge pages in the range. + */ + if (extra_flags & MREMAP_MUST_RELOCATE_ANON) + madvise(ptr, size, MADV_NOHUGEPAGE); + + mremap_flags |=3D extra_flags; + memset(ptr, 0, size); =20 src =3D ptr + SIZE_MB(6); @@ -348,8 +374,8 @@ static void mremap_move_within_range(unsigned int patte= rn_seed, char *rand_addr) =20 dest =3D src - SIZE_MB(2); =20 - void *new_ptr =3D mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), - MREMAP_MAYMOVE | MREMAP_FIXED, dest + SIZE_MB(1)); + void *new_ptr =3D sys_mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), + mremap_flags, dest + SIZE_MB(1)); if (new_ptr =3D=3D MAP_FAILED) { perror("mremap"); success =3D 0; @@ -375,9 +401,9 @@ static void mremap_move_within_range(unsigned int patte= rn_seed, char *rand_addr) perror("munmap"); =20 if (success) - ksft_test_result_pass("%s\n", test_name); + ksft_test_result_pass("%s%s\n", test_name, test_suffix); else - ksft_test_result_fail("%s\n", test_name); + ksft_test_result_fail("%s%s\n", test_name, test_suffix); } =20 /* Returns the time taken for the remap on success else returns -1. */ @@ -390,6 +416,10 @@ static long long remap_region(struct config c, unsigne= d int threshold_mb, long long start_ns, end_ns, align_mask, ret, offset; unsigned long long threshold; unsigned long num_chunks; + int mremap_flags =3D MREMAP_MAYMOVE | MREMAP_FIXED; + + if (c.use_relocate_anon) + mremap_flags |=3D MREMAP_MUST_RELOCATE_ANON; =20 if (threshold_mb =3D=3D VALIDATION_NO_THRESHOLD) threshold =3D c.region_size; @@ -431,10 +461,15 @@ static long long remap_region(struct config c, unsign= ed int threshold_mb, } =20 if (c.dest_preamble_size) { + int mmap_flags =3D MAP_FIXED_NOREPLACE | MAP_ANONYMOUS; + + if (c.use_relocate_anon) + mmap_flags |=3D MAP_PRIVATE; + else + mmap_flags |=3D MAP_SHARED; + dest_preamble_addr =3D mmap((void *) addr - c.dest_preamble_size, c.dest= _preamble_size, - PROT_READ | PROT_WRITE, - MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED, - -1, 0); + PROT_READ | PROT_WRITE, mmap_flags, -1, 0); if (dest_preamble_addr =3D=3D MAP_FAILED) { ksft_print_msg("Failed to map dest preamble region: %s\n", strerror(errno)); @@ -447,8 +482,8 @@ static long long remap_region(struct config c, unsigned= int threshold_mb, } =20 clock_gettime(CLOCK_MONOTONIC, &t_start); - dest_addr =3D mremap(src_addr, c.region_size, c.region_size, - MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr); + dest_addr =3D sys_mremap(src_addr, c.region_size, c.region_size, + mremap_flags, (char *) addr); clock_gettime(CLOCK_MONOTONIC, &t_end); =20 if (dest_addr =3D=3D MAP_FAILED) { @@ -549,6 +584,10 @@ static long long remap_region(struct config c, unsigne= d int threshold_mb, * subsequent tests. So we clean up mappings after each test. */ clean_up_dest: + /* Trigger reclaim to assert that adjusted rmap state is valid. */ + if (c.use_relocate_anon) + madvise(dest_addr, c.region_size, MADV_PAGEOUT); + munmap(dest_addr, c.region_size); clean_up_dest_preamble: if (c.dest_preamble_size && dest_preamble_addr) @@ -565,16 +604,19 @@ static long long remap_region(struct config c, unsign= ed int threshold_mb, * down address landed on a mapping that maybe does not exist. */ static void mremap_move_1mb_from_start(unsigned int pattern_seed, - char *rand_addr) + char *rand_addr, char *test_suffix, + int extra_flags) { char *test_name =3D "mremap move 1mb from start at 1MB+256KB aligned src"; void *src =3D NULL, *dest =3D NULL; unsigned int i, success =3D 1; - + int mremap_flags =3D MREMAP_MAYMOVE | MREMAP_FIXED; /* Config to reuse get_source_mapping() to do an aligned mmap. */ struct config c =3D { .src_alignment =3D SIZE_MB(1) + SIZE_KB(256), - .region_size =3D SIZE_MB(6) + .region_size =3D SIZE_MB(6), + .use_relocate_anon =3D extra_flags & (MREMAP_RELOCATE_ANON | + MREMAP_MUST_RELOCATE_ANON), }; =20 src =3D get_source_mapping(c); @@ -583,6 +625,12 @@ static void mremap_move_1mb_from_start(unsigned int pa= ttern_seed, goto out; } =20 + /* See comment in mremap_move_within_range(). */ + if (extra_flags & MREMAP_MUST_RELOCATE_ANON) + madvise(src, c.region_size, MADV_NOHUGEPAGE); + + mremap_flags |=3D extra_flags; + c.src_alignment =3D SIZE_MB(1) + SIZE_KB(256); dest =3D get_source_mapping(c); if (!dest) { @@ -599,8 +647,8 @@ static void mremap_move_1mb_from_start(unsigned int pat= tern_seed, */ munmap(dest, SIZE_MB(1)); =20 - void *new_ptr =3D mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), - MREMAP_MAYMOVE | MREMAP_FIXED, dest + SIZE_MB(1)); + void *new_ptr =3D sys_mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), + mremap_flags, dest + SIZE_MB(1)); if (new_ptr =3D=3D MAP_FAILED) { perror("mremap"); success =3D 0; @@ -629,9 +677,10 @@ static void mremap_move_1mb_from_start(unsigned int pa= ttern_seed, perror("munmap dest"); =20 if (success) - ksft_test_result_pass("%s\n", test_name); + ksft_test_result_pass("%s%s\n", test_name, test_suffix); + else - ksft_test_result_fail("%s\n", test_name); + ksft_test_result_fail("%s%s\n", test_name, test_suffix); } =20 static void run_mremap_test_case(struct test test_case, int *failures, @@ -640,13 +689,17 @@ static void run_mremap_test_case(struct test test_cas= e, int *failures, { long long remap_time =3D remap_region(test_case.config, threshold_mb, rand_addr); + char *relocate_anon_suffix =3D " [MREMAP_MUST_RELOCATE_ANON]"; + struct config *c =3D &test_case.config; =20 if (remap_time < 0) { if (test_case.expect_failure) - ksft_test_result_xfail("%s\n\tExpected mremap failure\n", - test_case.name); + ksft_test_result_xfail("%s%s\n\tExpected mremap failure\n", + test_case.name, + c->use_relocate_anon ? relocate_anon_suffix : ""); else { - ksft_test_result_fail("%s\n", test_case.name); + ksft_test_result_fail("%s%s\n", test_case.name, + c->use_relocate_anon ? relocate_anon_suffix : ""); *failures +=3D 1; } } else { @@ -656,10 +709,13 @@ static void run_mremap_test_case(struct test test_cas= e, int *failures, */ if (threshold_mb =3D=3D VALIDATION_NO_THRESHOLD || test_case.config.region_size <=3D threshold_mb * _1MB) - ksft_test_result_pass("%s\n\tmremap time: %12lldns\n", - test_case.name, remap_time); + ksft_test_result_pass("%s%s\n\tmremap time: %12lldns\n", + test_case.name, + c->use_relocate_anon ? relocate_anon_suffix : "", + remap_time); else - ksft_test_result_pass("%s\n", test_case.name); + ksft_test_result_pass("%s%s\n", test_case.name, + c->use_relocate_anon ? relocate_anon_suffix : ""); } } =20 @@ -703,8 +759,8 @@ static int parse_args(int argc, char **argv, unsigned i= nt *threshold_mb, return 0; } =20 -#define MAX_TEST 15 -#define MAX_PERF_TEST 3 +#define MAX_TEST 30 +#define MAX_PERF_TEST 6 int main(int argc, char **argv) { int failures =3D 0; @@ -721,12 +777,15 @@ int main(int argc, char **argv) char *rand_addr; size_t rand_size; int num_expand_tests =3D 2; - int num_misc_tests =3D 2; + int num_misc_tests =3D 6; struct test test_cases[MAX_TEST] =3D {}; struct test perf_test_cases[MAX_PERF_TEST]; int page_size; time_t t; FILE *maps_fp; + bool use_relocate_anon =3D false; + struct test *test_case =3D test_cases; + struct test *perf_test_case =3D perf_test_cases; =20 pattern_seed =3D (unsigned int) time(&t); =20 @@ -763,66 +822,71 @@ int main(int argc, char **argv) =20 page_size =3D sysconf(_SC_PAGESIZE); =20 - /* Expected mremap failures */ - test_cases[0] =3D MAKE_TEST(page_size, page_size, page_size, - OVERLAPPING, EXPECT_FAILURE, - "mremap - Source and Destination Regions Overlapping"); - - test_cases[1] =3D MAKE_TEST(page_size, page_size/4, page_size, - NON_OVERLAPPING, EXPECT_FAILURE, - "mremap - Destination Address Misaligned (1KB-aligned)"); - test_cases[2] =3D MAKE_TEST(page_size/4, page_size, page_size, - NON_OVERLAPPING, EXPECT_FAILURE, - "mremap - Source Address Misaligned (1KB-aligned)"); - - /* Src addr PTE aligned */ - test_cases[3] =3D MAKE_TEST(PTE, PTE, PTE * 2, - NON_OVERLAPPING, EXPECT_SUCCESS, - "8KB mremap - Source PTE-aligned, Destination PTE-aligned"); - - /* Src addr 1MB aligned */ - test_cases[4] =3D MAKE_TEST(_1MB, PTE, _2MB, NON_OVERLAPPING, EXPECT_SUCC= ESS, - "2MB mremap - Source 1MB-aligned, Destination PTE-aligned"); - test_cases[5] =3D MAKE_TEST(_1MB, _1MB, _2MB, NON_OVERLAPPING, EXPECT_SUC= CESS, - "2MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); - - /* Src addr PMD aligned */ - test_cases[6] =3D MAKE_TEST(PMD, PTE, _4MB, NON_OVERLAPPING, EXPECT_SUCCE= SS, - "4MB mremap - Source PMD-aligned, Destination PTE-aligned"); - test_cases[7] =3D MAKE_TEST(PMD, _1MB, _4MB, NON_OVERLAPPING, EXPECT_SUCC= ESS, - "4MB mremap - Source PMD-aligned, Destination 1MB-aligned"); - test_cases[8] =3D MAKE_TEST(PMD, PMD, _4MB, NON_OVERLAPPING, EXPECT_SUCCE= SS, - "4MB mremap - Source PMD-aligned, Destination PMD-aligned"); - - /* Src addr PUD aligned */ - test_cases[9] =3D MAKE_TEST(PUD, PTE, _2GB, NON_OVERLAPPING, EXPECT_SUCCE= SS, - "2GB mremap - Source PUD-aligned, Destination PTE-aligned"); - test_cases[10] =3D MAKE_TEST(PUD, _1MB, _2GB, NON_OVERLAPPING, EXPECT_SUC= CESS, - "2GB mremap - Source PUD-aligned, Destination 1MB-aligned"); - test_cases[11] =3D MAKE_TEST(PUD, PMD, _2GB, NON_OVERLAPPING, EXPECT_SUCC= ESS, - "2GB mremap - Source PUD-aligned, Destination PMD-aligned"); - test_cases[12] =3D MAKE_TEST(PUD, PUD, _2GB, NON_OVERLAPPING, EXPECT_SUCC= ESS, - "2GB mremap - Source PUD-aligned, Destination PUD-aligned"); - - /* Src and Dest addr 1MB aligned. 5MB mremap. */ - test_cases[13] =3D MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SU= CCESS, - "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); - - /* Src and Dest addr 1MB aligned. 5MB mremap. */ - test_cases[14] =3D MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SU= CCESS, - "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Preambl= e"); - test_cases[14].config.dest_preamble_size =3D 10 * _4MB; - - perf_test_cases[0] =3D MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAP= PING, EXPECT_SUCCESS, - "1GB mremap - Source PTE-aligned, Destination PTE-aligned"); - /* - * mremap 1GB region - Page table level aligned time - * comparison. - */ - perf_test_cases[1] =3D MAKE_TEST(PMD, PMD, _1GB, NON_OVERLAPPING, EXPECT_= SUCCESS, - "1GB mremap - Source PMD-aligned, Destination PMD-aligned"); - perf_test_cases[2] =3D MAKE_TEST(PUD, PUD, _1GB, NON_OVERLAPPING, EXPECT_= SUCCESS, - "1GB mremap - Source PUD-aligned, Destination PUD-aligned"); + do { + /* Expected mremap failures */ + *test_case++ =3D MAKE_TEST(page_size, page_size, page_size, + OVERLAPPING, use_relocate_anon, EXPECT_FAILURE, + "mremap - Source and Destination Regions Overlapping"); + + *test_case++ =3D MAKE_TEST(page_size, page_size/4, page_size, + NON_OVERLAPPING, use_relocate_anon, EXPECT_FAILURE, + "mremap - Destination Address Misaligned (1KB-aligned)"); + *test_case++ =3D MAKE_TEST(page_size/4, page_size, page_size, + NON_OVERLAPPING, use_relocate_anon, EXPECT_FAILURE, + "mremap - Source Address Misaligned (1KB-aligned)"); + + /* Src addr PTE aligned */ + *test_case++ =3D MAKE_TEST(PTE, PTE, PTE * 2, + NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "8KB mremap - Source PTE-aligned, Destination PTE-aligned"); + + /* Src addr 1MB aligned */ + *test_case++ =3D MAKE_TEST(_1MB, PTE, _2MB, NON_OVERLAPPING, use_relocat= e_anon, EXPECT_SUCCESS, + "2MB mremap - Source 1MB-aligned, Destination PTE-aligned"); + *test_case++ =3D MAKE_TEST(_1MB, _1MB, _2MB, NON_OVERLAPPING, use_reloca= te_anon, EXPECT_SUCCESS, + "2MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); + + /* Src addr PMD aligned */ + *test_case++ =3D MAKE_TEST(PMD, PTE, _4MB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "4MB mremap - Source PMD-aligned, Destination PTE-aligned"); + *test_case++ =3D MAKE_TEST(PMD, _1MB, _4MB, NON_OVERLAPPING, use_relocat= e_anon, EXPECT_SUCCESS, + "4MB mremap - Source PMD-aligned, Destination 1MB-aligned"); + *test_case++ =3D MAKE_TEST(PMD, PMD, _4MB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "4MB mremap - Source PMD-aligned, Destination PMD-aligned"); + + /* Src addr PUD aligned */ + *test_case++ =3D MAKE_TEST(PUD, PTE, _2GB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination PTE-aligned"); + *test_case++ =3D MAKE_TEST(PUD, _1MB, _2GB, NON_OVERLAPPING, use_relocat= e_anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination 1MB-aligned"); + *test_case++ =3D MAKE_TEST(PUD, PMD, _2GB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination PMD-aligned"); + *test_case++ =3D MAKE_TEST(PUD, PUD, _2GB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination PUD-aligned"); + + /* Src and Dest addr 1MB aligned. 5MB mremap. */ + *test_case++ =3D MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, use_reloca= te_anon, EXPECT_SUCCESS, + "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); + + /* Src and Dest addr 1MB aligned. 5MB mremap. */ + *test_case =3D MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, use_relocate= _anon, EXPECT_SUCCESS, + "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Pream= ble"); + test_case++->config.dest_preamble_size =3D 10 * _4MB; + + *perf_test_case++ =3D MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAP= PING, + use_relocate_anon, EXPECT_SUCCESS, + "1GB mremap - Source PTE-aligned, Destination PTE-aligned"); + /* + * mremap 1GB region - Page table level aligned time + * comparison. + */ + *perf_test_case++ =3D MAKE_TEST(PMD, PMD, _1GB, NON_OVERLAPPING, use_rel= ocate_anon, EXPECT_SUCCESS, + "1GB mremap - Source PMD-aligned, Destination PMD-aligned"); + *perf_test_case++ =3D MAKE_TEST(PUD, PUD, _1GB, NON_OVERLAPPING, use_rel= ocate_anon, EXPECT_SUCCESS, + "1GB mremap - Source PUD-aligned, Destination PUD-aligned"); + + use_relocate_anon =3D !use_relocate_anon; + } while (use_relocate_anon); =20 run_perf_tests =3D (threshold_mb =3D=3D VALIDATION_NO_THRESHOLD) || (threshold_mb * _1MB >=3D _1GB); @@ -846,8 +910,18 @@ int main(int argc, char **argv) =20 fclose(maps_fp); =20 - mremap_move_within_range(pattern_seed, rand_addr); - mremap_move_1mb_from_start(pattern_seed, rand_addr); + mremap_move_within_range(pattern_seed, rand_addr, + "", 0); + mremap_move_within_range(pattern_seed, rand_addr, + "[MREMAP_RELOCATE_ANON]", MREMAP_RELOCATE_ANON); + mremap_move_within_range(pattern_seed, rand_addr, + "[MREMAP_MUST_RELOCATE_ANON]", MREMAP_MUST_RELOCATE_ANON); + mremap_move_1mb_from_start(pattern_seed, rand_addr, + "", 0); + mremap_move_1mb_from_start(pattern_seed, rand_addr, + "[MREMAP_RELOCATE_ANON]", MREMAP_RELOCATE_ANON); + mremap_move_1mb_from_start(pattern_seed, rand_addr, + "[MREMAP_MUST_RELOCATE_ANON]", MREMAP_MUST_RELOCATE_ANON); =20 if (run_perf_tests) { ksft_print_msg("\n%s\n", --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 251102571AB for ; Tue, 22 Apr 2025 08:10:24 +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=1745309426; cv=fail; b=ik0Z3wIH2h2LTN8xhQybJZtb+HmaXRs9mjJCKuszl31oNDlEQFTDTsb47CIyYX4JOOQ6TFHSjkHevg46e6z/H0+DZoGU/iS4eD9ntBFeB+gIa6yjTJhHt9uSLD+Fm1vkU/j9wiphC/5RhEQ7Ut9yVpv+oz6IvRVyA4B2z6pPkRw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309426; c=relaxed/simple; bh=od9JR9TGITckGZhpAtaTUl2UInyO6QBVl+iSlVTZwKw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=CakfFPXvVEBSEkYvc06zQei7pVD2OiGFXLQfYzqlHSDNOBfwi4A/c8ty3dvusMY6GctKRTCKlw4FuviR0MADgXoMCh/TFsHfJIRo6i6Lb1xFM0l0CYQgDJsV7rfxAW5R0Og5lC+CDaVsxWET4SKQtXDxR2cOFH10WiwtDWKnAOM= 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=JvTDApW/; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=C6b2GaGB; 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="JvTDApW/"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="C6b2GaGB" 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 53M7Mxii006178; Tue, 22 Apr 2025 08:10:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=Jc/FpWTukiSQC7dJBUQXCCq5hIzUITwKucp/3nq0o9g=; b= JvTDApW/GM0L6KrJ/31xvDebCEFrnHuNAQP0dFpf1+z9oeFnup9QItq/tsoiSpFB HKZXfEcKTgv4o6ib05LTrImg9qmjMh1WGpznGRCJ2XJypNqy/pSTFDP1U/yL6q0H vHc1blVVO3ZvINEzFJNivTlPHNQgIHnsGaibkn+cMtF+qvKuC+wkNjh6mGUB54q9 0ZzHD+AqWE+F8lZbj3ovBPHQn0tXAWwmNsNsennoSLWHRPdTBPj5cbte0gVRdzYt xx+Vbe5AW0Cw2vD9Dpf4pnhquD3elYCkqK37T373vIRu1Bx8UDPYyiaF6jT0oIN2 NvVFLIoaKdtTiyLrXRB2hA== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4642e0byt0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:10 +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 53M718nV021110; Tue, 22 Apr 2025 08:10:09 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010005.outbound.protection.outlook.com [40.93.10.5]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhsts-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:09 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QNrZnboBmWkOe5G/6LNJdMDPCe9XPfM5/fScQKZqYUS7nkeFwGx8E9G/S2wXnEXimXbzD7TeGc4nD4fXuAuD7wE9GBt1paOnx/8H3muGnEX7ZKHGenllmZwkHBDshZBivQwDJyN5HodVNrs6YPNxEU0hmAGR6gMqLUsugkrooMJeHMDy9w08he8Jb+Jmc3kkGj+pruKNvbzkpHgt0jCqFHj5ypNQbR1UyD2fKnq22yawqQVKvU13GYQzpJX49F5TS04Vjz6am+7OruvtOfJLIs++u+jZ5TS/NrebTizaec98NTiidVu6zBBpTF5LVpTigISwyQiLGd8Gg8OUSLluhQ== 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=Jc/FpWTukiSQC7dJBUQXCCq5hIzUITwKucp/3nq0o9g=; b=w2PwarOe/KydF55Rb3VU7iF4U9zCad69ORgF3Z+m0BVLBkRinbTgMF6aPaI80cQ/3sXhW87NV+ZZ3+ablgUQgR8mlHHqeTwKgOpLuD0TR+W3Klzshg5s2RBk+mhMEtFB4LAblktKjxWVP7kKcfyIh5jLgkouRu315bsyBzOcTjdz2pwCDe2gsiXq8Y7i6/Q/KaEySnkrqdvga7hU8xYUWoZizRc7Uq0/BTa9yYHvin19Xkjgf+zzc0aQb9X2SEGYL1EB4T59BhNvxW4n0aGTxnGIOu/8BaveaSA3td1i0K5PzWhHbTd8MdSt0t79Y4RPrqmu8/sdg96KO0bWKscnkg== 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=Jc/FpWTukiSQC7dJBUQXCCq5hIzUITwKucp/3nq0o9g=; b=C6b2GaGBDv2WDu49wqi7xGGionW7O24jl0pAu20VInr4hccDxDOQW+WCGSE48pHmyEA9o5tzO+tbCoLCoVf83z9dS/r9hLUURQrDmpgs1HUxcziafVW0wcy/vyONas58NlSp/SxPnL4PnFGw5odcXUvEZC5a/ZwV/hoZDJfs/rY= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:10:05 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:10:05 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 09/10] tools/testing/selftests: have CoW self test use MREMAP_RELOCATE_ANON Date: Tue, 22 Apr 2025 09:09:28 +0100 Message-ID: <1f22d7db2700bf8b920998a6acd2b1cd0f0ddf7b.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0567.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:33b::20) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: f89c7dac-2d88-426a-b8c8-08dd81751723 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ZuvBTrGmzCzIvXr9ucTN0T1QEqYowk+Kfd63Y9bqCZBF/fG38gCkGqnuTM1/?= =?us-ascii?Q?09n+6EPH4q7Ty94LR5RxRE/pWBuiaHCjCKQKv3hUnZ0ibWR52wj+G4ohkORA?= =?us-ascii?Q?DgOvszXB3b6T/SDvhA/nDAQ1yG17oUhsJSbLI689pU8SgtwRpbk+Pnjrw47M?= =?us-ascii?Q?xFnkvRN//ltOd5sAvnKahVzxKQE21XCfaMIQRSLed4rQnuncECBlwIXHmu+m?= =?us-ascii?Q?BIpWNag0h7588hligLNpXayXcrM+prtiuRM9cpcNVKlcZsruteRbwIybaAOz?= =?us-ascii?Q?qzF8AY2Ncc88BFAq2gPuL1j916bSeErYAZMzy1hi+XP/9/WIqHtq8MRS7sSV?= =?us-ascii?Q?8b2Gbc99pWBplIHCplLhR5d37BJxi7Ti8eTJfqcAcLdJAnHUXarwktKBxD/n?= =?us-ascii?Q?pMqXZfSUKzuNANnLSO+qi767+QRY4nkj9myHImX0qKNehoqdJRZQI7WsTcA0?= =?us-ascii?Q?J/+mAdpYobvxmNUyASKpHma9qI+8iVAssWXjhnM/2CMsZHNKd5H0wFFGM0bS?= =?us-ascii?Q?S/0PNO4Aijg2AsQLpzr90opGrAtG2X37KuQS1Pul/COSpmRclrzYJtRIBIY4?= =?us-ascii?Q?Fb+jEZNT9eOUBtuVgf8KnoDVtZ7uZ+KlDPVdEFlkIpINesERs2YaFoTX5dtI?= =?us-ascii?Q?K/QNt186h3gA8GdpmbaNfWvaF/2XgmXRGPH2MZJmSthlfsoAaOY5FswmJMle?= =?us-ascii?Q?p1Jbnpo3vDI834TL2+6mLpCYnfk5nCwP4Ed3wUpAx7N3vjl3HI/HRwKjsnM1?= =?us-ascii?Q?+1KX4s4M0zxLbSQMR22U9q7G1I4hJPuaEMZFM6uKHczP1W+ba7Oub4i0Fy3r?= =?us-ascii?Q?DUBjhDzIy6AtMX9CMH7H55UW7rcX/9j8LLca1mz3aDfxCUew8Ib3dZfwnOzp?= =?us-ascii?Q?1UnA1FLQHEH98UoJMC/rDY0vKibGwWdmBGU9+r64UYhv+Ktme07DfO+aTyTJ?= =?us-ascii?Q?2SRo7PC8y/yRXfrsbygqoeLXwvUGvA2k9xXainJ7rv3BNxMVxBp4yKyciEcy?= =?us-ascii?Q?P+YfVgVjeWde8JGVUsptxtf6vruIQ5A3xZQQF4/8bWwPdZTITjwR0pJf6OAx?= =?us-ascii?Q?M3xzcOeeMluto9T3+GEQCpVyJDXlQdw98ZIfQoSPPDlQ7wzu3+27lSy3/N9t?= =?us-ascii?Q?iVxsgJBDp9zsfGO9+WKsB42hoH3L0gU8a2ynlOSU4FLKMELRrfNbWV8d6BVS?= =?us-ascii?Q?zuyKRHEYsymD2zjbn4jhl+kYBbuPVwre9J2KZAv2SXPQqtdL5qO08NWPr2Gj?= =?us-ascii?Q?zwIdA/36Zo6rl/pyXTWYP2aI+i8c1flt7J3LlJz+zGpLYy/C/Co1DAeupp14?= =?us-ascii?Q?IGTSvLaW9R0/7Sd5IAcr77E51qrgwLYKCCLsSII/5mdVCpP79RQzgCVz2046?= =?us-ascii?Q?XXut2pEh32amf6rzMgcfTbf3nt82FRlZwvzDCL3ZXzT5ca9/V6cVYg4+lwsU?= =?us-ascii?Q?GN2XKR6nWX8=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?VzRx23mpQb+86Y52cZCxwtRkTu63e2+66tqhS9e/95ixcPyKtYqRJtTGM0QQ?= =?us-ascii?Q?VeKe3TJ2LARHz7LRU1nLNc+b8JUrpOkDvEOSvXMKdadSfd1GU3Ble2HdFADL?= =?us-ascii?Q?zu/AY4nRqWxnahCQtNwH9RTSJe4JGwWJxFUPTURpWblCMWDO8OUKmKg1GZIL?= =?us-ascii?Q?DhZC8K+GbI0abOwCMeAyBU3yxQF0QZZf+/4W3kux1c7azm/xgUgFO3D+er7N?= =?us-ascii?Q?bUCDswOnVsAJEKUYO/ZhtVvpqq4LVfK/ypoX2+OmuYcf4+RqUe6fwK1RErzl?= =?us-ascii?Q?+7QrTqCjE26waX2oAb5yxwLt0s49JMIJsXB5SN0xWUEK3J8A/ZeYo8YB89j9?= =?us-ascii?Q?EWPA4XAy1uISNLwiJJx873Vkdvieadcn/UsGvqPpBWhP4ytVn2DXUOww7UUb?= =?us-ascii?Q?p/tsOpOLp4X+DCa8bApqAzRAxG4JMYezFRAUxenz7HOV3gB8R/6DJpIux1mT?= =?us-ascii?Q?tVP9HBBe39XtQGiLXMv1JGdPczVqwX6Gpdw0GbV/saPK6xOqZXQj3aA0P3Gu?= =?us-ascii?Q?EGZPQmBGpJ8DloKCvYLz3UbRIKY/1UTpd08cnF9FGCw0qnLivKcYWoNrWpkD?= =?us-ascii?Q?g38bqPq5YvIqi4GQq3/rW8lb85NK279kGvbXwWmpbjq2VZb4UU9IobyBtg6Y?= =?us-ascii?Q?nEdVjd/jMjpjmqZ7MwshZBPG7k++BpBTMf2tY2dHV5qn4aAKnl/Dynki97oJ?= =?us-ascii?Q?Kr8VGIlVu3ZNeMQsKuUyCCctxLV95U2bLw+8HDwIeak4OOpjfey1UViwk65v?= =?us-ascii?Q?suN3vs41J6c52fG2wWb1stGMM7ZLb9euRV+yyfJaB2Hg50NEyhChToYJQZxl?= =?us-ascii?Q?PHJz6H6JEEOfWEZfDBW9UOhcUifqkEouuYUVO/uvCD41wI22ZbFk1rC+ahZu?= =?us-ascii?Q?Z9klRDBhg3Hf98vCPCNmJkFfQDDsd6c7n3bftOo2hyqgBvfG+GN1PLWIfM7f?= =?us-ascii?Q?MVoX0s6Tmfialgzq/V0W2mGZMxmjq5c2hReXj5zqPOoqfTjN1CtPmB0VDmuJ?= =?us-ascii?Q?Nfu5ntF7bc80LyXESoJRTR8BeugSHed9cDOxjo+qXASl8Lxa5QHPlGbnX/V1?= =?us-ascii?Q?nui3FmZgK1AFi/wriy0zGdZi7dpNNp73eIqwMka5vQ8DQy8QS0JL8ijimgEk?= =?us-ascii?Q?D9Kx02Fa61zu10kzEU8HjwF1J2rdmYvX7k5/rQLuNcg0gzPkOW8YpC/z3rJC?= =?us-ascii?Q?3ytqUv3QrYZiMvrhw9jNVMatP4flxGsGuuNWQNlyXoVshwarZlq1Tv+nUT97?= =?us-ascii?Q?/QYYd7TR+C0Q6Qe7cGIui6QAMKyOmip9eBjhGeshsCIKWwjrJG7IJrLuG7Aj?= =?us-ascii?Q?NpOrbecL/ZNkAJB/+qXoasyRv9W83NOxUaLWha/S3FJTmdMMsaDqKARylqfM?= =?us-ascii?Q?8UXuaA0zhFgNtSMuLg4kLLHbvssPXQZYNMWVdtXTswd2D2EMmC4sce1EcMl9?= =?us-ascii?Q?9TUBCWNbTvsz60UbsrMb5h8zSwK7/WmxbCAXIQVIn50z8/TjYbQBqBly4bZq?= =?us-ascii?Q?9WzOnJbbVXYcy+/KPmuiqE4XLLizfKU0pluI8UvLkN2NtUsOxB/XkWX/t6Iq?= =?us-ascii?Q?1EH9eNkd6CpsFCphDuymmr9LiOULXCghlQxSdeMV3AldCxfrT6/k64AjkhxM?= =?us-ascii?Q?6Q=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: svZzuA61/MyItQX2HuAOxnwBqkh6DtOSKQSyIsfwEtQYH1DUPAksirPhT2gFgLTKvfbdfjH1onMe+A5xWMyZqxDGFD6HUt2c3EThfto4CNYW0VlKE6xw4i3/AlcanfPHm73E9/4C/BhYpXpX2gP7zwcUlljX6h+qHjwS9kQ7ycVWkMIcc45e1WzZ+6nlhQSJ+GFB3hkCIp07H2e8MaDzDNDMDmOuEDKMjhIg3yQt3YTQP9vtDOikpsgus062pRcXkAED293hnH+Itu6G1mpHcuYBq3d9K6P7ng9Z37uNrCDCO0Rb6/JomfNY4lZllvhftsPV8WCMouWev5udKuACjyNaZXTQYxAzZGKFMhyeTDb5louy3lp6Us2OZKKh6IiGNR9gWiNQRi8OQ695AouNlVaSXMpj73WGiGofhcLQa2daOEVp1Lno98SO0Xe+viDX3Qvkg+9VouAGTf088OepWM26dIwje9gcFOEo0f/HxBYhuVaVIqckkMDkTlAs4iUKHOPYan0h/EP9w5upySmTVWj/7RlH/rTvlNUv3MYRro1YQqMC67RNn0a4sQviqwji8tAgtRtjjSFEvL8VdFE4HrjL/mNijCUBTWn5ebizlBA= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: f89c7dac-2d88-426a-b8c8-08dd81751723 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:10:05.6521 (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: 6xViSk3nJyBYzZdwhkM4hYEO+MHHYpbBB5NIqyx81EhHEMxBMRhKhGnopELL4fysWOq5F2Ze8p2FxQZEuEpfwH8i2NBUcG9ZOn76I1Qnvk0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-GUID: HlCxPCRUdgcwCePE2w8J8Gw3soYXENLC X-Proofpoint-ORIG-GUID: HlCxPCRUdgcwCePE2w8J8Gw3soYXENLC Content-Type: text/plain; charset="utf-8" It is useful to have the CoW self-test invoke MREMAP_RELOCATE_ANON on partial THP mappings, as this triggers folio split code paths and asserts that this behaves correctly. Add an additional set of tests to explicitly do so. Signed-off-by: Lorenzo Stoakes --- tools/testing/selftests/mm/cow.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/mm/cow.c b/tools/testing/selftests/mm/= cow.c index b6cfe0a4b7df..1770ebc3aa13 100644 --- a/tools/testing/selftests/mm/cow.c +++ b/tools/testing/selftests/mm/cow.c @@ -793,13 +793,14 @@ enum thp_run { THP_RUN_SINGLE_PTE, THP_RUN_SINGLE_PTE_SWAPOUT, THP_RUN_PARTIAL_MREMAP, + THP_RUN_PARTIAL_MREMAP_RELOCATE_ANON, THP_RUN_PARTIAL_SHARED, }; =20 static void do_run_with_thp(test_fn fn, enum thp_run thp_run, size_t thpsi= ze) { char *mem, *mmap_mem, *tmp, *mremap_mem =3D MAP_FAILED; - size_t size, mmap_size, mremap_size; + size_t size, mmap_size, mremap_size, mremap_flags; int ret; =20 /* For alignment purposes, we need twice the thp size. */ @@ -869,6 +870,7 @@ static void do_run_with_thp(test_fn fn, enum thp_run th= p_run, size_t thpsize) size =3D pagesize; break; case THP_RUN_PARTIAL_MREMAP: + case THP_RUN_PARTIAL_MREMAP_RELOCATE_ANON: /* * Remap half of the THP. We need some new memory location * for that. @@ -880,8 +882,13 @@ static void do_run_with_thp(test_fn fn, enum thp_run t= hp_run, size_t thpsize) ksft_test_result_fail("mmap() failed\n"); goto munmap; } - tmp =3D mremap(mem + mremap_size, mremap_size, mremap_size, - MREMAP_MAYMOVE | MREMAP_FIXED, mremap_mem); + + mremap_flags =3D MREMAP_MAYMOVE | MREMAP_FIXED; + if (thp_run =3D=3D THP_RUN_PARTIAL_MREMAP_RELOCATE_ANON) + mremap_flags |=3D MREMAP_RELOCATE_ANON; + + tmp =3D sys_mremap(mem + mremap_size, mremap_size, mremap_size, + mremap_flags, mremap_mem); if (tmp !=3D mremap_mem) { ksft_test_result_fail("mremap() failed\n"); goto munmap; @@ -988,6 +995,13 @@ static void run_with_partial_mremap_thp(test_fn fn, co= nst char *desc, size_t siz do_run_with_thp(fn, THP_RUN_PARTIAL_MREMAP, size); } =20 +static void run_with_partial_mremap_relocate_anon_thp(test_fn fn, const ch= ar *desc, size_t size) +{ + ksft_print_msg("[RUN] %s ... with partially mremap(MREMAP_RELOCATE_ANON)'= ed THP (%zu kB)\n", + desc, size / 1024); + do_run_with_thp(fn, THP_RUN_PARTIAL_MREMAP_RELOCATE_ANON, size); +} + static void run_with_partial_shared_thp(test_fn fn, const char *desc, size= _t size) { ksft_print_msg("[RUN] %s ... with partially shared THP (%zu kB)\n", @@ -1181,6 +1195,7 @@ static void run_anon_test_case(struct test_case const= *test_case) run_with_single_pte_of_thp(test_case->fn, test_case->desc, size); run_with_single_pte_of_thp_swap(test_case->fn, test_case->desc, size); run_with_partial_mremap_thp(test_case->fn, test_case->desc, size); + run_with_partial_mremap_relocate_anon_thp(test_case->fn, test_case->desc= , size); run_with_partial_shared_thp(test_case->fn, test_case->desc, size); =20 thp_pop_settings(); @@ -1204,7 +1219,7 @@ static int tests_per_anon_test_case(void) { int tests =3D 2 + nr_hugetlbsizes; =20 - tests +=3D 6 * nr_thpsizes; + tests +=3D 7 * nr_thpsizes; if (pmdsize) tests +=3D 2; return tests; --=20 2.49.0 From nobody Sat Feb 7 21:04:59 2026 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 88FEB2571D1 for ; Tue, 22 Apr 2025 08:10:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309428; cv=fail; b=F351TuuKVKnfUVFv30lfK3t6dP681JmQEX993CH/Deo63hUNH4Uqu8yABzSJ9mEv6b6fEW5mJBEO/55tsaQE0c3GA55vVzmUnnBx999LI50Bq23fPgwlcWkpyx/4cTZgM+4guRCO0R90qGH75gYXEkhp7/EjkefydXahFElkQcU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745309428; c=relaxed/simple; bh=kCmARXBD/fKrsi0pim8tUNY6DjZN0F2nQm3WOOazIFo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=LQXCGr+EYRdIMLfTCS4emelAsCRCisi92ZfEV7kAKnzGLUzm6HzcdrILPcgNnzQJGGzr2uuc4wuIhT2se7fQciWn/8vkXrdaUZpA7sBRkX8fgDYZVqz869HGDW649b+rNHSP0hkKX6noUDM0BEavNqVpVYcCYBNe5Yka8vIidVo= 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=WInOBLPS; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=OzUrKMT8; 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="WInOBLPS"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="OzUrKMT8" 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 53M7MwI5006163; Tue, 22 Apr 2025 08:10:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=49C4IEW9mDvC+0A+Ji8uvlehZPCs4Q60woSqBCHMaRo=; b= WInOBLPSZHEgXIc76JAAx88fYa1cbbqB7pZNdzeyCw2Yt8duGnc0NLeccDxpIah5 Ga3UyEq7FbvwuJ36gVVYi9A/Hg2OS9b0ps6nyu8TIEiRc+jluBh46E3B5bKflv/z RMTEt0Ud6YIwKQfDtOiSZMWQpC5mO2RKego9O4TutetHpLKxFog1orwV1wq6EfTM cYFbSzHmcx1EmsQawlj3uq+7SxsqdAGzlesqHl580AZTTvwDFygdq141mrj00KTA ngYNtL8l4ZtDTpyH91O7d/NC3N6uIbK7u/uyJPVJLdF7LbCL3vKJUKobctXCb3P+ KachlaxdYFqc80ZkKDjUkg== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 4642e0byt1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:11 +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 53M718nY021110; Tue, 22 Apr 2025 08:10:10 GMT Received: from co1pr03cu002.outbound.protection.outlook.com (mail-westus2azlp17010005.outbound.protection.outlook.com [40.93.10.5]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 46429fhsts-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 22 Apr 2025 08:10:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VW5SgdifCgNS4eg4Jf/n8gvFpPtmUXhtnY5QoqFu+R7zH6E/RO1vibh2WTj7yhxcenq8tXXJ+rQWiyssdXuv1fc7ypX0i0zq+6lP8vkE7WYweSSWvnTUff1RlZLlreDrHk4+UA5HV1ab4HqLKUG12h3DVsrm+P3Tiss9Wjx3HqMFvAbUYDk5mPsqQZC7bhUWEQoCzkOHBDqluod7TAp/UzphrAQLX7aQZRocaAlrEk3yj+CAlHG9IaARmTBxl2W5du5acrMMDP+zX5NggsiN9faiFZcPL2lFofiLn1fb3YyrmmThqjIjiAj9zrzx9NaN3MhPn3XndZ0ouEo2W0eMdw== 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=49C4IEW9mDvC+0A+Ji8uvlehZPCs4Q60woSqBCHMaRo=; b=RwbRZQJPPYQSETPvLLG3aeLhGw3rUO3ofB83UhrHZNljxiYpwPEU12KjeN5KurN3TAqdibGNwHyP/BpSIBaZQ2qQSOwRq9fBcgWtu2soDtYCgXG9GItG3BnT9etWHN4UxN4cYd4IGG3I8dPk/Qmk1Bw2i/OCefyMqq0DJidWgG0rKrXRkoPPrK+XBqEfy1v1BULzG6IJOZ6zEFZbKY63ANOSdN4W7J5NDxZyLpuqpDy7PMQXjMkGno46hqqrI53Q0zPbN6RZZMJXeYmOP82uIipQ6PJVhByWTS1Y1D8xbD/Io7oLjnxgCP+h97H3WvrM9QR+Nw440s+yWIPPLg6J2Q== 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=49C4IEW9mDvC+0A+Ji8uvlehZPCs4Q60woSqBCHMaRo=; b=OzUrKMT8aWeP2hLCpcJNPad0Fk5a8+LbFY+Ov6FFU55ShQMwlHUaCfQd7CcQ60tM6Y59x86C5DsKf4TIt+Nn2gvgashLm4pzPO65lR0xJk76QFRJVK0r3HHvc0qxr4bG0e7wCiFLg0PEEsOw/D4yN7cjPphF/JxvwqBofTPKbbo= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by SA2PR10MB4587.namprd10.prod.outlook.com (2603:10b6:806:114::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8655.31; Tue, 22 Apr 2025 08:10:08 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%5]) with mapi id 15.20.8655.031; Tue, 22 Apr 2025 08:10:08 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , Pedro Falcato , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH v2 10/10] tools/testing/selftests: test relocate anon in split huge page test Date: Tue, 22 Apr 2025 09:09:29 +0100 Message-ID: <74e3cd0ec7af1e874a247d9551d759bd3113a08b.1745307301.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: LO4P123CA0586.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:295::7) 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_|SA2PR10MB4587:EE_ X-MS-Office365-Filtering-Correlation-Id: 297ea37e-f209-4fc9-1be6-08dd8175189a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|366016|1800799024; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ZV5Agexf4XK/2ejwVPha2YRZVRFroC4CNyrhM+mIztF24E0GsW9E1HSHnIvs?= =?us-ascii?Q?Cc49kMKeJDLfbqsd+/+ipUB6NsGpk+pU8R7GkD0zMSNA+xNubsZDJ5hXDOON?= =?us-ascii?Q?71/jPiw1uIBksGJXH7VBLPYVgfmxF1opp5rNkjkSA8FdGGK2RsNcN/NkY9KW?= =?us-ascii?Q?rK9InOyILucctXeKnnNssVxinZRKn9DRo1oYOQd7zkHBhW/5jK7VFcdhx3sV?= =?us-ascii?Q?ENHoqJ6B3UL1VfmgjnWRk7f+BJuREkpLXEu70Gg7Of0mvtwlAKnR9njQi+we?= =?us-ascii?Q?0+rLu1CR/2InoWZzp3Pjgsc5hWKCY/AquLmvequw4GU04HDCjJOmB7r8OdOz?= =?us-ascii?Q?wxJdYHGmMUlGqXC9uP8ndZR+Z1knY5BrDAFQ7GXlMX7olc9A3Xb57oqu3S5P?= =?us-ascii?Q?Eh+rGXwx6bdGqVv4tP+h7KCOUxkU13/tPCRhiCFfCT+3K6UVCkPA6fUZhA1V?= =?us-ascii?Q?FRCnqoxAv7tI8ephnKMdjeiPt86Da0oFhfm/0MRuE/WOta2JtgUwNa60vhQw?= =?us-ascii?Q?RvvDUyDh4SzD91dPNzM7GJkfsuIFr9LNHXEnFzWSUcFNBsODSR0PuQcLEr00?= =?us-ascii?Q?WwTlNFXgq5JVxq7i8owp7bjRQUAjiobwW3REhcsgZWKwo1c8JLy/RXpcbHEq?= =?us-ascii?Q?zqmuwVJD+KlrEst2qffopS85L9vy/njavV5B5tWxI3rSzjp07AhKzqG6BE86?= =?us-ascii?Q?8/GjXvJmq31P43cbtzcyT1qFv+GqCjL4pTM8w8jWrgrKqeVgI4Rnl2SNr3UD?= =?us-ascii?Q?aV2N9KdwVW7eu7pKWyKjIVJBZ/sHJMeTD3R1W7hOJ7ljxKG2viYGv4vx2Reo?= =?us-ascii?Q?vFhsknEfYp/mnD62r4Bk6ULAnHlQLN+cUHvdlL+/U6tgsgN/4ULyPnfX7bai?= =?us-ascii?Q?oayd4i1G6m/EuyVv43Xa9ejFrfEuBETfBkAyDhTjBTxbmLO+yWAXPcVl3Yzv?= =?us-ascii?Q?s81MroVtlC7Zr+1PaB/4RP7/5fMQXBy32RWcCIA0wYuW4P/2luB7LiMok8TN?= =?us-ascii?Q?vyrOItWP2eA+lH+0+DJ+p+E1vq6qvh2dG/vuw+YYqQVxDanMIbGfs2wPph9H?= =?us-ascii?Q?tCMRjSdNhxHUMY1VbEnT5fz6VjVO50sZV7sk9yWtrmh3Gr7FmwTA+PWwxlS0?= =?us-ascii?Q?u9Tn+X0OJZq/2vlW+RKyonEQJQ1yMiD7ujRdJcq9Z+c4t75bqNW24FZNtAEz?= =?us-ascii?Q?YUDVecnbuDTL5JLHrSidsle1fyUahENjTYf0jlGq+erR/9SGhC4A2omXeDxi?= =?us-ascii?Q?MmBx88ymdO/taGEygdqkYwdApRV8TDAmUL0fWNciVmXg51LtXBYoonoZnyfy?= =?us-ascii?Q?8/u5fkhI3nX84L5i0L8PTPIl2RWhWl6c1qtd/ne+NlleFrWwuxifa1aLjCOy?= =?us-ascii?Q?9PIMwyEeOjjIrtJbHPmCDRHfm3/lj8KwNVSEEYCzCY+fWre9240V9sqhh2M5?= =?us-ascii?Q?6GtqGETsemw=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)(376014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?tv4vsEmFzOOo+EeIjSnvtnxbeyf83nvGdCtRrMxW/Bxf7Ch3lFJvKhBdrVsS?= =?us-ascii?Q?h5zE/NBzdUXmYzbvm+l6j+kRc+FfPCt9nwSal3qGR1iTbG8u0DGj7AYJLCuC?= =?us-ascii?Q?MazDVWYGsc/ZRga98ZH2rtJuI/3U4m4HTTEx6xZFOrfPFwXr+TZk0BqQAXc5?= =?us-ascii?Q?lzQvx2hOHDbRWKWfD2dE+3SW5oU/wwk2LPn2MYHylGB8F6jC9zJuJmFP5TTF?= =?us-ascii?Q?Z1F1sl1mXxUSs32rsOEzLGmkiUBON5+I9z6CPbKArV111FzwTUCNiLSDY3tj?= =?us-ascii?Q?bvWEzzUWQ+Q99x0ik00uDw0cLRlhy6BRkebTeFbPMlkPp+dPWtJjTZNFi8mG?= =?us-ascii?Q?0gd8WzFtmGMxOmNCtd+pDmBEuVJVLIHBTAjNLRpEe25tNXtw/agqOC6AAem1?= =?us-ascii?Q?4oCclAxKMM1wR7pKYXxA342nAMy1f+zoNSeE+6wG/Kto9Tp1X3by41nI8M1J?= =?us-ascii?Q?KEj0dgo4brQbG38TsTc8A0P2GYmu+EYH1BklI7TR1Pcc0CYZId2zMs6t9Bno?= =?us-ascii?Q?ABFQm0MtN2LnfsJTHMR42p0snjPAl8lt0c3Fs1vzwPXo1Mtv67+Umz7gSexl?= =?us-ascii?Q?QuDsXbuwxzBtuxq9hkzQSUrrEQqcOmwAxCiA4GMmDtziQ+46ErE1b+gxuydG?= =?us-ascii?Q?tguSWChSUVfg3qs2+ayIwmJ7afSlT/SuuCIjrpEvMJcczG7WxQP7M00uyXRw?= =?us-ascii?Q?vCXFx8LN4zJIMiEHgeBdc1NFcGy4CtxcNVX8Xg2t9vvPdzGPM43/I8KJ8QFG?= =?us-ascii?Q?r1rHVlosst6Nvl1Zh0IQNde4rKAEiRYcCxE22bwHWPL7jlLpkipauTnhaGLm?= =?us-ascii?Q?WOaTv+PS2bCa3PfOJiX9uEHH5/kznc5zQQKcaQ/mRzB+V0W4D/BFVq5J1ear?= =?us-ascii?Q?4yEgs39FjFhCuTiBqdVXDY5N0Us3/9e09CMwukRVLRFLMpn347koSReuvu0k?= =?us-ascii?Q?jfR4Subgo2V2jgKXpdjkP9NV3znhROlwfT4mFNWkIw4+Jlfqj5UKYaNkqw4N?= =?us-ascii?Q?jrdBfWtdxOcqcR8TGQZ5TMONVSGJFezEwXfFgaKnljlg2jzdPCVjtxyddt0b?= =?us-ascii?Q?F7w54StA1M3/k6m7G9iuGfrr7FrDMeEIZxMpN7TT20gp2Jl7QLl1esEhOA7Z?= =?us-ascii?Q?vTLSCJYNs6E8silSOrpgEoURPmas8u/E0wgQ1z/RJHIOc/Ki6wvy/Zus6FgP?= =?us-ascii?Q?hiZcZu23lMsjCRQoMRnik0+Ql0Ii7bz4tjxxZCW03dTb6xfNplkkmMGhl2Ca?= =?us-ascii?Q?Q05EpIHm3oNS+AOr1HAQkPSWF1lFMz6wJJ+lYWNjQWuTv3lQIl6pJ/6Zt6QH?= =?us-ascii?Q?RGILwb5fD0wy2RXu+DtOGAPEIGNZEP30UWyEu9uEf4oxdJC0hIuO97rbtdpf?= =?us-ascii?Q?LlLqksDDUBKLPnouJ/wj0jdJy7B5VZil643dScUu9kV+IdWrbEPAQWGg9SY5?= =?us-ascii?Q?qZKA4iq8OWEmfEh9sP3NthOsUD54rMk6ybSkxdBP/SG0/qIOpdzmodq3Ot8g?= =?us-ascii?Q?yElw9Gv0j6AVr8dYUVXUq+X7es6WBJFMW5kJ23Fdw144LNIEB6jWkWjgT3VR?= =?us-ascii?Q?NFnaKf43ctys4kBp0JXnV/d5ZEJGuC4/5LRRQkaSweRWJ80ixcsV3M0Q4jHk?= =?us-ascii?Q?OQ=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: DpsPBfnWsqaB3JLiNVRCrYjA6cVmD5tmxo3/2Rs2V6JY9EPOomV9l32wIJ1Y8XhDJH+Vb42OkVm5+RdUJi704Gw9p0Yc8nScSVcNv/r/d4V1Uh9REAIQZ7uhufB4M9ovIQ2JDndwdlBJzHm/tD9z5NPZE/vdTxKJHc48k4JauKOsRwpEBeV4+cEvnqCB6LoswgOR/nG1aTG/0SOzU50JD0+0H+vNDYPWGFVFfK5/l91IWYokr87C1Nf3Yxi7QpQXKlkLq8isxuyNuLut27aLALnRSmK5Vtmgw8Hfdwxn0+D2+mizMrcPuzEJIjmXiQoVMd8q2/Ln6FwS+oEoESjao18bvmZCQIKAkdx/3XnvwUQXDAsabniSOau8/+okus4fHR8nBcD1Kvlr5gt+dNsdfQvSGmtALO/DjdRf3Ruxog156MFhviTH6xQX4oWIMtElDzvAsTw4W7QMPaVkRTrr/FD7MPry/eUTVExoUT3tdYJb1PSeiDT/M06Eeg3iWbwC/aDJaZMSNUpAb2qMh9heyJzrSfRBUl1HrbDCOBgTD9LxPEyfBtY8uPtM/EsqGP3EPUhnIsqT0qpzX2s8VMA5Md0ww0g+18jTcC2aGoGxltI= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 297ea37e-f209-4fc9-1be6-08dd8175189a X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2025 08:10:08.0960 (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: eEVh/zROo+kjwlgRfcc2o4QFgqIiaIL2GXvYG3PEDYEbGmcUdK3AfdYy5Pf+0oFddj+DgTlHwux2oB0VFR6aVzSJNvaCyjF/Zyl4vgQfLGw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA2PR10MB4587 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-22_04,2025-04-21_02,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxlogscore=999 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504220061 X-Proofpoint-GUID: T8dIJ1G483FnEFUZkrUeqTqktgJJ1_ny X-Proofpoint-ORIG-GUID: T8dIJ1G483FnEFUZkrUeqTqktgJJ1_ny Content-Type: text/plain; charset="utf-8" It's useful to explicitly test splitting of huge pages with MREMAP_RELOCATE_ANON set, as this exercises the undo logic and ensures that it functions correctly. Expand the tests to do so in the instance where anon mremap() occurs, and utilise the shared sys_mremap() function to allow for specification of the new mremap flag (which would otherwise be filtered by glibc). Signed-off-by: Lorenzo Stoakes --- .../selftests/mm/split_huge_page_test.c | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/test= ing/selftests/mm/split_huge_page_test.c index aa7400ed0e99..1fb0c7e0318e 100644 --- a/tools/testing/selftests/mm/split_huge_page_test.c +++ b/tools/testing/selftests/mm/split_huge_page_test.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "vm_util.h" #include "../kselftest.h" =20 @@ -180,7 +181,7 @@ void split_pmd_thp_to_order(int order) free(one_page); } =20 -void split_pte_mapped_thp(void) +void split_pte_mapped_thp(bool relocate_anon) { char *one_page, *pte_mapped, *pte_mapped2; size_t len =3D 4 * pmd_pagesize; @@ -221,10 +222,14 @@ void split_pte_mapped_thp(void) =20 /* remap the Nth pagesize of Nth THP */ for (i =3D 1; i < 4; i++) { - pte_mapped2 =3D mremap(one_page + pmd_pagesize * i + pagesize * i, - pagesize, pagesize, - MREMAP_MAYMOVE|MREMAP_FIXED, - pte_mapped + pagesize * i); + int mremap_flags =3D MREMAP_MAYMOVE|MREMAP_FIXED; + + if (relocate_anon) + mremap_flags |=3D MREMAP_RELOCATE_ANON; + + pte_mapped2 =3D sys_mremap(one_page + pmd_pagesize * i + pagesize * i, + pagesize, pagesize, mremap_flags, + pte_mapped + pagesize * i); if (pte_mapped2 =3D=3D MAP_FAILED) ksft_exit_fail_msg("mremap failed: %s\n", strerror(errno)); } @@ -257,7 +262,10 @@ void split_pte_mapped_thp(void) if (thp_size) ksft_exit_fail_msg("Still %ld THPs not split\n", thp_size); =20 - ksft_test_result_pass("Split PTE-mapped huge pages successful\n"); + if (relocate_anon) + ksft_test_result_pass("Split PTE-mapped huge pages w/MREMAP_RELOCATE_ANO= N successful\n"); + else + ksft_test_result_pass("Split PTE-mapped huge pages successful\n"); munmap(one_page, len); close(pagemap_fd); close(kpageflags_fd); @@ -534,7 +542,7 @@ int main(int argc, char **argv) if (argc > 1) optional_xfs_path =3D argv[1]; =20 - ksft_set_plan(1+8+1+9+9+8*4+2); + ksft_set_plan(1+8+1+1+9+9+8*4+2); =20 pagesize =3D getpagesize(); pageshift =3D ffs(pagesize) - 1; @@ -550,7 +558,8 @@ int main(int argc, char **argv) if (i !=3D 1) split_pmd_thp_to_order(i); =20 - split_pte_mapped_thp(); + split_pte_mapped_thp(/* relocate_anon=3D */false); + split_pte_mapped_thp(/* relocate_anon=3D */true); for (i =3D 0; i < 9; i++) split_file_backed_thp(i); =20 --=20 2.49.0