From patchwork Fri Mar 21 21:54:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026075 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 144D7C36002 for ; Fri, 21 Mar 2025 21:54:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 78782280002; Fri, 21 Mar 2025 17:54:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 737F1280001; Fri, 21 Mar 2025 17:54:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 51529280002; Fri, 21 Mar 2025 17:54:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 2D191280001 for ; Fri, 21 Mar 2025 17:54:56 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 990811C90B4 for ; Fri, 21 Mar 2025 21:54:57 +0000 (UTC) X-FDA: 83246913834.30.C97FB79 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf08.hostedemail.com (Postfix) with ESMTP id 09F61160013 for ; Fri, 21 Mar 2025 21:54:53 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=AGaLxbzk; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=rYvna223; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf08.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594094; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=UK3N7z9rS5OUy1NsR+1LhyzbuT9Y2t80AOpNHR8/GLY=; b=QYXW1yRz2Wa9cYnY27l0NPc+0q8IpitpifDLmtMt8joSVLQsDnmNJRmZUIcC791jFqjk2g NIXfqYOdg/1WrtOa615cCJZ0FOb8VPZFjYb5NpqRB3khG+FFgv+iMli+mGqPRrcSI45hNl jqZfBoggLxWi5MhOqTjjQu2z7AdIdjw= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594094; a=rsa-sha256; cv=pass; b=HUZtYD/8j2IRE9OSWkWJA8jipxkUm6m08C7pv4W7fnNv4QU+MHn4PUT6+yyWGK2hY6YjOv vzGWhIgrBJ4qbL+obk+5rS7GpVxD0uqcwdkXEMLFeQlGsw7pdCtHD7LA6JLXbcVlQYuhGX ZGKhcUP8e1Okln0Gc54W4KAvV+yk6JM= ARC-Authentication-Results: i=2; imf08.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=AGaLxbzk; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=rYvna223; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf08.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") 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 52LKg7IO002478; Fri, 21 Mar 2025 21:54:49 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=UK3N7z9rS5OUy1NsR+1LhyzbuT9Y2t80AOpNHR8/GLY=; b= AGaLxbzkYCCjCsmGjSqHyQtOU9td7AmC2vjFh0sTWkFz106njqKMZbqYh1YFqimc zwfRBnZ0leyjf3e56clHC3ZsQi0YfPZC2AqMNhLW91XO8ZLTE+WPGuWici2bVced NWc6xB5EN6lmeYfd2seQ6JRqXI5oqAJG7AuswiV1L4vtR2+BsF75875ZDBEGr8fu kBtmSlq3ZskSPObMm8v87pEqnZQWM2VN6gVrwii/nsgoN7yVu4IlaVPcDWctgWd7 RGGs6qDCpSMOdMif1gvDQTTaY12NABaHIx0kxvb7+XjyPnxOGSTeUbItyt2o0kCQ VoOLP321vRDhILz2kV1UoQ== Received: from iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta03.appoci.oracle.com [130.35.103.27]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1m19qq9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:48 +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 52LJjRlX004553; Fri, 21 Mar 2025 21:54:47 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by iadpaimrmta03.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 45ftn014px-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:47 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JGrE0qwI9HlCMOPmAuntz6wRrJZEd2LUf+9Gwy4BpAMlnNvQgG0BHYtRv3mJi99/snrnlNP0qt9MblJ/X2yGOi7FnoI/rwWFqJvG3D8soz3PAILFrL9w0VwI8V2FHvlSn7kqkASaJaLh0zZtBF9Jr2rXeU4ZC02zo0Sgh1Rkukry+vFlBOirgQEq635Rly91ovYBGr9dbhunk6Vf/fp0taaDfgo9CUlMtYnoU33faGNxmujzi6/j8qEW7XYy96y36JKYtWQAsajT3+pn6P+1gQx4PG7yq9aFKmxtgXfMlHCun7vwQXXYlDNFseSbeZf1TWjtsJqmOmxEtmy6QiFT6A== 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=UK3N7z9rS5OUy1NsR+1LhyzbuT9Y2t80AOpNHR8/GLY=; b=WJMOLpJkF35R2nbsgUfPux51z1Ye3PCVSRJh5K5H8ulbpRw4/FbAKgmsifGkvrKDkU/wJF/FlrXIzXD6+Psa1DSn1MLWVk3Tn/ac3fA/w/mI0ShnK5366LI9L5CdMdzqM2H/UBtHhqHeUa9YduPm/yG3g/3VtOnGSUj/U8D723jEI7aWeDkuu1O+YQhQLwQiCXFfs5lqjN37ll83S8q/OKVVcJrvxwdyLo+u+RLLw/lYeVDE9tOZ/t2ET9c3tASiXLOsvnhXO9QIj9hP+QlyIs8N0l7ebj8CpYO83ieGf3GwRSeItrIAqmqF9aOran80/ok+M+2TnplRK94oMKWOtg== 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=UK3N7z9rS5OUy1NsR+1LhyzbuT9Y2t80AOpNHR8/GLY=; b=rYvna223JvmE0b4DIzXFuQo1qTM53Dq1C5CxiYm6hhv/lta0qVGbHXhgjEAaHeTVnWMkuSz7YW6CbLf2H0QXY9u+1Dk5ktguOZRURAfp6l0ViX7JS4VktcRxGZxLv9o68D8leJCXW4z1FFU0WfwuZadY6PRtnAvx5eCJqQuXDIc= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:45 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:45 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 1/7] mm/mremap: introduce more mergeable mremap via MREMAP_RELOCATE_ANON Date: Fri, 21 Mar 2025 21:54:30 +0000 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO4P123CA0344.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:18d::7) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 7176d18d-1bca-46e2-0246-08dd68c2fdf1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: DfNEdLfPST5K4/kA5GnGAyf4yxopBkVtQFsmbtt7ou0DZMb1Zpcqv1e7ZBjyqruCcq/RY2qxK1ZU98AAM9geIjE1FwDCvDbuW9e+fxoSHPIsWda1wNl1uClNVvzuqAyszbgGJ7a5qFm8pExYjWwkSuCr84XcyhCCxjYTGkQr3ziWXwhuU0d4Ue9S4dgW6oa6PNYWhqz3zjt3iNgLxJnbd8RcPtIhKu7mgMGOdS3678k1J4Ubc5LK2VvprDHqqLsYDWsPa3wobK9LI5SjUGGQVOyOGxU5PMmBJKCAJjaRcek+YG+CAAQTF0uYniSd4lo5n237ixzqHF6vlPz7oPSPif2cupx5yMCm1qpPjvkXFmBfznSJ5GoixJ5EcM/CbeOYBjIL3sNmgX+pFZJW3lDWcliWwKcokJ9z4yiml8oUDc3JiDlmPba7gZJBNMc3iSBYLHyFYre17d4PX8DVlY2nW8ZniDelYDnd3zKpc6/B7xwI4/GSaPdvrgLTK1DCgfiK1sjK8cwOydeBvw+IEMROPMU2mPt26UkEy9WMpLBOHysMvHq6fTnuLh5rdLSd+EcPTUvCHk1pdnwf/UXDLL1CjxQqw/LJQP3lhrh+FTG9B5C3SshdugznpCTRWataFAr5U6E+iQ0w/Z/zHd4c2mNZuWGhr/1N33K+AVPRMQ0QCxc4lDuHm+rOFPe/d4s7AYZvzZFY5WdnoBxR5ho8v/Bzx3ifGZVT12z4oWG6ceuqk32xX0pd1HjGCkg53LJG/01iYv8XdJcKNcuSTKDAjnW6LC8e45Q5VCn9o3Y4HV4S6UoDo/7ZZL865Ea13o2aziSsISWCQ3zjgZdqk+Qd3ANXutKfGou+Jt59/3NHc7afJGVOe3ldl4+3f2zxrEVg3D3TY/pkGi4HWoRK5/+FPQ8EyejxF8edfEUYL9SJbiVWAicfVwj3ClniVfIs9BZII1InKUPzndKKy6gZs/+TZwxcPOQHN8Ml9Dz4HnpbhhZZTURgWtz7MUuZ+YWu0fYFNpkMM2X+r0nBJtsIvq/mtEG5tw7CvsS2ZSyxScIFMx6GR/LsHr0M+wUbwCWH6SMH3KVrV9bAGl7SocW4W/MNCfclingOuAQXbPMm34lQWNnv6Oh9I8aW/oD+r/lYgrdRNTRZW3jxqU2GnTiUj73mj5Ee6KpoP28a9nuR8MKNaOSD6jv2/CR39l8Aun8dm9IpqrNxGCZyoaz2W8KtdYSeM36aw2E+zwMBn+LvCSyHZiq00O//TyFo9eddA+bsMXZcT58MwUt8ZfxpVx1TmiyyT52USwAmUrPhlrQSummVhho9wY4YxeZ+cwzXCLkqLxNJcNR5Nekh2z5mfP0Bl6q8MqFhoi4JqB+uWxYRxvi0nmbBCBah4lFqK3O1fEsxd0LIJ8gc 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: MuzzvHtR/Dtoiv3oTQVbG7Vs4d1PsGvJNcAor70/5o1p5EWZiwkqRBNcaE8yYMuGolDuS9yL0YiP8kOOrYeJBvXJJRrqJ/0G+KkPSG1ai5Tz8TjL02qUkE9AeZv8duSH377wd0eDXGBnqQ/AudFIf4EhIdOubPzxQ5BqD26a34UTjnj4+APnrFCokMORicvKI21TNIugJ/t8bNWDTTRCOu9jpsaXrv/KyfJkgchBX27qPM9S12xRQvYer/xtXj8UzOqoEFyBdyukSEmaSIQSGco1B5+pfHn8w/fLAx7dVj4C0mRTqjzkKR2trJaAi9WdV0uLq0UxpGrZGU19gj1Xbhba1fv3+mRE/ED3ng8VfdpdF+AwbzROGlNhgcGxMNoVNLXgubG2ayPEx6Yp6WCBPA/ybARxJJM90Hn+H+zwunwiZpNYcCkxFT88XD8E9d9omHsJzuQhakWmpaF3Vn7kYYTfl2jiNCQhOHCOvzZG820urpOFJycx7+8DCkCgqkBnCgKygHpOHrjHx2Es1HyHksP8TQD2cqun9qRpk8N3XreM7wtbQcJ4SnyjkD6+S2DWB8HJqNc5UA5/YwYJ7/d6P0JC2KE5VfJKJwN4+ID7x7Ss/P7KK1e0e7QRpBgBAjk+YRv5dNRvYz2UUWcPTznDq1tuZ6U+1KIlAQNHJu7jXROOqObWnQ/+RHC1XXCoDEY8DOLvFlbuvSRiDcepxwfQWXtrKBGwETckBNCPEKz7/uaky+irbk/ApmWHxqBoJNQcaw6GVwqPuBWMF6o+T7y9WRYSOhgIC5HhysBkIRE/YJAokEHq5UKo3ocTqr38toslUamQ+3QDxb9pmGfRb9kg9f3b/ubttfSKGWNrJIRxDDZG306V89ycnPpwykoLOnBtD3GnvuCJ+gPONIsAflFQIRVPj9u8moLPYA+onEjzvBVeM9Dv5COOFpfuGPbZuHbUu9ZmKgj9d2/C/j2sIIvR/JC8l0Yjc5fJSOncrJS8wAnI/2AOLpWTT93irWE9DuAX+Q40r96gZt/Rthipr5Iwnd3jHme7LkIqtuc4F0BPXcrgs7IFfdBrfBqnpUDF0ppY+AQZFYZDx54J8hF/Uj1RCYm++9u/WVmPe3NzMwmsVxgOkW05sR2/vHmhHRFoyZMpsk1fcJwry84VL9gBatqeQHsWF+p89fvDaeZiTfPCtb9eAjljU9TwpfuMLo1/FmIM3mhnR00wAO/qICbBE9tV7Bn9bvkE+p9yTh5FetyQDNC1SIfIn9ungT4yAD6E/ZOQjyyyoTAB6jxtPi1HHEOYdetMuI+kY16zmVMoJ2kNJr624SLoHZugJ/HqX6KhbXoh16IpsQ6DN9wMysTK2qheM+MST9bR5I5ilZn1+pKeidRsQ8/616AhCG8gCJuvm7JIkTLSzRvZk/gM5SWhIMdj1jVa2XBMzh0jRuxj965lIiXuH+YH0M7j8JS2Sq7UKG5R6hdULdwyzomQ03C311hw62hwKm4JKGK5EVoj0D8Na7EF8bXDYJ2rH25jGj+BppNedBTS9EDUExVSnoYyLah43INwiXFlxgB2+r4DNWqgMKHCBBDq4Oz1vqtxhKTaLiUxBz+QkfTA4KhcShr4gjyq/Q== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: UtdsmovZunmHnwMXzNZiABChcURXq0M7ngzLBWzb85jMdEsna97H56D80TaDzdI2QE7JoWeGhG3jeztCCWCvspDAa/EjzpB024sMulf6pWwvF2wAhRrbULYvdA7opR1urBx+V01dgq5i6KgeghrtILukWTh3UxFlYoaXzfEXSAD9fuptWtXZ1QtaFQlrXGCKdykvhAhAdgC4lTl6lw40EVVW18+Ld6hGDjoe3SFCqFMOictE5uJpjLg4JwNhXQGFvIHUzWaNzJ0KjKaWprujiW3dDxZ0dUX1v1YhneU2n5jtwHDmVRUqhEuqAM+LGqJRSvMinXsNAy6GGryDn7NxsCdMQiFpX2cPSpNr83mHT/D9cIsI+MR6wsLBU3I2cZONvgu30Mtnm8GUpEw6cyNPhBrbblLJQ0PrGbZ6Li+X5cT32DAh1gBTgmJJZSGuyg5KpRL+314ls9eJtXlYkEsp4kZFLEj/w+AwuIt5PvxDBYHGTFHXHR38QWpLpoS3AF5+uj4dDD4yMaSbl5ip55w+DzmBUxSJfPGtBcwtS9sMpz79DxY52NGXUcs8TfYphsW3KPPy9+jw4XpbNWg+MSYu8LuxHXUSFLk2b2Zh8yEv6sk= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7176d18d-1bca-46e2-0246-08dd68c2fdf1 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:45.2495 (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: JAQVfwsGkkLZWGOgILSc0+eOHrbj3FqqrWWW2sVEaNOrzHILbi6qhPzfo3kL9c+21ZnI6pTus3svcL1bxJxRF3xeFMbOn5NBs/PcGRSel4k= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 malwarescore=0 mlxlogscore=999 suspectscore=0 spamscore=0 bulkscore=0 mlxscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-GUID: 2dgXcV98jOr72PT695mSlOtlXD4TXQ7f X-Proofpoint-ORIG-GUID: 2dgXcV98jOr72PT695mSlOtlXD4TXQ7f X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 09F61160013 X-Stat-Signature: g93erunqczechgbrnbjytmq67jjkwngj X-Rspam-User: X-HE-Tag: 1742594093-109235 X-HE-Meta: U2FsdGVkX18AM3bvRV71VqBh8D0CpHvERbynOxYLF7YPF9YJfPlVsSxlhjkkNhhJoZuquQacDtjmhrdZ2Tbx/OxLF5Cey2epIIQP/gdC/HLyyvmbFOAtKO7aIBWdEJqvPRsIrpOD5oS4kgKat1L4pSP5I3uoa0sO/jnWuR8h1iqYc3YD7pLcr+yRoLySdyBXR1ZbaUrtBN+bqDBzG72pEjqrgzVtVxwEzjHkmg4FV4OhVeXjxD/U9nubwvTLHnM/Um8pGl7IHwvEdemcrMo+P9LjvXXgTV/+RrPM7jIb5qezrTUOtfM1+ifLopGcgUa8w2uenRSDept387EhadmAW6FMObgO2NSL0wTMbaZ7rdV39c7GxNeVtn5PWOX4SRio7V77W9JW4Mo/z62vA9fFH9RN+RbzG6Xc7Nxn1rCrna3sstqHewlr9D2854qb3kbvDzs3OT7mECjNFsQrdmMzmtmiW3LZCw9O+4BuvnT3VvAih1doQQCCHQnNaGI7ecuLPukWSEwzAgeqC3sB8Y6fil+JGmox++BtM7dBpsHt0qHyWJ+vZ0TTXDbsOhf3RrgRVPr2FrwXJCRObaZkek6JMCuZ5MjB4fLNeyCcp3xeBewRD+0idcToX0m1FTRJH+OAFj0DBSg/76c2i7AyI5DCxosyC5DlzjOeJ1KbETvflX3ucGMr/XuZI7+WUDcF1Wto3w68a64kK7+WD9NmdPnaT9dyefbq4LNkA80fCIlTKEOBXxcbHysQQBFAT+d1WANALHr10PYL767MLWSiSS8Hhk3D96X4uUCtNMrnUrOg5bYFXYgehi1ABI1zxvLUuV6O0SM7oDWbkR3P/ogY3hwY5j2OKMSsPywdclZx/wMa7cIGUU7jQlxjo2Yiebne3wZiymeU60StZe9zmLpvPlpJCq0Gaoi+0AOLl3qMkVCMukviYrrEEppUk8rxMXFzaTiTVWVHVIhVTEuXMEdzzvv lsi3oxA1 F27k65POzNer68ECrdGAVd1DEM2m/AiSqAyT5R2ryCqi3oangyvmGsc+NvNTb0Y4layIFNuo79ZcFB0qya+2Hsi8vrlX2kwqRZRj6VJinzN1UdxwHlqhVnsj6Gqv7heN3We4snDu73kdt+aAqZ2N3zmOjqTOKRbAJuP5Zbz4WcbYpv7kFWpBMumedqfz1XVcxuGuNHO+DZDn2jNU5p+97sh+59WyVf7ppoxiVdDu2/2BCXcKBbTdtffncpL96MLPx5zaZzM7o8vkPqVIpzb0mbJzampeLaE7uXWfJ4+6eko3X9zmXnjlKXnlU+oS27FArp8TAx1PUTJLrmhkA3hcfwvklXkO4SvSVHuvqGJw/gEnu5luZMfGGhcZamg5dZoJzuMvIvUrFxyhPTGqaT0YmVmUuiF5fVlScvnfooJOp6L2RXMa/PGrC6tw41IA2A/WTbDGNyZY8tfT5rYCOb01Zg0du6EkE1eAHFHGi3+lIsyiF016YEj85LKUIptpMI6kE6+0ukcm1nZlQ5qzqHH5ds9HvHJV1c7mpO+lIjp21+Mr2wjEVtFJLz637/i81EkArrfumbeYN+pQG+d6qF4av6ecsHk/O0zuVLrfGBwHrbyZD64sQ5OZkdl4UfjzFz+Os/ZuAI8O2QmzbP9pEMpG6PNHKyq4Si4yrTDOq X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 != NULL), the virtual 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. Signed-off-by: Lorenzo Stoakes --- include/uapi/linux/mman.h | 1 + mm/internal.h | 1 + mm/mremap.c | 354 +++++++++++++++++++++++++++++++++++--- mm/vma.c | 29 +++- mm/vma.h | 5 +- tools/testing/vma/vma.c | 5 +- 6 files changed, 367 insertions(+), 28 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 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 diff --git a/mm/internal.h b/mm/internal.h index 286520a424fe..7c120a6b0018 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 0865387531ed..bb67562a0114 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -71,6 +71,14 @@ struct vma_remap_struct { unsigned long charged; /* If VM_ACCOUNT, # pages to account. */ }; +/* Represents local PTE state. */ +struct pte_state { + unsigned long old_addr; + unsigned long new_addr; + unsigned long old_end; + pte_t *ptep; +}; + static pud_t *get_old_pud(struct mm_struct *mm, unsigned long addr) { pgd_t *pgd; @@ -139,18 +147,42 @@ static pmd_t *alloc_new_pmd(struct mm_struct *mm, unsigned long addr) return pmd; } -static void take_rmap_locks(struct vm_area_struct *vma) +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 = pmc->old; + anon_vma = 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) { + struct vm_area_struct *relocate_vma = pmc->relocate_locked; + + if (!relocate_vma || relocate_vma->anon_vma != anon_vma) + anon_vma_lock_write(anon_vma); + } } -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 = pmc->old; + anon_vma = vma->anon_vma; + if (anon_vma) { + struct vm_area_struct *relocate_vma = pmc->relocate_locked; + + if (!relocate_vma || relocate_vma->anon_vma != anon_vma) + anon_vma_unlock_write(anon_vma); + } if (vma->vm_file) i_mmap_unlock_write(vma->vm_file->f_mapping); } @@ -204,8 +236,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); /* * We don't have to worry about the ordering of src and dst @@ -254,6 +285,7 @@ static int move_ptes(struct pagetable_move_control *pmc, */ if (pte_present(pte)) force_flush = true; + pte = move_pte(pte, old_addr, new_addr); pte = move_soft_dirty_pte(pte); @@ -278,8 +310,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; } @@ -537,15 +568,14 @@ static __always_inline unsigned long get_extent(enum pgt_entry entry, * Should move_pgt_entry() acquire the rmap locks? This is either expressed 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; } } @@ -557,11 +587,15 @@ static bool move_pgt_entry(struct pagetable_move_control *pmc, enum pgt_entry entry, void *old_entry, void *new_entry) { bool moved = false; - bool need_rmap_locks = should_take_rmap_locks(pmc, entry); + bool override_locks = false; - /* 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 = true; + + pmc->need_rmap_locks = true; + /* See comment in move_ptes() */ + maybe_take_rmap_locks(pmc); + } switch (entry) { case NORMAL_PMD: @@ -585,8 +619,9 @@ static bool move_pgt_entry(struct pagetable_move_control *pmc, break; } - if (need_rmap_locks) - drop_rmap_locks(pmc->old); + maybe_drop_rmap_locks(pmc); + if (override_locks) + pmc->need_rmap_locks = false; return moved; } @@ -752,6 +787,186 @@ static unsigned long pmc_progress(struct pagetable_move_control *pmc) return old_addr < orig_old_addr ? 0 : old_addr - orig_old_addr; } +/* + * If the folio mapped at the specified pte entry can have its index and mapping + * relocated, then do so. + * + * Returns the number of pages we have traversed, or 0 if the operation failed. + */ +static unsigned long relocate_anon(struct pagetable_move_control *pmc, + unsigned long old_addr, unsigned long new_addr, pte_t pte, + bool undo) +{ + struct page *page; + struct folio *folio; + struct vm_area_struct *old, *new; + pgoff_t new_index; + unsigned long ret = 1; + + old = pmc->old; + new = pmc->new; + + /* Ensure we have truly got an anon folio. */ + page = vm_normal_page(old, old_addr, pte); + if (!page) + return ret; + + folio = page_folio(page); + folio_lock(folio); + + /* no-op. */ + if (!folio_test_anon(folio) || folio_test_ksm(folio)) + goto out; + + /* + * This should not happen as we explicitly disallow this, but check + * anyway. + */ + if (folio_test_large(folio)) { + ret = 0; + goto out; + } + + if (!undo) + new_index = linear_page_index(new, new_addr); + else + new_index = 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 >= state->old_end; +} + +static void pte_next(struct pte_state *state, unsigned long nr_pages) +{ + state->old_addr += nr_pages * PAGE_SIZE; + state->new_addr += nr_pages * PAGE_SIZE; + state->ptep += nr_pages; +} + +static bool relocate_anon_ptes(struct pagetable_move_control *pmc, + unsigned long extent, pmd_t *pmd, bool undo) +{ + struct mm_struct *mm = current->mm; + struct pte_state state = { + .old_addr = pmc->old_addr, + .new_addr = pmc->new_addr, + .old_end = pmc->old_addr + extent, + }; + spinlock_t *ptl; + pte_t *ptep_start; + bool ret; + unsigned long nr_pages; + + ptep_start = pte_offset_map_lock(mm, pmd, pmc->old_addr, &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 = ptep_start; + + for (; !pte_done(&state); pte_next(&state, nr_pages)) { + pte_t pte = ptep_get(state.ptep); + + if (pte_none(pte) || !pte_present(pte)) { + nr_pages = 1; + continue; + } + + nr_pages = relocate_anon(pmc, state.old_addr, state.new_addr, pte, undo); + if (!nr_pages) { + ret = false; + goto out; + } + } + + ret = true; +out: + pte_unmap_unlock(ptep_start, ptl); + return ret; +} + +static bool __relocate_anon_folios(struct pagetable_move_control *pmc, bool undo) +{ + pud_t *pudp; + pmd_t *pmdp; + unsigned long extent; + struct mm_struct *mm = current->mm; + + if (!pmc->len_in) + return true; + + for (; !pmc_done(pmc); pmc_next(pmc, extent)) { + pmd_t pmd; + pud_t pud; + + extent = get_extent(NORMAL_PUD, pmc); + + pudp = get_old_pud(mm, pmc->old_addr); + if (!pudp) + continue; + pud = pudp_get(pudp); + + if (pud_trans_huge(pud) || pud_devmap(pud)) + return false; + + extent = get_extent(NORMAL_PMD, pmc); + pmdp = get_old_pmd(mm, pmc->old_addr); + if (!pmdp) + continue; + pmd = 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 = pmc->old_addr; + unsigned long new_addr = pmc->new_addr; + bool ret; + + ret = __relocate_anon_folios(pmc, undo); + + /* Reset state ready for retry. */ + pmc->old_addr = old_addr; + pmc->new_addr = new_addr; + + return ret; +} + unsigned long move_page_tables(struct pagetable_move_control *pmc) { unsigned long extent; @@ -1132,6 +1347,42 @@ static void unmap_source_vma(struct vma_remap_struct *vrm) } } +/* + * 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 = 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 old VMA is a child (i.e. has been forked), then the index + * references multiple VMAs, we have to bail. + */ + if (!list_is_singular(&old->anon_vma_chain)) + return false; + + /* Otherwise, we're good to go! */ + return true; +} + /* * 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 tables, @@ -1151,9 +1402,11 @@ static int copy_vma_and_data(struct vma_remap_struct *vrm, struct vm_area_struct *new_vma; int err = 0; PAGETABLE_MOVE(pmc, NULL, NULL, vrm->addr, vrm->new_addr, vrm->old_len); + bool relocate_anon = should_relocate_anon(vrm, &pmc); +again: new_vma = 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 = NULL; @@ -1163,12 +1416,66 @@ static int copy_vma_and_data(struct vma_remap_struct *vrm, pmc.old = vma; pmc.new = new_vma; + if (relocate_anon) { + /* + * 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. + */ + anon_vma_lock_write(new_vma->anon_vma); + pmc.relocate_locked = new_vma; + + if (!relocate_anon_folios(&pmc, /* undo= */false)) { + unsigned long start = new_vma->vm_start; + unsigned long size = new_vma->vm_end - start; + + /* Undo if fails. */ + relocate_anon_folios(&pmc, /* undo= */true); + vrm_stat_account(vrm, vrm->new_len); + + anon_vma_unlock_write(new_vma->anon_vma); + pmc.relocate_locked = NULL; + + do_munmap(current->mm, start, size, NULL); + relocate_anon = false; + goto again; + } + } + moved_len = move_page_tables(&pmc); if (moved_len < vrm->old_len) err = -ENOMEM; else if (vma->vm_ops && vma->vm_ops->mremap) err = vma->vm_ops->mremap(new_vma); + if (unlikely(err && relocate_anon)) { + relocate_anon_folios(&pmc, /* undo= */true); + anon_vma_unlock_write(new_vma->anon_vma); + pmc.relocate_locked = NULL; + } else if (relocate_anon /* && !err */) { + unsigned long addr = vrm->new_addr; + unsigned long end = 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 = NULL; + + /* Let's try merge again... */ + vmg.prev = vma_prev(&vmi); + vma_next(&vmi); + merged = vma_merge_existing_range(&vmg); + if (merged) + new_vma = merged; + } + if (unlikely(err)) { PAGETABLE_MOVE(pmc_revert, new_vma, vma, vrm->new_addr, vrm->addr, moved_len); @@ -1486,7 +1793,8 @@ static unsigned long check_mremap_params(struct vma_remap_struct *vrm) unsigned long flags = vrm->flags; /* 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; /* Start address must be page-aligned. */ @@ -1501,6 +1809,10 @@ static unsigned long check_mremap_params(struct vma_remap_struct *vrm) if (!PAGE_ALIGN(vrm->new_len)) return -EINVAL; + /* 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 5418eef3a852..09027448753f 100644 --- a/mm/vma.c +++ b/mm/vma.c @@ -774,8 +774,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 *vmg) { struct vm_area_struct *middle = vmg->middle; struct vm_area_struct *prev = vmg->prev; @@ -1756,7 +1755,7 @@ int vma_link(struct mm_struct *mm, struct vm_area_struct *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 = *vmap; unsigned long vma_start = vma->vm_start; @@ -1782,7 +1781,19 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, vmg.middle = NULL; /* New VMA range. */ vmg.pgoff = pgoff; vmg.next = vma_iter_next_rewind(&vmi, NULL); + new_vma = 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 = false; + else + pgoff = addr >> PAGE_SHIFT; + } if (new_vma) { /* @@ -1813,7 +1824,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 = NULL; + else if (anon_vma_clone(new_vma, vma)) goto out_free_mempol; if (new_vma->vm_file) get_file(new_vma->vm_file); @@ -1821,6 +1834,14 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **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)) + goto out_vma_link; *need_rmap_locks = false; } return new_vma; diff --git a/mm/vma.h b/mm/vma.h index 7356ca5a22d3..fc4f8352ec6f 100644 --- a/mm/vma.h +++ b/mm/vma.h @@ -260,6 +260,9 @@ __must_check struct vm_area_struct __must_check struct vm_area_struct *vma_merge_new_range(struct vma_merge_struct *vmg); +__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, @@ -280,7 +283,7 @@ int vma_link(struct mm_struct *mm, struct vm_area_struct *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 anon_vma *find_mergeable_anon_vma(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 = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE; struct mm_struct mm = {}; bool need_locks = false; + bool relocate_anon = false; VMA_ITERATOR(vmi, &mm, 0); struct vm_area_struct *vma, *vma_new, *vma_next; /* Move backwards and do not merge. */ vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags); - vma_new = copy_vma(&vma, 0, 0x2000, 0, &need_locks); + vma_new = 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) vma = alloc_and_link_vma(&mm, 0, 0x2000, 0, flags); vma_next = alloc_and_link_vma(&mm, 0x6000, 0x8000, 6, flags); - vma_new = copy_vma(&vma, 0x4000, 0x2000, 4, &need_locks); + vma_new = copy_vma(&vma, 0x4000, 0x2000, 4, &need_locks, &relocate_anon); vma_assert_attached(vma_new); ASSERT_EQ(vma_new, vma_next); From patchwork Fri Mar 21 21:54:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026077 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id CDD35C36007 for ; Fri, 21 Mar 2025 21:55:02 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 44E9A280003; Fri, 21 Mar 2025 17:54:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4014D280004; Fri, 21 Mar 2025 17:54:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 22B5A280003; Fri, 21 Mar 2025 17:54:57 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id E5A5E280004 for ; Fri, 21 Mar 2025 17:54:56 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 56A0FAAA9F for ; Fri, 21 Mar 2025 21:54:58 +0000 (UTC) X-FDA: 83246913876.05.B8C814C Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf09.hostedemail.com (Postfix) with ESMTP id 12331140007 for ; Fri, 21 Mar 2025 21:54:54 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=hGkME+YT; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=bxg1OKT8; spf=pass (imf09.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594095; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=hRydbeF3nYCukYj+F9/cqUlF7bgOKq+6Z2gmhd3ndeg=; b=pTy+UjoQmIZd6Dbnk71sS/XFWQQLCU1N5aEXmRw5nMB0KsfhzTHhheABxW5uiNP7kLpnxE nQpFbG1HvYtWltoyA2+0ElJfSPedRikRliesdyrviLLMjyGo+yYX86NFw2K9Ra+YeTRNiu S5O+K7y5LBiN/U1KV2U7W5rQjUHRZww= ARC-Authentication-Results: i=2; imf09.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=hGkME+YT; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=bxg1OKT8; spf=pass (imf09.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594095; a=rsa-sha256; cv=pass; b=KssLKylitiFzanQobs1YeuJuf0aK0RX6larYzFTy0kPircYC5+XnwMZrGs/+w4myGD6Uca o9T1V0peEMd2Pe4PXZUTAaS6EGtZgbmWPc0McSkVl87/oE6Wk2Xl9vCTrI4UWPINAN8b9X ogjzEZeCwKbaYJGPSluE7lTyZneBjfg= Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52LKft5R021308; Fri, 21 Mar 2025 21:54:50 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=hRydbeF3nYCukYj+F9/cqUlF7bgOKq+6Z2gmhd3ndeg=; b= hGkME+YTbBxyu/VIl+mWlBk5CHRsJh25Pv6R+5RPS+RM/CzkIRouDGS0QCrPF9hm WjBGwEQLV5qvn75OYH/5CTNGgxTB35U8dUROFCt8dqbpyoYRc8+uDjrMXTZXHLDa +sfQE3KT/6YFs2Gho7iGdJbc53Gu+FJYE8CFkHEdUc8cVbGrE0PA2h7alxmDga3L 0BRoo00OttMo/KpSxbUQ2fpa5tsQWxZwcYuT3t619F6nTfIDxR51bZUkxqmx5+zt TEwM4wQWXwV4SfpxlXq7zhwBiwq7fDFdHTgsr+qfSGhVZHjqjufC79o7Bz9+JuZ4 OV2Z1TbSWsTO7qGZZ9k/eQ== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1n8sgaw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:50 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 52LKr66b022339; Fri, 21 Mar 2025 21:54:49 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2171.outbound.protection.outlook.com [104.47.57.171]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxcah0ns-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:49 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ypVs+zS/CA2361awVjyuLtM4vd+JeitaZTQTs+Ke7KE5dDjT9vbq1lsWdvtAkFWyTnDEdcXtry6bwM4l7AswDSNw3auNcTupjq6RuZzud3MD8hdUv1SOLmi9/xsav1/8uDTi6xs5FRGOBauAOAmY/GDukE8jxNh4EVy5RP+dQy43gd+9r09eRB/8ilPF7BBZL/KnFh7Dh6LMoiiyA1xXq2tM8ViADZkih7s0vjbgayXvY826UvX3siFDHicT+d5/YLaLI5geG5ZxmXi85yPLN68pIrEFMYx7b1wtzRyvV9Ff8d/t79lPYdqx37RM0EJEIDV1sbklli5E6g9VekRy2Q== 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=hRydbeF3nYCukYj+F9/cqUlF7bgOKq+6Z2gmhd3ndeg=; b=c1GSEHvJGjp8BDwXr110TDeh9VnnXhrQCYI6R+P/2U+w2Ccgr7tW9WAxEv23K5IkStqvE6S9XBZ8UmJW9eqmnlYbCQ59XooLevGomM2DO3Ai+UH8AM8DfpzzO3zfo7PLGjAmcGoZ2uqAH3KO+yYpdf6SHl4jwg89xcO/1Qa9x+Dk0ErUL+J6tDZr+kMFeUpuv2gzDYJWjew9TGhkGQHn9PLTj6ZutBdvMFoOwDNXiBGwc7V9C3PO11PD7PSh3E9UV25XsAgdH1kRjJH/flRKILihmeqRjGozV5tsJWOsTxky8pvNNytQIadYRg72OyJrwrbK16E3rmD9fb+SKJFnbQ== 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=hRydbeF3nYCukYj+F9/cqUlF7bgOKq+6Z2gmhd3ndeg=; b=bxg1OKT8IRjlcvdOtPomXkAyE7bN7c9uvbExIY4n0o05X5teKN+TmoNmFyEdNhoraJjuji0Phye7kSEjnRPh/Mnnm7qe8pgDCoUnSEs01qawhMkMlHymctQXFYp83EM/2sF4RNTc9OUdm8+l+HiUbXvqp+5XSbDVNehPALdw/0k= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:47 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:47 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 2/7] mm/mremap: add MREMAP_MUST_RELOCATE_ANON Date: Fri, 21 Mar 2025 21:54:31 +0000 Message-ID: <48f1d8a43f58069f697a2daba285a1e3f02e2cbf.1742478846.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0296.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:38f::10) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 14f82601-c580-43dd-29a0-08dd68c2ff5a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: NGZX1uOk2aITBduPe6bBJwhHK/gqEoZKj1mWFuNaYP81KuwjJk2B4F/lCIj3BN8bZPAQmpuAl8wSvlqHHZMdLpXR00ovjHmAdI5Q02vieKWw2ais1RNcY47E0GEwlWXfeWbnf9piwyh+LdPePfJUI6nuabiRxJ0ZTyuf4IAJ1CboTZrBh6Ae9sHBHe5LnqrwcLtLnavCLFRgR4kiX0sXOQdxPREzfDsmNCHUVKgOJFW8P2AgkQet3KRBzIByEPOm0rQq3biIdEp9+bae8f91JVgV0xXifuubbCJ46iBMbTFc0/uGoYQpnDPFrPtHuRwrEfd+XsG45wV7pPgb31KyfZn2EW9KlQFMl6mkcUp+Cqw2nFhsrmsPF+1ktZi5TOSjq0f2qnOvAJ0H5m8bqukAvteZFjAdoKL2GEYfdnlbrXrizwpFb3UJRjdxINeM0RyWFN34PIlOT/v9WcAU/Pt+BQFBGf7F/4MrADOAuMT0X6Jmt/zRIr5zQMI8C02x2bPrlEXkiagV6CMOWdHk36yJbLX3Ybg7rNsG7HLn0wHOU/69Lkn1YWq32/063ZQpvbAXWKh3Aq1fbmJzajwelYg8Mx7B99DCAcjrDWZFwfVHHmxhoBkuqldh2F/OTEHPRJ/H7jIBL0kYqOxbLiJuzRU9ey9qve8MIeSwt0NdGGFTEKyoGPkHn5LLAyuvlXx0VvETd5oOK071GKAHRMR3hH7RZPhcU8i6UVsQah0NWLsobSOs9BJq7lBLjsa+4bSAffx0a1xWJ6MU+jRpuDl9vFHeWeQL++O/KDzXWfLTciPgL+BfYHnnlGVOglylxad26M0lv5aArQYrRwqw2l2kD164Xa9Ks+dFHimBm4Q48Dlm6ISxFO3UKHwOrLKnWTBBZojQx6oen/esIR9h49yCWbftQuwILQQL08fvLgSdM4hQD1F+hgy8JQwc4a/JSdTY3xXuQrgkQbcFwMTpQM2NUfVyrjcmtjBKr07sLLnonja3/ScGeBLYqzCjSwhsLnlJ/3XAIxQ2EZP4a7WN2+/nvHK47Csv+tuvK6Qzjn9cq1jVy5v8bDks81tKAbhrAG8cZQMw1xqlynxNKZdA9TYjDCf0hFNv3yY3+xsk0a2wlbM1ahwJ9AxJZWIauwrmKjHtOyUNL1ZK/vchbAr8iWUCEs/pPbMOqADkulyC1Nl+rWNJPEQBHJs7X2Ws+Kx761X04Jg5RhqeLw5VYUJP2HNMuT59iPZYXSSx2he5QkIWEjZQtcbwv5CqKI/+dZ810Piyc1r9DZQaImyw+hZLE9hkXPKT4t8S+Jmkz/mHtsYl58XmFbkjhLZrWJ4UWgoqs4NQKawNmgELjp567UUEftLFWoOJEZtyLaohOtCOoqMlxbxZapUeqWMbDKvNRProH6OOAapW 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ruKplwiE1XDa9JNAZp/WBHsnxpguI/vnQNS1LvLJiG22ReR2Yu1jq0i/FNq06R2yzH/wvDEt00MDWq6npnJKCwabLhuHcWRcI8kpZV5vxq1QDVWZARovsiTSkM46HQXBKfVuphn8ihCssoHohDLs2zcLJe2to4iPXSfITBZ/KxgpKfHfRda9hIu+FSYbifXDVZ5zbYIYUdd8qzXQxZzWULJy32C3KqYTKN44q++w3pQj4pcOttxsK3eS7OnKj1X52XaGnh6UCp/8leFwGIXDYK0+Vg1mQJ2ZV55o2LPZ4xkgW+iYcSGhSkg9zMIiLamQh4PhsmgO4lyRJOJv2RbjIN8uNz3hlhYXdxhH/ncUxofcy4EpgkgAgfAn87ewUlLviEOlhNxbwUZqaAUnieybjiaoxXhuxAz6d7BzZ8/FhhSb+FlJAS2C5BcIdjgxZ0K2mSIVJNWhbbw8dztc4g9qezQSjn7ig7RlBszeqiaHUulpZjj0PfahbtLj/C8ASCO0FAVOlp7i/t22rjKjyPwTYYwJYtFGimwqtkl2JPDSdIWFPjNRX3ouORwcsgZgZwTsQhWH4CsJwvnGTB+K40jqj6Iuu1UK/fIsTAmC7ujj+1UogfYcnu8Op/HlC/37IeHLEikJ7OnoXMR9mcYlipLTEe/zCM81sQhDFKO8ds1KvVj3t5/eJiF1Q51Y7J5TbC4KLpfRo1nb3wp5e3zr3kVWwCsQXhX0O268llz0BA5sLtCUKy0IOJ6hB51pS9l9nXQyUca1P2xDV1zTo8LPCP2jfy/zS/yDKn6x0GE3ctzu0zSEzlLXK/geC876YMV2m/PfOmrbvXyFNGuGCjZRa6Bi96hjgML0s1siegN3T/xMb0dq0dml8pjKGZMuDAIHVkJ4r5Q0QEAFijjAwTfTgDi4BgTe++Xu1iBtb6+PS9hc9K/x+SBmMkhdNwCosTeGw6oXxtD7QMqRkpruVT3cHS6ssMNYdg6Pn4K7WsDe4UG+yPVq/CKKPW1ZNxiKxiQsVbdegn9vqQy3gRAAqSC5+wZFXd8r/xKKSAWNeko9Ddqpwe1goYlRj5/F3YKpyshNLThR3xSPy0zULoFNWG4GhMlWe6JE/+N4iVYfjMnKEEu+gCpnI1uHCsFmf8khAUR8DId8UAokd0a5UgFPbsjitlXeT0fQirJHi+Ywjb3n/dlkFbCLi7TsNBKb5Ui7l1e+8oJ2MOk7Blx5TbjRO/2MLhe+nWCMFhsvqyxwmu+TI+4eRBW5oc5NXES3teufXjNbqaU2Fvgi7AKD1NOf0Dr3yNfpeMPHmxFvT5UyBUZ/Zi669VoDkZSj8EbQ7CCPYilI3kcV80DkFgarE0L9H8ajV0GYhOtGlok4QOuMo7zQbcNGWkDM9N4KKNsYgFPJQQL9IN1X/1EosJzOp94DQash5H3thMM0QKQ8oEpcT427cRRkpYF8kfYbPvCvWi3eK4Qxi2CRQjd7UKUew+1pIbOBU5I/JrPtn2MLng3SLRL1539xu1m2riNgMzKT6t91xVMGF7umD+NIOm3P/e5tKQrH+pfxLZxHp/1SBZL4xJErfvXZlYa63Z5LuodacRuNDO0yxcApUvTadsFEOIfqebSeLrux4w== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: xi3MlH9Jf7p9Naw8wm2Vd8UMstK2lJwzySFtA2l7/mRgRzb0m+cl1AN2X3EW4RrD4cjk+rbc7udhjz0oCuvvZFVMDc4ga4tfqB3ex+/aA5iCefTPkqEE/iNvYkOULA2M+1YZKEtUFWyLP+026gDWim/XCCYlfD18jQYqWWKJSV8RfJ2kU4mKAbdJ0/Jbd+IDXnEDE1unZX2wn8esVP9JfS7qrx0MHkmewkHT6HFJdFM9siLkHGY/mbe6uuOx2Z4Hc8rhCU5G38MhyVZAqOplx/1Xynq9aFPW6Opt5KcZEctr+xbs6Qoq+kdg8s6rhYJBriNrsxxp2HpDwkpgi8iNd7MiH48qukLQ5tBO+/uAeelqWcF7arH9IaBzTTxzyzmm02lSxyNhCZWfBw1B/YPndNmu7AUY8PeoJQumrteeNCIYSL//aILzriosyw9KlBH4PMpoIVBnJpEX0KEj1FjvZgL+9/33tgmzk7XeK+M2r5K/4tILNC6GV1mU+DbHYj1NzDuIqcvRJ/DC9IBEY2Dw/krDc/WLeIrsOSQ+VeOIED319NwCiDT6HiQua+NLxCtqXXuEHxooj/H+rgAjdFZy8GrIke7DQp0LP4ZdIAHJCnA= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 14f82601-c580-43dd-29a0-08dd68c2ff5a X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:47.4401 (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: nf/icU61oFxyOHnVhdqYvSZ2q/1yuTC3aR2CX4s2H03gI7G5eHwbLsAW7AsIsPVnsPhiOMz1RVi76og8op4Sp67e/+uMw/fd1eOMi2vxAbY= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 phishscore=0 bulkscore=0 malwarescore=0 adultscore=0 mlxscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-ORIG-GUID: F8RsljcggIrvs4X4mvsjYgLHrKyG0T5n X-Proofpoint-GUID: F8RsljcggIrvs4X4mvsjYgLHrKyG0T5n X-Rspamd-Queue-Id: 12331140007 X-Rspamd-Server: rspam05 X-Rspam-User: X-Stat-Signature: nba9sffb1jgfz9zakc3gp6o697wzq9gs X-HE-Tag: 1742594094-290580 X-HE-Meta: U2FsdGVkX1+HStHFEincULXTOfeMwqeYRd3n6HZMgCX6KI4pMaSEW784Wz00vePFqngJp48qtnLL0PPnUtwv8Ah7Ji7NocHaoYRgfyqYBd+UJmKJkcHTJwdhjrfJSAdnO2K7UxAQ7u5EopTjeIuk8np78AYw6LqIPVtbwQRsVR9IOzLllaby0vybfbSVlcwjzrgJDpEKBKzKiFbzv/HJQ9wJD/dqzZvrn5fZr/vbJnBAQhR7VIn5MK2BLeygRXXxCN+OKfviZiG0cEZI8+XXHq0+cirGYNFqEwQ6ww3B2tnBWMNGFy4MYGUW1FeDHPHOwROmva53uW2MqTCmwqCLE4fjiSymmdLixEl3Bu9+MBdiuZVfA7bGRXF0E/sAz6lOzhGoJv7kl8GNo5zwvn/GfHhrSN+PUwdyJue/IFAw4cD9QWevLB2jtro4rGspiDiit9xF3EiaV9uzMeaAIdwRSl9O/fstGkkVUkXYImU4X6Y0kNQAc27/DLZgHpdLf2kc/ugpjlFb+teQT9T+wAxpWC5JpmLca5iiIGyPTJKZwajpeFJDQXyIPeI+MKs/htKZ6gRFUNfljNNwNKb2M7NbdKe7RwAb778k7xiuorIzLKE9Fo2tUyLDAKc90pLd6xNaxkjnfbFcSWUh2132O+6TTHvblsmI350lV/cPjR5D0ANRqq+s9CmIaRzQdf5A+e2Itx0Hfy224io/nI9cPugyjV5XimEBzgPBRQ6rE4EKNpmrV545t8jOd8LvVBfhsduvFD3euPm2o/tC4pOTUj8JSnloWFzsvrWBDSFs3Sae0h+CPGiruSlI0D1buhLWSTj/LOB+RzFLnNd9+no+ZD4sdAJc6gZ6MhxLE2tHf8xt5dEnpi9JRfh8XWxODDvYL0ezuPTKqZkJWDaXZJ2fPkRUi1j+4wW9ivM6cXraUczwIAvE3RTLrhyU8J20nPPVy8qjdX/w+cpobCzZL7jv6gD a6N/EL2V WhfRIa/Hf6MgXY8MwHF9kznBfJKvNwSuIEogH4wVdHpI3vje/peVfDq7uy7UEGKRfNnZ0SwaY/J4xdWQValmRWLrs8ZCCXlYrv4bHmcogB6kK3d4JSzF+QeLIag0RvipSGbmAkyRxq5IRXw7/NWcjE0/txsjN/Gd+Q6tmo36Sjw5um6bukzqpgmqIvvTb0nmhy+i4+zBR5pC/u9xBy9xTO/+z4VozpY4IAf3YqNmJtSL+cM8lmykqZxPZEUmwll8Q+J99/TUDWi7IbAH/bTs5feHmIQxf9olSpDw7ofncJP3nihT/18lOn/39IGtJ7TFEHJpJ0EC1l4740wD7YpbB9XQvhvcFhuqq+JMLNfN2LwqLNeTnnbHIGnapmEnukSlkd0BXXgY7PNLPfEblTAYliIpmtGpgpaa31jnrmJvbrmYBG2IfUbO39bFObE8p5wFX2KxaLXqQT1QLZ1ht4TYw57CfcPKPxO1hk9A93/0Qw115tf39iANwWE/OGA7tjpWxJ8qrADyLPT9fpRQtYKz5jrXI8R/UQhwumFlNpMia4eeRVQSJ2YMiyUoL1zki5EreyqjDwTHQZvz/C3X/PZkSTV0jETbfh6ITLi+onZRVVjo+Bqp+USWLHGDr40KXI+YTO+rjEBr3oVVIBUSdhQuUpPyxwg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 -#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 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 diff --git a/mm/mremap.c b/mm/mremap.c index bb67562a0114..f104147cd66d 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -1352,14 +1352,18 @@ static void unmap_source_vma(struct vma_remap_struct *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 = vrm->vma; /* 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; + /* Failures are fatal in the 'must' case. */ + if (vrm->flags & MREMAP_MUST_RELOCATE_ANON) + *errp = -EFAULT; + /* We can't deal with special or hugetlb mappings. */ if (old->vm_flags & (VM_SPECIAL | VM_HUGETLB)) return false; @@ -1368,10 +1372,6 @@ static bool should_relocate_anon(struct vma_remap_struct *vrm, 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 old VMA is a child (i.e. has been forked), then the index * references multiple VMAs, we have to bail. @@ -1379,6 +1379,13 @@ static bool should_relocate_anon(struct vma_remap_struct *vrm, if (!list_is_singular(&old->anon_vma_chain)) return false; + /* Below issues are non-fatal in 'must' case. */ + *errp = 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; } @@ -1402,7 +1409,10 @@ static int copy_vma_and_data(struct vma_remap_struct *vrm, struct vm_area_struct *new_vma; int err = 0; PAGETABLE_MOVE(pmc, NULL, NULL, vrm->addr, vrm->new_addr, vrm->old_len); - bool relocate_anon = should_relocate_anon(vrm, &pmc); + bool relocate_anon = should_relocate_anon(vrm, &pmc, &err); + + if (err) + return err; again: new_vma = copy_vma(&vma, vrm->new_addr, vrm->new_len, new_pgoff, @@ -1440,6 +1450,12 @@ static int copy_vma_and_data(struct vma_remap_struct *vrm, do_munmap(current->mm, start, size, NULL); relocate_anon = false; + if (vrm->flags & MREMAP_MUST_RELOCATE_ANON) { + vrm_uncharge(vrm); + *new_vma_ptr = NULL; + return -EFAULT; + } + goto again; } } @@ -1794,7 +1810,7 @@ static unsigned long check_mremap_params(struct vma_remap_struct *vrm) /* 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; /* Start address must be page-aligned. */ @@ -1810,7 +1826,8 @@ static unsigned long check_mremap_params(struct vma_remap_struct *vrm) return -EINVAL; /* 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; /* Remainder of checks are for cases with specific new_addr. */ From patchwork Fri Mar 21 21:54:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026078 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id E80BEC36002 for ; Fri, 21 Mar 2025 21:55:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6FB66280005; Fri, 21 Mar 2025 17:55:00 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 60FCF280004; Fri, 21 Mar 2025 17:55:00 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 41476280005; Fri, 21 Mar 2025 17:55:00 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 158E2280004 for ; Fri, 21 Mar 2025 17:55:00 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 76D7D12076D for ; Fri, 21 Mar 2025 21:55:01 +0000 (UTC) X-FDA: 83246914002.22.681446D Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf06.hostedemail.com (Postfix) with ESMTP id DDB3C180005 for ; Fri, 21 Mar 2025 21:54:57 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=a1kqZ+H8; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=YFAPK+8b; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf06.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594097; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=1kvm3UDHamn645oOdYhnc+vjXMc0M/KQa2SlxBwaiuI=; b=ATmRtq//1zyJqZ+/Z73Ip33JDxR2SvvK9yKdlTFL//K+QjU4sarq4hHxZh9cFkx1SDD6rO jLjEEq8RGX7pf/hE+BJVaD9hoaY6+GNfm18uNmCpn2HvjzMXuVROlzpfb5EtxckRE4u3sg eJGOIHNqc6iBBcS9e7MfJui37Jg1I6Q= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594098; a=rsa-sha256; cv=pass; b=uYAo5xXh802Amt5GTZ3UgVECWheo5w4SUEJYumrNjAhPOlzXXubR+TyrF3QZU1DU1G+vQp WKXl91ebZNjm5/uEWrylJ+2/yzbyjWVcpa28vKEguPZTmQioXqoJgrVLUlwrVkiirY2w3w 21JhNSVbnto8dH6DYaxSVFhRjZnW9nc= ARC-Authentication-Results: i=2; imf06.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=a1kqZ+H8; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=YFAPK+8b; dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf06.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") 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 52LKfwkN005492; Fri, 21 Mar 2025 21:54: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=1kvm3UDHamn645oOdYhnc+vjXMc0M/KQa2SlxBwaiuI=; b= a1kqZ+H8/+LQaIaLnq0CVh7u+5AEtXy4bEYgqnG2pwFMlB81Xo37CN5FJec/pE6n ZQ0tOVV7Z7dBRYYzwhYIT39zqpJWtAn4gD5whmisYU+zHGvvmMO9VMK6GRAI9OtG eTPv9tgJj1Qbd8g70mGyPd2CV7qCJnzq4NSIFahh3XtY/W8THCe8kJoICtZNPhsB WprXMujBUhZSQmj5SJSlAcdWVjHdfKZthlb34WjcWL7/2Ib9U9rtHIGBcioGWaum sJi90JveMgmt3vcRB9zXGxzX6YK2moEEDkjSB9g0uXL6vxp+aQk4oW5aNhGsA4m1 qdzOFi5vMLahqirtq6DZBg== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1m41dnk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:53 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 52LK2WRM022409; Fri, 21 Mar 2025 21:54:52 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2045.outbound.protection.outlook.com [104.47.58.45]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxcah0qk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:52 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gKXfR3MUbha+4jdZZ+iNpNP9q1Plb7N0Gq8GuupM57J8A+ulq9TLsysFIJD6ZOsjEYmqcMxWThKuklQRC9/5o1Q793BJE8iJy+HWWL67g/QdCPQmliq6valg1jMszDz7O0sw2b6+w5fr3vb7OUyQcpI20g7esUq0tDIGe52be/7fo/0kB+261LqlQyrbbKZbUMzo6I4lt/tETzZb/QN7X7aCNmrQHxIzP/lRDWf0aYUey37oq2UkvYTRoBRmWb9ERlmPBWVOt2c1pXEoKFdUq3g+oVbLkTkN5zebPkfa8GiwihigFNd1oPsQdSPYcesVA7O9rfSf7B6PQkHVwLeIRg== 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=1kvm3UDHamn645oOdYhnc+vjXMc0M/KQa2SlxBwaiuI=; b=px02bUtwC1/10T6fSyZ3K9pB6sahyUJvrnCI2DivLWwIH8jY4T7XkoSXi5Fvw6Cvm7QwhBnfrsCOCEtCzG8JDBegK0Y4XcUemh+Ry3TdLOmmnGPKbxDTWq5j0utCUXWddOe2KkQ3S9067xVOMMdcMv/zvp3PXUi6fNbXYuJ5ulmuZsom7dRjDxogk9DLMFo2XRNYkKFX1f4ZxcvG09PuLe+kDuPwJGFAnGa4u0mdXNHa2yMIvWc79c/DAbPSEDLmJJCUKExz2/whzq2O4zTJI4pfzRmr3ockKE5WcnRgfYkgd4rTxqZs+dOGt635UVAE0kzlgHWSvmZ9a++sBlzPyw== 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=1kvm3UDHamn645oOdYhnc+vjXMc0M/KQa2SlxBwaiuI=; b=YFAPK+8bPVT6vmuv4wViTZ9mKLlpKqixymt/0yCx4JGit0563N8SM9LBiQozRO//ZuNdam4B/b75hLCEymPtI0f0/RSwAo+WMhh9PSD+FWECB2ghXVHdssXsqK9jW6z/OX1pJDhW70KjBpnhH25i4NufNpQKd+pwYNjICE6tBLs= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54: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%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:50 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 3/7] mm/mremap: add MREMAP[_MUST]_RELOCATE_ANON support for THP folios Date: Fri, 21 Mar 2025 21:54:32 +0000 Message-ID: <5b9f21d3a0b5df610877633127f975c2d79ae46a.1742478846.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO6P265CA0005.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:339::13) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 017b8123-99dd-4157-da6b-08dd68c300e8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: DhUjxCTlkiU53QatdbgFmTbJun4e8vvhWasWbGb0qXZLzRysudRLE/aK3eBHJxYDlqd7pXnyRFu8ynhDtjjl9quzayE75wWX8S0DM3Loclt/SO76DpGt05GSleaQdkqTre0zNrRLXkSgm5R0uxyECpNwRE7a9Z+tRIE4h3+njYe48l5MjslOBVyy+MVpy0UlFdwOli2BMbF5YcapklUtooepLvCiHF9DCcTMCIh6Y5kDgX36buLL/2LjQmHM1Ik7IS6dAjTsWMmx0WHzbwROpO8ZsiT02mocwhghj97SyaHDwZh+blLcbbbwVgHF5SWRuJzDomDljovcwxbLfZHWUCuUgkxh+Y/GzY+xytGS/u+gCHirqYFax0OakQD0OA0Qn3343rTTyg+B7nXdf9lTeXbA1aZDairJGHuqVQ16Q4x6cK7x3tSCfmB6kcAkwttB0dDWILJn0is/Gx7udoRw8PIHO9fC6r28JtfJmgUlbnsxDtNudG34nqLnuckmx9fsT10wSALYMUS9CNgfVCYs7KNz8gtdAU4WOxCoEta/PuxI84v6FARkr9BvGUOEEwF9+PxDmHokrvYODCiEKXClW5XaNd1ptyZlueCx63GFCQiZkFj3T5WVo30S0HMsfQT3lHktc4u+avurpafgBOpNyToBHkhvlofvss5oHi+CxusCNu09EQQCPp+IHmCJdqJhMFYaWoUDh2UNHF3L+Ykx7Agn82V9oBsPIwFyn9nV9ipdmQExXSl3wR8RcVuwfI8AFF6tI1Eyx+8VSwD91Qkxsi3MqOOHGygmE/YuLXW3NU6TIj70mobLAxivCdISKBxcGQUVaaYqjFdwTjDplwHC8dF1fajvxgOUQuMNsg5skizAmWFSvh3Dlbm158HzaxqY+Z/kYDezBjhyPa8TiGwA9JS3tGW1Fri+1UP9Nr8HOgPaKQUY/15EjLzJFpn+TzSEFGzbhiog1Ly4BYbAvGxeWFowQ6hyZKb+B+XGd55RV43T7Av9RRajZ2AYfojes7h0XX/tWxRI+Xib2txj0b7bNNc4jj6uLsLAWDkIWGWC9ZXhjmis6twmnfrenZ1dvQPOb81Y6/nfLldy6W7FqGbaeiJLfoFZ2NIUD9G1MCQEHefo0cxq8fbClEBN9cdivOmb0Q7BaextIMP3n2+Vw0GhGQtLsgMflf5U7YimaV4M1Udk8ngjpdidqQb3aonUKD0gOuvuha+CPavnKzXf21Yka2JXhOvLcTLNEhhjg7ckBQ4AAiOmkRTDMusRgLP8QIEs4qZhWmaWL8upOYZ0YTUOOk5CHhkHGgY5jlaORTZx7v0ezSWrJX6a30yY6lHDGJf9jSnz7jm+YqH/13MGDgVGM9xFuChZaVfBJMGgDo++cPoFzQFIV1iSk4TJxEEynZcA 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: P9GO821tCOM9Y/rDgq6HefV42rn432ol4xPx9VD9iINZ6leFUcDRTRNoZ/9gDvN8yg+/mvd67iuvmTa9mel7zgLowz/nQvDwv9I3xt6VoqzhkRGoSDQZ+FGuZX8+kHlV0toGlTnxt4V+6UIlU4eaPqj6L31lNDLj0N1/XSq+FAbTi9wGc/EUSZQBV3TQ8s60mlMLXdx+JwaMSbPdxoAfhyDWpsvwzcCq8QG4GSYrJYfiaSqnf/acpQM5R3+Ku1uSUJiO1jq7zX7XDpsj9OqvqG+k7BLICkFRX/EyZiiAell/S6yhRUc6CZFoVlsBu5UpR3Bo/cSS/UG8ekivWZ9DRISSAqqX2ttNiuftVVOHmJPU4YhqnavRYKi59GI84/yEWsEheStiEU0GRKOSvMeEfhHeABgtOTZXPx6cDOIv10n1AK3Vfl+OOTamGk3Fj9KxatGQUhk9rTxcBJWsroS+wmcpFdwYrKBeY20sARIpYYThQG4bwh4NG/PGbllDNtw5d2V02VuBuQtiM94/BvGGKPAddTKoHiBKKE26ZKHdAB4cHqON+t7znMFdKtHhwmVcukKICMZq/K48G3JuI8thuh3xdIEupix3x2tn4eihYJhUli7CS5tTtyiM7AEzrk60sJJO8yP8Rr6lH2cswbnT4BRUF8a8jx/rEH3ZSE+mCabi4plJ0aoyRRQac93VmwH8DB/JklxroX01zjavf1bW8ijg1k0Qgku9I3FHVIPIjFu4WXHNT4rH47+we7eWqq0pWhRB2kDH/3CM8C8a8nwkz3m+rPRdIq+QLUfA7XjkuPoo4YkcNBciKyApfU/6oTC/IBBt7JxqGamBGAQcOuiFhq30FhOpIXapP7FFLQ8tL7lA1D4eSFZgrNJJo7iS5vPU7WmHJWhRSXo2gNxjtcxyF/GeQzLQQhWJvruetxkSd09x7G69JjhY+H3p7WO4+D2D7vt2kUrino7fwEV6W2IXU7VSb3zaGn0oMQXhYY0eyhj10cUbaFkU2lYlzOjwbGkrvIRibVMxuQzoVgGENaMjZnOjXWHwLGIuzHRWX7H+ztIYofy6L6PIoLTT5d6iz9RKxXPh+K5tbKaqtwyECrWt2+n+kEV/At+ZjKgju2OYq6oSc7qENrj2gqbmZ/jRlu3/WQdg5mJFCA60tMiDNk39aVYs92t9wcjt4ArnjmKdioiI+O6toje21AzPbfP7KDLl2FVrOrk8HYDBRTuiBkvmEhbm03PWZulXGzubW90tGDsDScrGFG/2lvmfKOV/1xViyP+dyjGfGeKv0PMZ2mau3iRAnsh1iHlhoqvav4fl7C2yQMos0l/rkqIcH5LyJCg7MjuaVPtvFKeR1H2IUQ9lRSVhyZ7Uzd0DS87aw2pB3zCJP4kUG6PIUjOR9IE7hx36REAY5kGE7KERusWSqak+Hv5+arAextSPAqXb7UGa3xO7125x9x5jFHXAfEJbqKt6I+0QzZVhqc3kZKFiaddTEw3KeiicwJzgjqh3nVr+UgXbZepa3Jf0y9Pko5ssx88NqzJ5dPev7cumpgoKiBU/4HmLIdV4c3zpb0cq4b9j/J0PgkKaCF8PUlxUTE8cv3UEmkEYFZYmvy0NnRA7l3cl6g== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: kL8H4g9sDfn5ZYN+2ngL6NWomUz/gR6ypdZzojwI5PZuY0gsvopUvFY8Czt+AmFJcfc4tPE3S9H2GnjBbh0ZgdyTRUYlPjHlYCwhrTCCUxQivE0WJty648SgZ6O8Y3Nby97pylyaiH5g+SrUN8IQKAgp7Xz2EOx8BTX8/5DHjfFTc8okFPvO77zx1U2v2HPe0P40GuR31pPupfdzVZVmT3ipn4SuIECnQR36amrKcOiO0fTYFzSVJQYY4yIq9C3+DXDhzAfzBCc/9iZm6oGSjtyMiW0A1NQs4xwZG0SudrBdLrrr+F9+EU7DlJJgaKHidYKHNrR+cWKtLDlPwdViJkYdWyXzghRMItx1jIQNc+VPq72BG1ik2XTZXFtuGmT9BHsPEzStZN7MhZTORGqtCZEJrl2qXYk+WBlv9ZiYlToG0AugOMWasa+8mmO5H9qureNU1UftswAqaUhvPXYKhX24g07Y6Vckc3bEqTC3eRqsDWF7VjUJtJGiX0mTlV6npSV6ElQLnyMLesOJItRdyWSgPhQCth40Q7Y8nSizp+HA9O6l/x3aoK6mVgaBHqsVwqo5p6gmQEUi18ByoQTeHSfuQ1hKQZM1+gg+7ETZ81g= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 017b8123-99dd-4157-da6b-08dd68c300e8 X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:50.1613 (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: Hxc72cyjiE9eOoHxkaqm/mcHv6xSMxfHbS0JGiaiaL5GC4LZPAs+SbyHfla1HMdMDNYPfI4cQNT08ILM5a+SiEJ2KZNYnSkeBPpHP1qPbjU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 phishscore=0 bulkscore=0 malwarescore=0 adultscore=0 mlxscore=0 spamscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-ORIG-GUID: Dba4zAsvbblfnp_KqTPChuBh73EGqp3Y X-Proofpoint-GUID: Dba4zAsvbblfnp_KqTPChuBh73EGqp3Y X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: DDB3C180005 X-Stat-Signature: xx3t6ed5kg1nyqqxewngmraqd89k5r4h X-Rspam-User: X-HE-Tag: 1742594097-325563 X-HE-Meta: U2FsdGVkX18IgOkYShdlE/ZsP3fIqpoJNkpUVPW4iFmTjHOhwW7kptFqI8fsdAaj+aFzmPi8hu+DNdhazgN/wUIPFw67ZgRhl8luM29cr7Y/huJc+TSMSkKX1ZWbWzt0LaSS/7T0YSR/oc55/f/fL+3SeYJDGxrOX3e9CjWK+IeMV+F/XKq5UubOlp4kwEnoiSY7xJQ1kQi7W2USVdqAknbw07zJajiMCTmxHWeEcGClWW6BTVcJUeM6WaH5HG4EHDNyk5xmY7T5RlK6HFu1C6PK4vxQokfMTK+ExAbUNMBnK91RDZxqGHxPY57oD4ZsDehgyZt9tKIiNJBfEMLvB9gVYa89O/YTtqQBsXeviPbnU2WwjlS/+Qu5IhwNiRjtlA3X53gb+dW8GC2hGGDIHIwWrf8zuAdlnvcK20hXGfuuZ4eQ7Q+44ZtNZerCWjLCMC5SLJAn96mORqRcMRQbSVxRksVsVQH7QmLnUjzVWpfrfnzMYC3wRh51pnPfVDU8rkxCL8RfQnnyAMkOGOLUeruzScPxn9Zld3zLiJzquMn7aStExCHFK1SKyxhRXD0FSV9PyILyGbflEUh/LNPkgFq7IxxwyLcJmCRGicWZFHt/VnmG16OvOH+54mLkJG174KcJ6gFBwu9xR0Vq6g58WUq6FNjMQfC4zG0mMVOcI8CX0U2TVYOqUK9eAJEbs2TilR4jzZg015CguAQhXt8QFX9Fcf3Bhq4aAHUkH7YgBVCNEB1aeEJiPI78tWfGK+RTV1x64LmaPkSe667C7gQ/4R43j3jpvZYhKWdo+M5XY73vV8km1fAgvr46rZ47rHXCefrIdxoRmvLafDlX2++H+hz3UDbnmwcRQELpJcItCQ3K51Ia/HfBsa7VH4BwCAzP6yZUWUrITNhwOjlJglTsaYkjK7LlhTyCGJdijZWNaqopPn76gwCQZoih72KjWNErdi8SbHFc92vB8ABfrER X+8WnWhW dicWuGYqzS2OvztP3jiFO49rvXURZ8SCqf0u8ENONwb9q0eDhYVqYCOFR5wnkTBQuIEXGvH/FRtGtMa8aUe8ILC3QMmHIrjVdFauvoxtHuV0ghQppCTgmkZF29aqoMxXCarnbJY+r+YVBijI1b0XXCkMJJnJVYLac4sDlMitrPnH8Edvkn2yLwcxbuK6fTuKPezg3VS76OMN58TBUmX5WsuIHjGmF0dxZn+6VWPHNKyTjxzz+WVzpRYslPb6suWazMKS2Y5azoMYyj/7qoEx9V7RO1lvqZUMjdLSfx3veuF0dU0Lgf5WZNY1cIIIQJ+lQLrFLymHMoWxoJrQNr+XmnczfbOVhy/1CJfF2MIEQoD2G5rL2b+vvS85LpjvSZsQZ09qHaMbJrW4Uc/dXr5mV+WzSBSxrdvHjTNhZOvglbm8/eY3S1PkNCqhF3qJvFDy4zyX1Kc58zvoQu2taaZGHaXMHIc7v/A8XWgGgxeItG3NFue14V2p2Ee6EtCwiz0yxgjjpmmdU3kWvk5ItGB+YHruGRbYvnoesuKVbWIq0rvQR5nabWb97Ej7ThZRkAFuWlfz8mYs1E5hR5toi8eOjycmZ5WLlv4wONj1tNp44Nb+zdSVSC4PKMKu/qEE2VjP8kye6LxslEhEVKyRHvMCus7Ibww== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Transparent Huge Pages (THP) represent a problem for the existing implementation, as we don't know if a large folio is fully spanned or not. If not, then we have a folio that straddles different anon_vma's and thus which cannot be relocated. We could split the folios, but it seems unlikely that a user would prefer such a heavy handed operation (which eliminates the THP performance improvement) to simply disallowing anonymous relocation. Introduce the ability to both relocate huge PMD and PUDs if wholly contained by the new VMAs and, if the PMD or PUD has been split, to do so at the PTE level also. In the case that an ordinary mremap() call would split the THP (that is, at the page table level) then we preempt and do so during the relocate anonymous folio step. We are able to handle large folios of variable size correctly at PTE level generally. Signed-off-by: Lorenzo Stoakes --- mm/mremap.c | 275 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 241 insertions(+), 34 deletions(-) diff --git a/mm/mremap.c b/mm/mremap.c index f104147cd66d..2f8853d1f2e7 100644 --- a/mm/mremap.c +++ b/mm/mremap.c @@ -524,40 +524,67 @@ enum pgt_entry { HPAGE_PUD, }; -/* - * 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 and - * 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 = pmc->old_addr; - unsigned long old_end = pmc->old_end; - unsigned long new_addr = pmc->new_addr; - switch (entry) { case HPAGE_PMD: case NORMAL_PMD: - mask = PMD_MASK; - size = PMD_SIZE; + *mask = PMD_MASK; + *size = PMD_SIZE; break; case HPAGE_PUD: case NORMAL_PUD: - mask = PUD_MASK; - size = PUD_SIZE; + *mask = PUD_MASK; + *size = 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 = pmc->old_addr; + unsigned long old_end = pmc->old_end; next = (old_addr + size) & mask; /* even if next overflowed, extent below will be ok */ extent = next - old_addr; if (extent > old_end - old_addr) extent = 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 and + * 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 = pmc->new_addr; + + __get_mask_size(entry, &mask, &size); + + extent = __get_old_extent(pmc, mask, size); + next = (new_addr + size) & mask; if (extent > next - new_addr) extent = next - new_addr; @@ -787,15 +814,153 @@ static unsigned long pmc_progress(struct pagetable_move_control *pmc) return old_addr < orig_old_addr ? 0 : old_addr - orig_old_addr; } +/* 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 = pmc->old; + struct vm_area_struct *new = 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 = linear_page_index(new, new_addr); + else + new_index = 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_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 = pmc->old_addr; + unsigned long new_addr = pmc->new_addr; + + VM_WARN_ON(old_addr & ~HPAGE_PUD_MASK); + VM_WARN_ON(new_addr & ~HPAGE_PUD_MASK); + + ptl = pud_trans_huge_lock(pudp, pmc->old); + if (!ptl) + return false; + + pud = pudp_get(pudp); + if (!pud_present(pud)) { + ret = true; + goto out; + } + if (!pud_leaf(pud)) { + ret = false; + goto out; + } + + page = pud_page(pud); + if (!page) { + ret = true; + goto out; + } + + folio = page_folio(page); + folio_lock(folio); + ret = relocate_large_folio(pmc, old_addr, new_addr, folio, undo); + folio_unlock(folio); + +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 = pmc->old_addr; + unsigned long new_addr = pmc->new_addr; + + VM_WARN_ON(old_addr & ~HPAGE_PMD_MASK); + VM_WARN_ON(new_addr & ~HPAGE_PMD_MASK); + + ptl = pmd_trans_huge_lock(pmdp, pmc->old); + if (!ptl) + return false; + + pmd = pmdp_get(pmdp); + if (!pmd_present(pmd)) { + ret = true; + goto out; + } + if (is_huge_zero_pmd(pmd)) { + ret = true; + goto out; + } + if (!pmd_leaf(pmd)) { + ret = false; + goto out; + } + + folio = pmd_folio(pmd); + if (!folio) { + ret = true; + goto out; + } + + folio_lock(folio); + ret = relocate_large_folio(pmc, old_addr, new_addr, folio, undo); + folio_unlock(folio); +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 = pmc->old_end; + unsigned long orig_old_addr = old_end - pmc->len_in; + unsigned long aligned_start = old_addr & ~(thp_size - 1); + unsigned long aligned_end = 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 mapping * relocated, then do so. * * Returns the number of pages we have traversed, or 0 if the operation failed. */ -static unsigned long relocate_anon(struct pagetable_move_control *pmc, - unsigned long old_addr, unsigned long new_addr, pte_t pte, - bool undo) +static unsigned long relocate_anon_pte(struct pagetable_move_control *pmc, + unsigned long old_addr, unsigned long new_addr, + pte_t pte, bool undo) { struct page *page; struct folio *folio; @@ -818,12 +983,18 @@ static unsigned long relocate_anon(struct pagetable_move_control *pmc, if (!folio_test_anon(folio) || folio_test_ksm(folio)) goto out; - /* - * 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 = 0; + size_t size = 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 = folio_nr_pages(folio); + } else { + ret = 0; + } + goto out; } @@ -886,7 +1057,6 @@ static bool relocate_anon_ptes(struct pagetable_move_control *pmc, return false; state.ptep = ptep_start; - for (; !pte_done(&state); pte_next(&state, nr_pages)) { pte_t pte = ptep_get(state.ptep); @@ -895,7 +1065,8 @@ static bool relocate_anon_ptes(struct pagetable_move_control *pmc, continue; } - nr_pages = relocate_anon(pmc, state.old_addr, state.new_addr, pte, undo); + nr_pages = relocate_anon_pte(pmc, state.old_addr, + state.new_addr, pte, undo); if (!nr_pages) { ret = false; goto out; @@ -922,29 +1093,65 @@ static bool __relocate_anon_folios(struct pagetable_move_control *pmc, bool undo pmd_t pmd; pud_t pud; - extent = get_extent(NORMAL_PUD, pmc); + extent = get_old_extent(NORMAL_PUD, pmc); pudp = get_old_pud(mm, pmc->old_addr); if (!pudp) continue; pud = pudp_get(pudp); + if (pud_trans_huge(pud)) { + unsigned long old_addr = pmc->old_addr; + + if (extent != HPAGE_PUD_SIZE || + !is_thp_fully_spanned(pmc, old_addr, HPAGE_PUD_SIZE)) + return false; + + VM_WARN_ON_ONCE(old_addr & ~HPAGE_PUD_MASK); - if (pud_trans_huge(pud) || pud_devmap(pud)) + /* We may relocate iff the new address is aligned. */ + if (!(pmc->new_addr & ~HPAGE_PUD_MASK)) { + if (!relocate_anon_pud(pmc, pudp, undo)) + return false; + continue; + } + + /* Otherwise, we split so we can do this with PTEs. */ + split_huge_pud(pmc->old, pudp, old_addr); + } + + if (pud_devmap(pud)) return false; - extent = get_extent(NORMAL_PMD, pmc); + extent = get_old_extent(NORMAL_PMD, pmc); pmdp = get_old_pmd(mm, pmc->old_addr); if (!pmdp) continue; pmd = pmdp_get(pmdp); - - if (is_swap_pmd(pmd) || pmd_trans_huge(pmd) || - pmd_devmap(pmd)) - return false; - if (pmd_none(pmd)) continue; + if (pmd_trans_huge(pmd)) { + unsigned long old_addr = pmc->old_addr; + + if (extent != HPAGE_PMD_SIZE || + !is_thp_fully_spanned(pmc, old_addr, 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)) { + 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; } From patchwork Fri Mar 21 21:54:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026079 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id AAB4EC36007 for ; Fri, 21 Mar 2025 21:55:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2D69A280006; Fri, 21 Mar 2025 17:55:01 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 28727280004; Fri, 21 Mar 2025 17:55:01 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 06195280006; Fri, 21 Mar 2025 17:55:01 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id DAFB8280004 for ; Fri, 21 Mar 2025 17:55:00 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 5E6B01A05F4 for ; Fri, 21 Mar 2025 21:55:02 +0000 (UTC) X-FDA: 83246914044.12.EC2229B Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf21.hostedemail.com (Postfix) with ESMTP id F41B31C0003 for ; Fri, 21 Mar 2025 21:54:58 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=GtP0DPel; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="xM7mvX/r"; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf21.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594099; a=rsa-sha256; cv=pass; b=zJyWB00u3yIpj7UxVv1SkK1OS3P7rhrYIk6f+IexYX/rxJE/SnOrPOCR5z0NOEFuZw98qQ NmVKPC92m2ONMJlV67yZryfS5ox4xYPEMaMG01xDmJYAEPXhERI7VVjMDm3KAeaCd0htjF Y3C/WQZZPDO5pIjerTLewE5e45jtJi4= ARC-Authentication-Results: i=2; imf21.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=GtP0DPel; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="xM7mvX/r"; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf21.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594099; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=tmP0Uk2iQ/RhVqGJpNWxQVOhjFWRkq0HRksYixUrgDg=; b=6rldwpGc8o9OxpBzlNJCc/VuLSguNyxLQyzNvzcOfhb9gH5bgfKlPBMJrAe0fZyuluUdwH Nq4OcpfHu7h6kxDGM1j+WpR0JknGnZRQWiOtaQvmRoycz3+brMZQjutbPEPTrpBRgAKKms dRYqRu3DNPdc/lhUfSTP47wOIr/nZ+E= 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 52LKgAZk002756; Fri, 21 Mar 2025 21:54:55 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=tmP0Uk2iQ/RhVqGJpNWxQVOhjFWRkq0HRksYixUrgDg=; b= GtP0DPelaGwzH2LyT+VSIL3332spxUe0l+/njiMxFL9nkaIlw3ZdLyyNS+IauzQl XqoMdLzKoD6NEdL0gqzYdL8MRJkljeLAJNzOVhI/4VkTv+DMBHQJE8hGUs1gKltA vVysP5A1XKiCxzkonhJq6h40p0rOV4RaAdrHTQJg/YX5o3lvK92jI6vcCPTI/Wu4 ECzvCLt72xeaKV8mwltZ/iH8hF93vcah1bTGwUHpdsmzsHJiiRgAV6Jqx1lHk18J kYolFEEDTg2niptRwnjsqOZhYaqxsHYzDIKKbb3PrFlJftes9w2/eel1bLlKBtmY 8uI592RGFVUFmvJEiIiKHQ== Received: from phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta03.appoci.oracle.com [138.1.37.129]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1m19qqe-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:55 +0000 (GMT) Received: from pps.filterd (phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 52LKVKAT018502; Fri, 21 Mar 2025 21:54:54 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2043.outbound.protection.outlook.com [104.47.58.43]) by phxpaimrmta03.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxdr1876-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:54 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vOArgzf7nn9xK3Bababozrh2WJTccYL5k4hTtKWCpuzdWHMdIkKaxcfF3/r7k+6WfrFsYmAKvMPFBcyEWfBepV72MUyRgUxDt9SiMlJ+BB82cYBarwQJWxAwRB1VJ9mQN+7T4ArI9pKZwgscDUy4bU7IY2qwuN2JBG5zqTyKdiUysYoP0L9uBXzAJuFecuifcjOZY0L3H1a3sMd7o6ZuCyL8vqG3hslqz+O3XQXpl9EgEp8leCRmk0+4rSl24nKcDdmzKJ4yz+deeaVniGS3ZjjRJUV3N1GyL3D0Yqos/0SYqZsArikw0hbcXyFmtmmLdGxvzsxLbzGQbEtaMw4WgQ== 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=tmP0Uk2iQ/RhVqGJpNWxQVOhjFWRkq0HRksYixUrgDg=; b=gzn+LHfP3P5UUn1Uqz5MfVnM9FGzPkZ8xVD48RYR9sTQsv2VdNt59HYAI5ZKFvwEwvM3XjKKXH81wptYMLfYFToW59Xrp5PIBB81Vwab/wvtE+FYBYa+cN87/HT2aBmdU9tVG1HKkqK9D8oqbrVpVU8Bn3PhRBx9V3NVdQVOOCsd9xLnINcKfJw8l/ccEQd9BZ6MmSOzIy497olLXnGqGh5spq+53T5p5UHbaR0bV4g5Q6rYvLsVUhqG08LNmeyS0rtxioYbQAo5/SE5CfJV1xklemSjMxBxmId3oVXc1WXlFU9LpdTQhWQet5XA0OKdlPDihHkeUoBaR7mmwQLAFg== 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=tmP0Uk2iQ/RhVqGJpNWxQVOhjFWRkq0HRksYixUrgDg=; b=xM7mvX/rbt1rXzDTP4qvUMkoyRS5Z5iLVYVLDjOzsGEAoUUOI4g3SKMgJqcbvBDSViVNKXXnVQ28KZ8xW/PGzum7XU2cXox/jwz/39JivSeQUoh8xinFwkUrT2yNJBJofmbo8y181YMF7jS7duzRkkmAX4QqOVcsgqkVBMTdvRo= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:52 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:52 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 4/7] tools UAPI: Update copy of linux/mman.h from the kernel sources Date: Fri, 21 Mar 2025 21:54:33 +0000 Message-ID: X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO4P265CA0094.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:2bc::9) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f3ecaf1-4cc5-498e-64d0-08dd68c3023d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: IZBoCxWiRNbfZ7ghuuVkIdmjgi5BLDt0rwNZfP1JG5DzeX270WvWWBnrIiwDYA+TbHT2rmIX0rw17MZgB9FXcmbIfEFgRfvkN5Eqd7U5LE7E8gGe9RWATbxVqs8PWr7qxFAzpAT3J+GpbsXSL80gHFicE8keJvVN6VrzLL0rRuIWjdBjA/9iyaw/PK4xHVuR0NOrwyCZJvkgHYHdCKcCfsWYtodrxSBGARhBD53DZynXApAt0J9DNdWeZ/CvmbmHYCkz70ejjyl8p3NvxuJihXJgsGbL2nLTB0uifIUSLMxtU/ZCsA3vdrFzvJW6y/7Gs5y4xkfBDQB9m22vPMjegvKSk3HFtY1vD31yXYblUuYS3fhkMw0n/ix50YoiZ5BIoNvJ5wgJSf7RI+0BsZz83NMk/ktg15+X983uRm8Js2/p1HW/QcLqe7VUG53lJor0to3p5nPMwgbKWrd1eHDhc7pNCls1OJz/EuFnIgwccc/kfPMCyfonBqhbnSXam0KPEyQOa11VFNAAtET4eUFyZW1phT1TT5dFCw0L9htMA4/vp0pIjkfo2HgdckNI3czS5Qiq9vAmflV3auSpz63ioBV+wPqNfEcoVhe1r2SlEo0Jsa95OeygDN/aZffe+q040Qcu0v02He8ofGKV/fVQtVKADI+xpTLoHaTK3iwKwVNwRqRwP0aTfFPYN71fKMqfr/dzHXvhZv2urBR7Pm0AhKi1/srE7be188HNWFsVhUFsdBPNjfEz1ziB8jbw3u2RPSiVQUU0oUuhyIcfaUmQEACdFtQ4scMNWiINYXUmA6N3ShP9/x+CmRASwJIvWYagtO13TmbsCmMkOZyzROCBVk/SpXtfeLokSCrpBdSbJh1WkDEbFIYQGAcFAtV85ovHy+z//1dDoTnir2I0ToPsUZY1Uoq0I2HP0cg9llWEeLLfVsDmuhvtbYJxpCO7dMmsOO6WXhxVJ1x/wWTemHm4oaLs/OFxTTkmUQaUKx9gJnWifMRhamw2i99pwgLpfespBqtfMIE2ESOKdUxuvLLBmqGRcZZPP0uWHdQFCxX1kTF/01ehPtLansIyovzdcRv9QiC00sVMF3+WRG88Hqv1NAYbgLaWxWAMqt7pLNpjCBX0yaYXSeEuo9nMg/nnwVrrWWuUnuCGqRGM7NdV4LHMO1kcUVxxNzR/q3mv8h0XOBJuUKiy47vtqnZYNCzXm3nt/1h0N1M/LWMNwtw2RSvTt6eWQGMh0jvdfreIM50SRTPH8RrsInf1U8iwW3+HkIOVQjmCuyd/VkTYGMIiava9589OFVT8ypp0P3HuQh+Gvap0+KciGtkeaHr9C5X8LbvBm75p94lNdI+VHDKlA9ADjqzzHkdEAg2uH7UK96j8kKvjcP89TiEEecDW43dM6Iyr 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 3y1JznIvANWMArJHem72tiylTiMmua6f3Ho9mso67fqVGmB2/S4i9h7kWXVSJS1MMgQPF+QuyDmtNEkFroYSG//VRSy1fWgDIZitOsEmvBjGfxrysEaBLHCa4VVJBOd2+4mAQxtcgvvPsROsXNtC0wD5gU80KYC7DNzkOQxsf8BhPeARVDfvSSQQecry+vc016w3zLvm5YPVBge9AgsoTCcDdWhp+nPHwu9vrgenzV83mInLAwH7pE9uQescZAhymZrijmQDZprIja8fo08zwL7Mn1ccF1baCSwFND0SphgoBzQuH3pbLvpe+dTMYgyt159IXbwuWhh9LltN08vMTHid+KCvFlpQk1OBRRZi5fgSWXEtVgw0PpWZzXiMJKdAIPTsuLyfAnf1QQJw1YgDPSOYhJplJtp4r9MUolvqVrl4G5BtIQ+5OYeuZJoF/96QW9JQaDaLc7wK2tkwiMBl9LW3VVsFzLHlro9zm5gTZMIHUqRFLh2KQVEWdda6v4Q4pqJaiMjnni2Pge0XxrvltMieMGIsCh3bPY9cU9iaTS7OodPP/98lqsRASCD908DHd3NZFmutLBajigJ2iQxhRTzXkXaNh8UIs4GCNQy0PoLfOSmBE47rv7cp+gMREb/yL8hSLK6nPUBY+ZEYoHrhKbrmjfA+ij6QF9YuK7UvIzgAtJwNPVHNbhRIi+ayiiseoqe0+t0qubWmfBHtNPLRLOKQuGjUD82BXod8iqw5FMhQauHC4in7tWXPB3D8ms59Yw+Jpr/xYctx4/AQVFzHnaVViBuskzmX+egTXbygvzRJ9hNgkl4m6gkA5vwSP/9hJVdj04WZaUuD9wJ8JJdMhYIppRh8pEe0o34G60GL3/cTOnMcRYd0JaxKlZ8iONvWWeUQGZb2xdBRZ5OsLyKFaqAL+KXCNqAYwSGRjKKhbJ1sMJ/2RhQchNDzd633s/8QAjM0XVNqiaq5RxIz8URdZp6IrrChVk9SFlIOX2ihA7tHagT8cX3GZRnhGu0QmQmyrN9AaUs9qCo2q4ABueCJ/py5swWMYxv9/BGvYlhyPwXfD2EeTqnVJodOvcpmaGhFGRKpI6w/oQvnajxY4HErQ5q4x/n0uTzjY7YA5rQ/hGJTQPCRVUhcTqL4BOXph4IM8HwPJlgducTiQjQ454CmKmmzEwE/J4ohXtwIMWOAcxCUvVnSMFF9rxh7NLN9Zx1uTTdH7kAkClfiElMvxQT8KQhXJEipHOQVl07hL12ZDovR3q9Bug941ImShDLSUnUZJPys892O3a2DQmzFwZLAkuOE4uZae7PT0X9pRE17DVLpVFYN56Or+z0RpvQ7LLVIxT9BG5v2+IKwAZLCN7yiVrZciaFoYqB5UFan6uN30ffxNC5c4R/uMEMF5T9kJvay3xz2dKXb3B/1tEtMbyQx7d+52OIwE2s9CqAQYgxLL9gaYoQ48z9g0+a2uNieNKyAwyBsZU7PApPheNJluF3WN9BWRMFcpsttMViP4jIs1pBdV6xNHDqlDTg66FeUZ8asiHHp4f+yy3yumeZK/30Ueqhsuf6y0rZ8a9DlDlrH2t1yxv2mXg/CenvS0DdjjOYpUZ3Iq096YNYYFmXs9iW6+w== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: KI1VcwJgtqIcjLbwA781xFIYMG7zr1xQWPoGz6rnMfIrUoYdJw8mKXtiRenY9mmR6+4Bzr6BVpA/ynWmDCBju7Un5uaa1jLV8ElzBq8hyuURF+9aq8v6lEJMZsOtTk4yKHCZR8y+XA3SkNsM/sFxtLy6rqWPgJEy2OskEW0trAozh7WhtcNsdV7dmML9TuHnKNCwGWS0mipwqN+6+yG54z/Ai84ZlHaBsL2BQccaLw1NyP8qSm3FIVrH0nD9Zh8X2PX1mbO/4Rvy8Mc7rZDIQWASHH56cJ0Trhx3xPod/XpR3/RRa8ycN7ZmUoXaWE4O+3f9JsKD4xwTJ/OVkc2g2YDq+SSkWSVxNSCqMfQWruZHSDrbsAEaecR5PPOIcKWMij/sU0Sq1NVTUM4te5WoNRR+mjVCtNG3bOlhLOCXoMTrbxUf8ytCamzqFy6yybN7RmoMiI0PUY2bmC3kip3qkCyT5EVczS+/N8p9JJJr4VRuoX1EV1a2rd+gQuNmtsTEMYCwyiSpa3XMJ7yfvP9BgHb2W1Mtikn8glIqch4BiyeTCYSUg2ATgfjVmhaUe7Vo4I6oktGb/u/egVmc8p1QRB4p7cbrDBh2RCYn3e1pQAw= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9f3ecaf1-4cc5-498e-64d0-08dd68c3023d X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:52.2885 (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: QDsbnOo3BDqnUTOM2RyExzxbfx2C5z5f2Wg0Rw+oZ7x9xtKNWZjmIH7nQ6vLTcAal87Xktuuql8aJJKtSCRj3+RY4feXGMgdeIU0Oh3mqiU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 suspectscore=0 mlxlogscore=999 mlxscore=0 malwarescore=0 spamscore=0 adultscore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-GUID: EiTMXTjRYeNsTXVLfofbJXzCDRuXyKEd X-Proofpoint-ORIG-GUID: EiTMXTjRYeNsTXVLfofbJXzCDRuXyKEd X-Rspamd-Queue-Id: F41B31C0003 X-Stat-Signature: d5zchsn45h4n7fbjz9bq66ay491a1sg9 X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1742594098-379762 X-HE-Meta: U2FsdGVkX18XrWcl4Y+z5vfJgbABpH5tVZt8HHtwvLYvzM/kxMv59EOeGTPmYqtI47CSL/ncNDLCcUtjdvDmJ7zhi3hSwbnKytw0N82QJP9brIelG8UTNG7sZG6FB6YkhqmxwKYdkFAUgAaY5sJqSStJn6V7y1hcClvC9Qw8loTn5DvhOPnLZrTn7pPVfW2W6SbLeIFZBD5rhF8Xs27iPv7g/ngY+5ldqcdDOH+iIvvc0m3QbYez/ZUJTyLj+E1wQ3w8vIHNmleAR6eN+4kPE98h2dQGl2kMs9TNq6+fD4DVD2b8S/mYUBUb29c58NcLkOzanYrd21hurJ62h9/blksu9RWQEZYxBVAL+g/UgbqZmxvS9QM/VVNx5ErEAfWRK7c+OTaM1x2vv34TNXOuuYkePqd2fssIWoHmeQKyhkGDcZFFsHDZ/44v0LXWB12o9KAZa7bL9pAVIsrati8qNm2HG55NOhFcAjbYvug2NNkmDMaQrA5VbuWwKLG5xjIggCq3U203xpJobScsWjw0SEWhMYoJXljwjtj2OcBrEtCyY6V4FlPoX0Cax82xuHKHegUidBIX8aqesK3ixcC7DVNmYan6IuKUvCw4odBw+yyUmRzW6iK0O7PpYPR+4IJH4YnodtSEyT4lYDdWwwtAkZcY8OaC+i+scBgEfdv4x51R7VpSzd4yt2OdzRwCjupcXUmH5yZReF7rMD/biZBYufL+IBX/jFaWfNIEwr+4gt0Fz5pRldDepprSo2umnkP/UX7J4H0Begw754tewr9lXNgRA/o6qOFJL2sKnbu2FqILnkzdCB1B1GgHzOSUQa/Q1KNSYrqDxYngUZ+Mg2rXMKbKiRxFjyudafMASOyczyN2gWym/k34WjBol9oMMFGK0VXDOMtgPsAqVDc8npe2cYmq3yOhtELthHPd+jJtEwFpa+XoThLO0rr4mns4uMD1vY3K5vQ9jd1Eernh4vh HQvruzLE Ihujh8hpX4rXM6ak8mK1Mwz6O5+/aVqTThxxl8gyDdoGPnRzgBMq1g5U5IthHpKJ3rGrFSI1725Bn2oSS+S7zsICyRtWLiHWp0JsJmdMuNZTpdThRdgDZ9hBb5H8+9HdGKEnSWDwWpp4mu9FQRUsAPg+ZLScPc1qzfAuXifgRWCqFmXJN/F23e5GS7LUFp/xr0GRhf/XfBlb4jqJABKBoXYzHjYKHaQawaIkZ7cEOZP+RqDT1Ss7F50dVxhRiRidbetYZllnR/KuKxCktpv0C33uPzTe6fn8VMHgMoaaXBNIxn05zGkU+KZiPvhzLEO4V2uKjLHgUvh1S8MjDBBUfj6BjEPnAIfAQk6LYhuQF2T08sK7heigfn6biVKiYfRKHhbqeVn2SqNmelyxCfqn9h+LVHGKzuU5DFGi1CZrVaKokbBVxku4V8lW2ZYRi5XLtsIy2NehumRFWoTGx+B1IFcKuo2+XpVadMZupm8004xMADemIRaIEVTA3Iz5JPsOE1J9s5R+l5s/yC81uwwQ0LwNTRSiASWgbAuydU8F2hLhqUu5oD/0y2wGO6SobNbAvxJrTMnrBKTdN/JetEsN0CaLSn26+JyJoc+rlpi+SOM1s8SZbpBY9gqbqDuxj2feOBV20oz3UNSsyhF9hQi/tHQpFIQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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/mman.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 -#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 #define OVERCOMMIT_GUESS 0 #define OVERCOMMIT_ALWAYS 1 From patchwork Fri Mar 21 21:54:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026080 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 985A0C36002 for ; Fri, 21 Mar 2025 21:55:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AD344280007; Fri, 21 Mar 2025 17:55:04 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A80AC280004; Fri, 21 Mar 2025 17:55:04 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7EE53280007; Fri, 21 Mar 2025 17:55:04 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 57642280004 for ; Fri, 21 Mar 2025 17:55:04 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id CDD0E160752 for ; Fri, 21 Mar 2025 21:55:05 +0000 (UTC) X-FDA: 83246914170.05.310D7A0 Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf14.hostedemail.com (Postfix) with ESMTP id 48969100002 for ; Fri, 21 Mar 2025 21:55:02 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b="O/7YFU3z"; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=GT84Osnx; spf=pass (imf14.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594102; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=9zNYJgFUqjiDIj+JrZEMeZN29l5x52LP4nrUTRgqIIo=; b=Dlt5RVWp7sB8j3EPQfP9gHBqjtxdL+EOf5DyV6PWrNF9EtThCUHaMA0JAldhW65CZifoC3 oXZcMFNIv6zT4Rdscr2qwJ0PNJKtLg+X38jCzZxAaYP8mNXGDxjJ+VRUsUAd11LpFgflFk XBh3RmSjhxuBzo/r0DrV4GxQVVVKfSA= ARC-Authentication-Results: i=2; imf14.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b="O/7YFU3z"; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=GT84Osnx; spf=pass (imf14.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.165.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594102; a=rsa-sha256; cv=pass; b=31NPVMC7rxGH77HnQmNXF6DoNo2gov9+bWCuMpkFf2MBMoXxeggDjK+0w6aI5uNTNdawVy oTkikpvPhRJgNF7NOTBcnAtlomQ4mnVH6Uf8VsDV8DYqsG8W0z5Lu2O4qDaNN5eYscwpZo x1K0IzoSZrKR1IoSD/c6pjavaO/3ss8= 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 52LKftPW019295; Fri, 21 Mar 2025 21:54:58 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=9zNYJgFUqjiDIj+JrZEMeZN29l5x52LP4nrUTRgqIIo=; b= O/7YFU3zwboWdWTiV+5Sm7/7aIJHLEc9PG6ZbSm6ckqpXEJ/oWGTGV1ow8ryqCwv f3WWc5lFAdkNsQ3a8xEKamcWwYz5bIl+x94OG3YQPuAJC8nsVpwpcdtPWd3JI/u7 ANY3m9GtW67SwsoX6FM/HkCLf+cXMCrUsFGsRs7XP5JYMXHj+4TpqJQwQVX2sUpr aX+dJVt4JLN62IHPuatctyNyPhZ0kQOXy2VrE6c/g1WyCvYxpJ6gti6csXulrSwK JYj5ADpjvTIV9bvVUMD4KMW+RM9Z69lTm+AIrejfs5r9ohj62M6T2RhGKa6WYV1T ymciK+XYz4zzSGz/PJQr6g== Received: from iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta02.appoci.oracle.com [147.154.18.20]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d23sa1t6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:57 +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 52LLU8PN008920; Fri, 21 Mar 2025 21:54:56 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2049.outbound.protection.outlook.com [104.47.58.49]) by iadpaimrmta02.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 45dxm4ns1s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:56 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iksubTIGfAUyVwSVibrNA/4PKBDI6wECvXlV5rDsR0P+qF35tLutt6pPfc3eZWkcSvp9o6AYFvWabe65Dcj6JMMrTORJcBIjm1msFwfJ+WUP83fS5TWejBZ1RDXqB6lyyUTWrsYVcFHiD3QKilSHrrR2jQ4+lmkd5jwNFf77W5QeRGVcWtLAk+W1ptlD8aAKZhUGePNv+0qaw2IGXzkfpN4sVVXrRVUKt1i4UTx+mCNxQt7qgXeixwcmvkHMjNe4I1RGCrNr2okQVu0Ye+nbWj9wWRT7XgpvA56Adj/hRveQInPYQvIkBtpwdNEDleSjJYiY+P64JgcKlUshr0ec/w== 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=9zNYJgFUqjiDIj+JrZEMeZN29l5x52LP4nrUTRgqIIo=; b=jd3lMw+lXOrhjO39QdBxrYNP5XoADUbE5q/9UHNc8rjctrItH/MYNnu+0TjwwM/MTKuXp6Tkd3w/sJ8tLCbZhAZfG6U2Jj48kllOsjN40uGzLkF9XYBLZnjXdQ3CuCQJ4UIU9GYyAlEnWqje7CNrx1oLQ4zdyImkHsCYGFwSC2dOYz3AotAIaIsyyAtnE00BRc8u9TF79L6vdlfFeWI5Bs+N9ASoWA0vDC37RLb99BcRB6Ehm8n9qADHyKMVmI4asZnqXe/odBoPIPZmgMEQ0GTu5xohShAbGlziFfDgRLO3NvXfhywyV+Zbwwv1kpPPZ8OyA4U5yTFnz4GUiobobA== 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=9zNYJgFUqjiDIj+JrZEMeZN29l5x52LP4nrUTRgqIIo=; b=GT84OsnxU8OXzCGb7EpeB1YtM/Ir4lNrbXqiH8OuxpJMPE9cx0JEI8pSjunhycoJL+ys/qFgEsQWUm5vxHXyyy3wQq1GIIeJrkNefdhL8Zp1bXO4EzwSu6qgK23Zt+4WT5Z7gm466t9yHwfZO4sr3tHHIINA38Mebs2G3yz5o5M= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:54 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:54 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 5/7] tools/testing/selftests: add mremap() cases that merge normally Date: Fri, 21 Mar 2025 21:54:34 +0000 Message-ID: <641ba4f558ab671f67267343ae6411a4ea9bec26.1742478846.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO6P265CA0015.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:339::8) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 374c0461-1a60-4c75-ddf0-08dd68c3038b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: 2pino0XX9qmYYuYoqEzqddafFvEgYlHJqrtx2HhM7kgUH6S5ulnqqrmkDVncdarxNMOdjWMtkoAIi+d3TM2VEySIgOpru+zM/oco9Qoo8j3+7+OqiPRhupePy8hpSpN7MvQ7pUrm0Q8mM0gR1RWHTKuLM6vf2O53fq6GFRNzaEM8uJrkw7cM/JQLgXcKlUsC31B0iNmFuB2ebL3Z5NdfaPV8CtWrnB+rd7B4Gtogy0T4T19znmnPOEAZ46FKsBO3w0YImNtYLPYIb+284VnjqYnQEubMbp89AzIti9EOBT1mjww8jvD+NjNvulZ+0ahAQS3KyjS+P9VFHmD+2LlUs10ScNVZDbkBM7B6E2B8wgTth4ruaCmwLjEalZn20pFZS2DjttIDHJ4aY0O+SbJJHsNVnBnPjSN5gZBRv7kwlYZbWJysxTK3nyv4i6YWm1lxbbVcI67l5Pq5VHx10N+OkO6kE6z0tyb8NUFMA4uAT/Rw+bGWKGIYN8fGoCVPIMEJTLmTpaDyrOUxix0RuJGjLSsggDkG96D9HMeDJOFbNuwKCR8YAo1u7JsrLPaaQnSOd8IGYyV9Gbevdu2cK9iGUp+0uFffijS2wam9D6awrQFXXJXJ/ccTQFLFFgVmBLqtkpPz9+zmJ6u/9I0wFU45g2NS1jsz58xMaha1Fi9iVYVSMI78USfu20Zj12FxgKf9KsW7Pppj51ECe0itYVfmFMxgD2o5PSJQ+5PDgRMijRKVDNOw6p8TB9GPctfaIv8nqZXuv+kPptJA6jg5GLMORMJTVgij4w5AvA3Yd3QemWhFXuZCPWE2Psn/nnqHXxiyq4/oAuswymbOaEran23iD57POWyUKytwu5kX45GBJMKwvK0H8WcgGg0cJi2NrsUo2TNwgr2UySzhEnT+5R4iuKSrA9iibQz+H1XuMlxhnKZWdhIFx20O1IR50sVQHyf5Fi+Kh4L3BjVO6jUE87K0Opk8SyIEClNRaslXdO+LnSfdZ0m66O+SrZolnTGtO9eR0voUkQTHzUt7DF3b0qQqrxUvFekS1tWRuxQ8tfn/xuvX9oZuA1Qn5FPXjT2SusTtVAYpwv/edVZnK6qAuv1Ie3oJHxfebbM2XHltpaO/3cqhpiB2+avIHbfe8ihIVqlqe82w/bg7b6yyvhlfr5I3tVPlvvyXGjgOd8LZV2zWsASNqTbg+9mxLa5G6/kvlJoyJMH9eAB/WJNo4Guc50o7iBpI0HXLLKo2cKBTF5Y4QxWdB/myciT9pVbT6GVDz9/M0AhaDXnXbvlTUf3IuAUzYSYl0aKhjf9UsEkP64FXZHWlCi3sd5P17Qh0Q09d6yQPqjCWxLMnyp5i2Z4yrvHj+GcW49/FWwKu3dNUCPRM0l+MofHg/o1qljytYqSN8g8Z 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bJDnfP7t718KUaYZLp5+4XaNH4gary9tjpKyXFX/wVNQfDaZtJUEX4OKWvglbwQPWxssArm8cH+UXFQRSK6bgP8sjOzDRdOkV0uBCLRGQNQ+smZ/oc8l+Ds8UrPELk3WLJ5UyKmm8IUMuOAWHjMJuZELaXyu8aSjjSMxJNDbZ+7g2lU+xccTwUJYS9vQ0zEF6201DoUAMAR83y3BkxxRoZ/7K1pUYCmyIf8UHrxyqLVVbYWQc7UKkeLZ9riofei001/UntmYa44J+NZjXf1aj/eqosTEeKbBXLT4T1n1bFbmDT3/c+ZV80InDKvp4zoD6rYTrVkmzWKALQMCed20r8w57NaXLnJ9QlBKYFQGXL7908uMDakGynYvprCWjbxHOIaEKA4URVloRS8YJAvJXAWUJ/1Z/qNAwStu2xrBAWE3mJno5+3DaQ6Y9Omhvlk4BppMorzrtyPHrTWSF9VuHVo9BLMbM0j26EGjxWOaaeP/6pqCd4Ju3dTwE2VaR8kLel40vrC4pvsyTd3vL9tLGKG5AEeusLj8rZqMEORa1lE8N/RwI/omxYHzpEUcjodp1i0SRr8es3U6H5Lcvj+fiowA23NXUot6cJ7u9ptHZ34Afaj8nFuAIMcBgvvaJ6md74qoZOOgpx6b4Vesm6RNZPqTLWQAS2bIxzsS/dqTq+sXh1tCsmHHkyguDfltRvUpyfzByoT5sc82UrH/3hGv4vtFzPRlrEnqNuT8SH2LZz1x1mv9s92z0CwpJrotptgaMrRx4yDqCULAcs4WzbWmlpHwoaucjP1hZkMuo2157NcXFWODov79g7MveqNecoo4/v7ihy391QiqmhdMHJvGlctDZs4+nacEKIyRzQ3TUqxC2tuoTDxjU6EveJr2VVwr86x+ZfOnCEUQ0l4iid9+kgsTKjZdcR4TDKZMt7ukvtq0InZ/Rie3sSCIQYs1NN8fzYXRcic4r0/VW1oUfBljzSnAWZo93iIzUHqgKyV4P3ML1E7pHSc0JVtpP9UHYTgknhVFOxVYQFCFKEviTtxbdvrEABV5HfH+lARmRoDOKStaAZje2z6EJZtM51BUD+dd1pEZyxhghLGhB81VhjNukVKU0xH8db++X6nCoZDfaQi3n4bt4LDZapS/Kc3Ufi+gLz+AFU8Q6RCEhPyhEoK5V9bCSUiLBc0Cze6306P9Hv6U4hlEHGSI6CGlhz7b82rIauIAl5+DIdThjPG4zmmffPYOGiYFlICkYTSOc1gIHIJvnNDnLFOK8s/yWim/CgtngyX9hraDwMvROTKoA6IhLUNi0MtcI1VOwvbsW0/gOoY0zHjkEg+X4PbzUE1b/+VK8yxth5i19ySaqmmw8hzw1qLbTB+3Cj7P32pZYm++r2BL6h59yLa56m8+/FjQAkc2zwPR1duW4HieAmfAmnqgDvFhoG12/hyfX24q1qg56CDRhezf4C6eOn//W4KnrYCWzkV9W/tW64ZsrvvgY+MViByGFzcv6VvlCj3muNDOd7+/WzyMzMVfQWghlVbcoPhrD0UT1DJGCBTEJ2Pp2y8lYh3X+HEHl2F0u9SYCyKPmpXVk1lSzQ0LRwNq2WUjoVFIuRXd2ZElZBbJPMv6JZsYtA== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: tlcn8V1uQHl4+wiwNr2QvwsYj1u+dfcG47ijLfqdTIp9TPWIkPY54RkWw9HqGb8rHQmZTitH9ZacrvlsW9ijqgDb/fsEBncK9Oc5pDD0WvQ1M+/NOIgHF1oDUQRQVdmVpvZChNbCLG4Z0AE0UVCXEN5d4CS//ynn16JGk9IDDoI/d3dMf+oWxVLvjR8YZTvmkK/XrurnmbWLHsbxa8mqGSfAJN64GyMTnM3kUKoa0EZY6FrdORuAFqkd44r2uFqHxas5KH9Z0knzcV/0Yd+v+TJSi9UFnZYYpPF1IikiV1GnPoo59Ooi3PnzIjvwanAaNVq0NX/0/EyjNjBbi62Vc02DsU/bGOiILqe0XiMcBzoF0LWC6zz1aD53HReGUZnNyh8kjLGGEEre749j1gC4ocr+l5Z5v/vjjKQxhyNA8MP8y6ovVOnK64+FJIVw3vOM2/8FzzNppSOSvve4gN7Y7FZmYna97jtJbnkxIE7RDm+0YSHSV9xM5HTZZ6X1LDYASHtH8ULg7QW4abRF1qvXQS5tjJaz/K2ZJhcE1pNH+5EpIRe0rvsDzokSGNSS07pbXAxdOZdZ704qJOXBEGljp7fmQy8UUNtY5tIrjWck5rY= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 374c0461-1a60-4c75-ddf0-08dd68c3038b X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:54.5924 (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: XXyVSL/hDN9SER300PqRMnMeyYib0Y+Ue1dJCoEIbW2/+//dLRWyzFyHUk8R+86sMJXAH6KfF3NyHPxSJRya0293dBg+msqRUVa3a7qXHL0= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 suspectscore=0 malwarescore=0 bulkscore=0 mlxscore=0 spamscore=0 mlxlogscore=968 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-GUID: xeNBrisSgKjB2iIVZJpnrOKRGsr_RaBR X-Proofpoint-ORIG-GUID: xeNBrisSgKjB2iIVZJpnrOKRGsr_RaBR X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 48969100002 X-Stat-Signature: ybrf3bueqd5ms3c8rgdhywb3ih8pj49w X-HE-Tag: 1742594102-984284 X-HE-Meta: U2FsdGVkX19v4JWEJzc4Eszfoke5NxKUU8MTPI7qA10SokxiiXqCadCT+TlZ1k39qofjuzJOc/ENHdhXhPRG/CeQnA1iFRyaz6z5jE9wle4uUM18QYMIZTEzxqmuf0H3YegKK4yO3ePc+YF18O12QhgmjZEXQauqUaIQtgQOpJwwlSXP+KaCdU9ckygk4KxyMp8RzMf6SpvicfUyNH0cUp43KQtF6Et3PU3b2tPwCFwAfQyu2EndyCSQQphXB4FDA64eZVTismcz+GMbV3Vat7YaI7BIIXaJnbdmc5hspioUujy5xig/GOSqo/qqJ7l75aGG7vMX4Kj3HYYnR9qvIrvELic4Wrv6+WyOjVFnceCrPOix8rO9GPuf7I4ixodT+th7C6wcIuvLaxWzXWKlX1OW+XHJinNZ5tsnccIeFcavK5QVMSsWt6oCs9pmjlx0Id3Ib1nsX7ctb18mLIGO07j4C6uVK7oVq0p0uCpD1uMNbTpqUdz2lYFDBTCer7eyvBcQXUxjeZqRWRLu90cBICfkvU9sG22tglceQuATyNWwt9zqniL1hosDtJoSa5JcHtk1tezxghipEm+QUQwHBhPPwHeN6RU15t3ZeuAm0dSRFetT6Tr0rSv14s9QhL7e0sR9GDCvK7b662jgURyivkQwc4abpbypFn9jgJptbxFYZaDYet0o/23olqI3g1HLkTEef3bq6/Oz2tItWFHzfLUHK2o+06aGrDu6tbFgV3FGK/slGnY8AtKNDpbYty2e+43zoliRjApRURs64ugQjsX8mQf8IB3u5EVbxQXhyFputROk9V4UNgr6LDNW9TctNAQtAqbDW4KKcSMqSsW0HUj6e6VBLe6gaWYY1GGcB1ZbbsPVyK47NLSyuM23t0+mEG03mbb/MKE5MN08Pz35HIWZKC0tK+O6IFX9kfe4Kf4HYJt3LlPi+8CPhUoO00VK9xh/PQqBUAeCd0Igg+t 9cKCN8A0 8u2bjyUhaA52MZFVEFLG/X3o64/cRpgfIN13YI0tFSc/X7UdrXj3+Xy38yZ6iVcGk/2m8/Bc6rYTn8ZLvNhCm3HsbU+NdXXkhCX6SJKRqJRVmESgA+nbnZWaTM9AEX2u4JqbhwnPRovYo/yYTzT/roEmJJADHNQaKND7PN8cs9uP/7iM/lDsKvjDLjqb6Cd+NlrCWBYcMfmiQoslYIpj+8H6FR8bl8nfTG5xz9Zzayn5EAHPoHNve6raCpm9WbMaoeD0qR7xs2vl18pRLBB3vMHccBWJfGXbqbjsd++4+nxeBq028bRbykuVT6SgTSxgC06V6ofVaN5GVjvs0WUvECHWvgPKoLyfps795raRQmayRQpYlByRiXCOtvx7z0eb6z68UwzA5Khe8h1Wkg79V+bdhCJLKEdk1u09NrmYE2UX3KdFhrO3UEkNYDcHmvA8Yzrv8a9U1C9J09bqP+MyeAYhius/4zlIwoqhGCsUeYTfb4dfPqyKIcJhizt+ID2WMukpxz9cLM3klf0Cdkx6gUl/Aro2AuoyX89q+Jo5RuAPVkFvOHiw0la0XW6R/fOAwodeb5LQk/xuONa2YhxEnChVlDUACEP6A+uWSdJpI5GEPgI4= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 | 608 ++++++++++++++++++++++++++++- 1 file changed, 606 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/mm/merge.c b/tools/testing/selftests/mm/merge.c index 9cc61bdbfba8..7c4f3f93c30d 100644 --- a/tools/testing/selftests/mm/merge.c +++ b/tools/testing/selftests/mm/merge.c @@ -8,6 +8,16 @@ #include #include #include "vm_util.h" +#include +#include + +static 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); +} FIXTURE(merge) { @@ -20,7 +30,7 @@ FIXTURE_SETUP(merge) { self->page_size = psize(); /* Carve out PROT_NONE region to map over. */ - self->carveout = mmap(NULL, 12 * self->page_size, PROT_NONE, + self->carveout = 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 +39,7 @@ FIXTURE_SETUP(merge) 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); } @@ -451,4 +461,598 @@ TEST_F(merge, forked_source_vma) ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr2 + 5 * page_size); } +TEST_F(merge, mremap_unfaulted_to_faulted) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = 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 = mmap(&carveout[7 * 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 = 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] = 'x'; + + /* + * Now move ptr2 adjacent to ptr: + * + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |----------------------| + * | faulted | + * |----------------------| + * ptr + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 = 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 = 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] = 'x'; + + /* + * Now move ptr2 adjacent, but behind, ptr: + * + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |----------------------| + * | faulted | + * |----------------------| + * ptr2 + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = 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 = 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] = 'x'; + ptr3[0] = 'x'; + + /* + * Move ptr3 back into place, leaving a place for ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | faulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr3 = 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 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = 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 = 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] = 'x'; + + /* + * Move ptr3 back into place, leaving a place for ptr2: + * \ + * |-----------| |-----------| / |-----------| + * | faulted | | unfaulted | \ | unfaulted | + * |-----------| |-----------| / |-----------| + * ptr ptr3 \ ptr2 + */ + ptr3 = 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 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr = 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] = '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 = 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 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr = 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] = 'x'; + + /* + * Offset the final and middle 5 pages further away: + * \ \ + * |-----------| / |-----------| / |-----------| + * | faulted | \ | faulted | \ | faulted | + * |-----------| / |-----------| / |-----------| + * ptr \ ptr2 \ ptr3 + */ + ptr3 = &ptr[10 * page_size]; + ptr3 = sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr2 = &ptr[5 * page_size]; + ptr2 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 From patchwork Fri Mar 21 21:54:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026081 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C6C1C36008 for ; Fri, 21 Mar 2025 21:55:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 60D33280009; Fri, 21 Mar 2025 17:55:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5BF71280008; Fri, 21 Mar 2025 17:55:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 34DED280009; Fri, 21 Mar 2025 17:55:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 0ED53280008 for ; Fri, 21 Mar 2025 17:55:06 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 8DF24B80C2 for ; Fri, 21 Mar 2025 21:55:07 +0000 (UTC) X-FDA: 83246914254.30.E098576 Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf08.hostedemail.com (Postfix) with ESMTP id 3EDE816000A for ; Fri, 21 Mar 2025 21:55:04 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=EiP4urQ4; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="Rm/Q/J96"; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf08.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594104; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=R3VQ2JKT075yM5Mu8/gj6ahdUavobj6twKvRFNDdQMQ=; b=ueHBSPVotMvci+szWoSDc8hpB2fXf1oGin1GG0ptIsFtBpTkqwo9dL9f6wgP6bLrcDx2Dh hIG80yYppTALRoRAMco+QqstkMKWCFGAE+C7HVcSxjm+2cxrdcKv+sbw4G5wlv6cmQcOsN SULs8V60j2tzWL09vZiE7u8a8OlxR4E= ARC-Authentication-Results: i=2; imf08.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=EiP4urQ4; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b="Rm/Q/J96"; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=oracle.com; spf=pass (imf08.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594104; a=rsa-sha256; cv=pass; b=vC8V9Rjdiy1AEow5yf+c3zuvzjDG0TcemNMw+m3nmuqdN0+QcSav7lwJJryBgx/dpefN6F Z7Z6XzrCHabPjg6uxZkPOoAGNOOTnO/R/huoySg9BW269k85rR7CGbWBzaCmDLJDlFJw31 qXoPty0jnZ+OQXw+5b4Jy/EMy2iemuQ= Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52LKft0G021302; Fri, 21 Mar 2025 21:55:00 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=R3VQ2JKT075yM5Mu8/gj6ahdUavobj6twKvRFNDdQMQ=; b= EiP4urQ4ji/nvHR9OSshYivsMEsXLej90114NV9q0EjGY5HkeXgUdmBHGAp2oh2+ 85hqTjirH9OI4WjCeIbnn/UpQ+ufm6AXkac5srSb6rSAS0/qeWagmr2+Mf+tifOv fdJeQYuMyhXWlulAIriBJp2nsWcGc1f97faxjb9WlJRBXVsj7CSsHaYkIgNiyhie AtxIiO8E9mBNFwdB0aZZECI3r9DFypg/KWUZSEGHBQkx0Dwm2WcWn5KGZgDCKD+/ LZGOBy8k70jeVWv8CR1uHM8PVUNcLA0suZrDYjJba6Bqmh9zGcF1bj3mDsz6ecrI CaFkJRiDzAVqAzKyq/HCgQ== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1n8sgb0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:55:00 +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 52LKZM4R022350; Fri, 21 Mar 2025 21:54:59 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2174.outbound.protection.outlook.com [104.47.57.174]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxem9n0k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:54:59 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mHHgGA3t73IirT1GXWXC9x4ALCxR8p2lyzQrhqZJJP6VND2hmXDvQG0WtwbPyM1WBY7RntXWvvQ7z+bhAgD1s47kSNrt/MZjBCNsYq4SE4VL0IUxUQyoGc179bveWL7CZiU/eNX+lquisbmShMQdBBSx0ff8QN9WLIhGIUZrNSWNFZl5XRBpNIihapk6yisfH0ExttlNYFsjQAAv1yuDBMj2B8Nb8umnxYJMK+OCX6DiELwlbB4HJ4s6tHPFD+NZ9wCNs8eTS+82/28fxHFNcrItreH6KO7WmPwdZ1AeXvWc+AoGYy0W16hyLM2wEohbNdVQTIwwni/KZnTuKK24fA== 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=R3VQ2JKT075yM5Mu8/gj6ahdUavobj6twKvRFNDdQMQ=; b=AFSd+pJVod0P50B8uCS600AdkA14/gjdsXzBkhlJJBLFfoyG7bz3wjGhG03HnNp7PzAi+ofiNYVsa+uCzNGrWdCuotR0qoGWV122AeIyH/3kPVEKUWioyToA5OJca6QWbyp52jDcQf3uW4CNhlnlCvbtLf+7oyYs83XPY23nUe4YgLQonU1xyM+D9OazcmGQV9y6+cQL5nuidvbnaNhg/qGf6sbl4W7ANvVBfjw9/MjKaHtSadqM4Yiei6jfKlX0Zpi+0atG1wN0MzEiJ0KJ6Lmt6QQlCmJdcZUYvTjuF81hiZl1q8iwGnA4V1N82yMX8bM/8MRszCR0rRB5EfBmxg== 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=R3VQ2JKT075yM5Mu8/gj6ahdUavobj6twKvRFNDdQMQ=; b=Rm/Q/J96gxfCfeC13e4E+akdDEgnS9PY+Afdt9ei8wXK37+K1YzWlM3Md+CvjPtrIuS97ZXHzQchFXB8RXLX+S3mnkyS0xXUtVVgBi7X3mUHyVhlczaNXTdT5qziTZildJo5+ysh4gXbDN+yM5vjpPsSj/XxPz8wGaV1QP11i5M= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:57 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:57 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 6/7] tools/testing/selftests: add MREMAP_RELOCATE_ANON merge test cases Date: Fri, 21 Mar 2025 21:54:35 +0000 Message-ID: <8b82838696e93d97161af4f62f9f01dc9981ec7f.1742478846.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO2P265CA0296.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a5::20) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: d82af179-a55f-4735-273f-08dd68c304ed X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: cR7QUkOC5O12EGrlgvkCXn6lXhydVkAif5YKX9MKD2gu+E+gI3aRAifrgx1bwmaNqVlr2u/b2vxDrQSovrZcllncdXM/SQYv8ioWmbbiXpGxha/OwXUj6+MBe7LrO5kgaUmzJU3aQgRVPUgTrMZdzU7GxZNwc24W70icM3cCttkcfiFYySwOtTyDiHWd3z+0PhOpeoE5DsGhS+lw1VprTzqBN7nbbO0sbaM0nK50tOubZcU6DuTtmK/I3ZQLjGEHyMR9VSIsiz0GLqItmSutNC2iLpDul0l3aumsMBdlSl6wE1N02nTfLCjFUongtnpieJdkFMHGdM2gmh9nyiYcN5ogVAKzzclQ7vPu5aTo4Xey0Cxs8q2TtrguHkSGJUBDiOW73GcnwjpjlmE8GgHjKX6FIlERs+QwFQo39Ei9xKlhGPBCx7OrBNfpHjkU8Iv/fzYHE1Lzb0KPlndpzAOYJzii6+0PthntzEn5kF7cHUsGc8vyhVfMZDnzp67WqHzAbuZplRriVXL6ORAOLWaDpoVx9rzU0+SLYLvdCCSjPvivez2b+Kvpz0H9g55rD6OP+3OT6rEqEuZOAlqvWUDC/NaRO7C9H6fFhL8SJ9fNfblklUzUnx/s64Wt0bVkHYKmWvzVd0GnjKZAvWuwRdsjCqKeGJBkeYmUK2Ca9jsvGvCt9OYO8Qe+4RGFYm2aH/XGtZSoCnMgxptdpMwKcrC7rY079oFAr2lgxbjWUkNhHJAYamFFRk2mQSohGjOYGPEU7YMz9b25Jk/OY3BPnj+cCge1idckl+o70AzLbdbJwmZJsdnl+R998gZvXfUZ2N72nZvQV0Q4PyRHrUeUqhCgbgLU6vpZEIb/PsPk0mfe5/e7PnMYe9JRp4kjAOvPaxCLDOcib/QNHHFh5x3RikQE6mVIJ/NUbug0SwRIQRCFsT6KRsrkjnU6mdhXBjEp5pSiATMOqAYDGbGBbimaruUQZV0WNDCjpqLVd9JBoGWlQyfbjzzbYanr/Bi4Z2PZ2ERxL9PVzMPkuaoTQZqOGm0U7mLOz2ZGDMsnuFIajvwUUmEjTp+Hphj40P86EdyY8kCIQr6BZwN/CbWAVDRaVo0zNYxEobKuGson+LS/kin0k27s4S1B+4J5V75m9jkMAy0XyyUFzKnkIDF961j76um36dZSzV7mrPy1vctbFLNOXXDTDAC6oF570GYBlDgve8VB6hYItScaCXlcyyp43ZyOpm6Hv02XW661n9P/Ho/EW1m4z//kyCva301Hs+CZnCCo/vR2TYos0C5hoDWf4NFuQzxX6nrTCmVuQBWNjHTtEpksjV91DMT3fPaUnGJkAdZBtN4YHp9CRjumt9R5Mtp7F9TCel3v7/bUGEeLEkOjQS0nkbN7Eyv8FJNSw8kvRAQ5 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Ox2Ak00aE9SCo5vqyV5nHHMsQm5XIQCQF4AN8BN0u7zddr8QI0QJ0th78MJGAhpF5fjJwkPhZcHG57tAwJuz8LLqRgbjy3xpMiF4AMx1cqhRQc9HHpQIab55fqYRDj4TVyE/25eV9SuFoHmLZ+sQ3aANyKxKYcz3yHojWhWsiUuhiyQGGYTECXx475Jm5v41SlmsrvCaBcmdt2DxYkT+B3PIvW45DBJeupd6lg6woTEjVcP30IZwxGOb8PCYMxVPkR2N7lpD6cznPzq19T/ud9k6Q/BFUcVQw8MAJY2GJ8QIoXOL9+uXBBCHQQ/6b7P8Dqkoa4dUOTlAYWcTJ1E70oCDLeCsVHmKu/kX/SRztGU3CgUSniirkbJDOe9gSvIQgyIaYgHaep1YmvK2TyPe34s9dWSmB2sI7T0ju8TN8+60Yo80RyQZCoM58Q0VEhURS/w+y8xBYY2ThxYEgFd3WkS9tYTGxPZj15Lxf6TW3NH03DLWLcuozFj/75z0C3g29/TxF85njDC9+Fm+IWO3uV4i+9KrNzPC1U1Q0WuLU4IwLNd/aVNoWM9/cHS4n+4in3ZGHXQZYwUg4vSuLR4TkV1e47UpRGt9jt2yEvDk/IllHHRynxYt+pEhfBIQLCKo7GDCAaIL4rb9bKJEnFLPJFK3yJdYSRnv4oYVN8pfZf6TUgUZWXw2JJKoj1pUvHx0WU05KoWX/u+inSfjWvctJ6L0O6yRDvY4hQ+n8FzazOw+Ut2iiotDCSz5ZSuF9bvDM4CxmWxqfrSWUypHOULsaYP0opb32nIxNM04qZoGIS1dL4Bdw/T/gKXMdF4d3SQtVakVHNFzHDJNvoj984SeEBpkyejDiuYpk+L/TTA0lL43BNUBqDNIVS1nEBLj4K5TgEzQjmvKhbHWEyhnN5DuDYpmyA2ykWNHsZnoxA+CNMlFTCCYewkwp+chZOhWsrUqsfp2DIV45u6fn9i7iQrAv5wjzjFhqKP82kHz3nN9IIpFYPr+oyBwADCjyv1kPrlhw8Thc4e4dfcRlw34ehciyMYSCtKHrYsYzQ6/7tw1HE6NIHuYBiz6RfyuavFZC3mRpYn2LjkUgexGUxlpdO9VVOhUw+HUq17qpH+DolhXxmZEQm0iAk1ySmSsG67txpHOlTrqMVuO8cFtC92TEmN8+tIi5TlcmAzPA8NF5p4dBM9vmn6lFKqv0OMppEh3Oz8LmtunF+rv/QaXyFcJz7d/rtQmwPilWLQYF8jURULJIsTXHLvYpGKKLd0ikSfKMM45RRPOeBGU9YnViOsJs2yG2xvep1/u9IK5Nq3nrvuu7S9nkf3mAX4zpwCFX77OP3QxwtlsvUyTex9/meVk0ZNS6Z8UYcEFaIZ8hynKU9hkCnLKslzrv2Bmt3wnDoQPHAIOEc2OXWcbWTlaYyOZjVfrh3NB+/VH2GtBPaG7ifhfKQNVDiyQJTRRH4IyXdYbp2Fivw5+6YOZK6J4nD5v5gCnmaorcbtLk5Ija2f5cPGVZDMldqZrVGcNle9Ag7ENXa+t7C0LKFUl7hU+riAX/V98NGICqyPTd7kWHzmR3lQktPrphzk+fF6PbA/a4O+YFKuNcdkA8X36EV4HKF300U3fWQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: AWhWbLDdoZ4+c4BEgK+qTzSfwTS1RUOUHcv/T2FZQsPhSq6ANuc21RuRVZNPad5pFbJW2lXfO3HnFyoLSE3PfIkLNYcEfjVWDEmmNNtuazsJqR9x4KaG8dATqfMmA65bt/spHMQRfKaJwizNcBudQZ59+n1hN+XdNu/WCqsObkmybXjLGHedmxbMQE1Ejt4hww8jG/aegB+ccZF++HllGWiiXed5+AURjKUKHR35dDYDCGYKudxN2O/vFjqxUybj4+YoGvg+xSDkFjzMEmv2BsAMgNkcewnBFavbn6Re3C635jlnX98giG7xfEPFoeSlY1OvhsE/Am+vXbjTxKgaWaAJcexdNRJ6U1XRpwhR8+cFAUTZwgagefwCZ+Arae+deT8VlcZUyUqINEaDIJ/QqtBSEmRpiq0FuVZRl9642Log+p0JgDUQ1iSzNiAtCvKAA6Jw37ISSkhcWObewqOAKpYkuPw5PsT82gxUyAFNL1iuTkLJuh2y4UWPyyKT4uKWbi/CFv4rSCVMDU8b6fJLwa9+H+eC6xbS+azzOPYPL8eKX1UxZ9fCFcs6JRk12wI/YljLaB+uZFgXBbsblbrqjT11h+XdDnCvTKtKnTtKRsM= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: d82af179-a55f-4735-273f-08dd68c304ed X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:56.9252 (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: di4QFTdiJApTXj8Ct0I0E1v5LpGRVxPA2GOR35F4F7rsiRmi2xsjWWVeW0CroCIZxP8ivDTnH7Xw3pdKkYp5YeVtqAo46KL3P3DdaBKAbYU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 phishscore=0 mlxscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-ORIG-GUID: kUoJPsbaZm0xmfxgQN2jzPH2HhbEZvQi X-Proofpoint-GUID: kUoJPsbaZm0xmfxgQN2jzPH2HhbEZvQi X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 3EDE816000A X-Stat-Signature: xuifxrqbbf5r6zpdsf4x488tchd1rcmp X-Rspam-User: X-HE-Tag: 1742594104-889137 X-HE-Meta: U2FsdGVkX18L6TeF7h6ywoM6igYrV+YsLwYPbnnTZWMPh2wqQFx516GxDP3dvo5uOSA9pdnKxW4mnpHm3J0qX+rGV++BHe5bS79kVzHWLAOwj6W6W91bjUgQkJbkPrxz8koRN4adVSWn9AhJMnuB1XIB7uuRn4LoqDdxiJMcgcR3FfYWzjoqZaT8jB8orp5eHMJzgfh6sXjCY0Cchoi4E/uik6qNucKYMBDy87bZjiZJZeVe+8pe3mRrhFOBB7xi99vClteH7v57SK8WKxnkR7zdV/G/vh4YyxVhmVEIGkZ8puesIcbaA27TlwkvsRt1gaCwMFbn9q1JSg77s1ATseAi5Xitf8jbRgi7qfKAHt2wMrhMzymRZE6ko8fX7pPItfUTeK1ZOGnJzNGjVUg2B7wsQHFH/UJDriJGZ/rOZw0wCdueVw3EMOblSugXSAfOQCy3UljeXXh+ttA5XmuFYgFP6UQ1Kq6aLMNUG4oQe7+PhGwjt8wl+BtWeWoEMv/gBq5eeC3QMO0aM4mIY3HEnlWlYWELk76rJAIuSslHpOMikulZQ4R0h85iOIGS+lKxzbSEHpKGCTb+6iqtbj+i2GSViEJFijWcksRM2wEGUE/YcNGEwd6S2YLEh7ENiE0RzlrWa2b0K38TbwvPdtIazrpdAZJNB5HQjNGRCzZ7FMekMlAUDZunMNfQXavRiar1AAi93S52g9kQ4tmIPM0fQPsjYNDPnK6Tqe86RUWYrE4nsp536HkbGljR2mf+XAmuO6wg1fhkgm7I9QU0QHhbi/Wwc8bwxYmFpcjRpBIQ6Ie+n74wwlSzGfc0YekOCUgrKAgbIkY3CwY+SAZARZBF3mdjxLe/l6CD9M+ozZep6Bo2iorn1lYCuoLaZj/bhton0JpcGrvj+9i86yUfcu3dBxTtzMNVycQ8y9LVZPDemwe40T1tM3VHax40YFFOv1K5aF83dcHvn7lhHnaA0M8 VYexr1go d74i8vwvrx6EKYtgPj2X39/XvNHVLenawHXWxfp5ec5XqA2a9Ttz5xQ40pKnSzqM6M+PU8VnCZaXdLfc5iL+uuvLVGsjiLasXdmfau76dSqVqo16615vhp5D0yuFUL/ivPuZPdNLdi/OepxI/gUlmTPRau8+cy+oKKF9D51SswA2lILS5lZ49iEjQuDOyJqtAPPolbdoTyMwQgNO5HHKjPzHKMLN30oIL8iN98ibHuoYTCAf2v6B2XV9PMZ6ethOLvYgxvN82Bextn15IgPHFfA20wlwDA1O1jAh+oW3QY99BCOCFpb+TdiquqfsBUuCqYs2JK6HsX+IZwXByC+Qn4hIUuU+F6bITR3TuOLYPLXOuwm+niV1ZD02LrRdqtGx5pTwQ68eGKYzrB6A3UF5lHJ/Wfw2miQTBESsye5YYFp//uZETLqleZrSOYFmeBIkEg0B0gfYpcuvXbtHfhY89eJCnmrLKYWHUkNBc60qptQ+ui4Ubsqsg6M/hvcF3JSVyMKaA7OkCK3+RVRGz0l06wIwqyQ530O+CNxilHbcs46X/TaP5ry1AhvSi4i0hlWzn6698ymjhlWjzbROumm4tUDW29h5jzTTolrWj6XRDgVT/02F1drk532Xow/9Qn4gcJhcbbkQ6zE1cFOAVWo/aoFHvOQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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/mm/merge.c index 7c4f3f93c30d..bd1b82665348 100644 --- a/tools/testing/selftests/mm/merge.c +++ b/tools/testing/selftests/mm/merge.c @@ -1055,4 +1055,734 @@ TEST_F(merge, mremap_correct_placed_faulted) ASSERT_EQ(procmap->query.vma_end, (unsigned long)ptr + 15 * page_size); } +TEST_F(merge, mremap_relocate_anon_faulted_after_unfaulted) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = 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 = mmap(&carveout[7 * 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 = 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] = 'x'; + + /* + * Move ptr2 after ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | unfaulted | faulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 = 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 = 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] = 'x'; + + /* + * Move ptr2 before ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | unfaulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 = 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] = 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | unfaulted | faulted | unfaulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = 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 = mmap(&carveout[7 * 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 = 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] = 'x'; + ptr2[0] = 'x'; + + /* + * Move ptr2 after ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr ptr2 + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = mmap(&carveout[6 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + ptr2 = 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 = 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] = 'x'; + ptr2[0] = 'x'; + + /* + * Move ptr2 before ptr, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr2 ptr + * + * It should merge: + * + * |-----------------------| + * | faulted | + * |-----------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 = 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] = 'x'; + ptr2[0] = 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | faulted | faulted | unfaulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 = 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] = 'x'; + ptr3[0] = 'x'; + + /* + * Move ptr2 between ptr, ptr3, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | unfaulted | faulted | faulted | + * |-----------|-----------|-----------| + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2, *ptr3; + + /* + * Map three distinct areas: + * + * |-----------| |-----------| |-----------| + * | unfaulted | | unfaulted | | unfaulted | + * |-----------| |-----------| |-----------| + * ptr ptr2 ptr3 + */ + ptr = 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 = mmap(&carveout[7 * page_size], 5 * page_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE | MAP_FIXED, -1, 0); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = 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 = sys_mremap(ptr2, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr2 + page_size * 1000); + ASSERT_NE(ptr2, MAP_FAILED); + ptr3 = sys_mremap(ptr3, 5 * page_size, 5 * page_size, + MREMAP_MAYMOVE | MREMAP_FIXED, ptr3 + page_size * 2000); + ASSERT_NE(ptr3, MAP_FAILED); + ptr3 = 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] = 'x'; + ptr2[0] = 'x'; + ptr3[0] = '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 = 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_faulted) +{ + unsigned int page_size = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + /* + * Map one larger area: + * + * |-----------------------------------| + * | unfaulted | + * |-----------------------------------| + */ + ptr = 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] = '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 = 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] = 'x'; + + /* + * Finally, move ptr2 into place, using MREMAP_MUST_RELOCATE_ANON: + * + * |-----------|-----------|-----------| + * | faulted | faulted | faulted | + * |-----------|-----------|-----------| + * ptr ptr2 ptr3 + * + * It should merge: + * + * |-----------------------------------| + * | faulted | + * |-----------------------------------| + */ + ptr2 = 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 = self->page_size; + char *carveout = self->carveout; + struct procmap_fd *procmap = &self->procmap; + char *ptr, *ptr2; + + + /* + * Map two distinct areas: + * + * |-----------| |-----------| + * | unfaulted | | unfaulted | + * |-----------| |-----------| + * ptr ptr2 + */ + ptr = 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 = 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] = 'x'; + ptr2[0] = 'x'; + ASSERT_EQ(mprotect(ptr2, 5 * page_size, PROT_READ), 0); + + /* + * Move ptr2 next to ptr: + * + * RW RO + * |-----------|-----------| + * | faulted | faulted | + * |-----------|-----------| + * ptr ptr2 + */ + ptr2 = 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 From patchwork Fri Mar 21 21:54:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lorenzo Stoakes X-Patchwork-Id: 14026082 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 27DAFC36002 for ; Fri, 21 Mar 2025 21:55:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 38A4528000A; Fri, 21 Mar 2025 17:55:09 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 33A44280008; Fri, 21 Mar 2025 17:55:09 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 118FF28000A; Fri, 21 Mar 2025 17:55:09 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id DB1FC280008 for ; Fri, 21 Mar 2025 17:55:08 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 5FE441407A9 for ; Fri, 21 Mar 2025 21:55:10 +0000 (UTC) X-FDA: 83246914380.21.4DA65ED Received: from mx0b-00069f02.pphosted.com (mx0b-00069f02.pphosted.com [205.220.177.32]) by imf10.hostedemail.com (Postfix) with ESMTP id 2310DC0003 for ; Fri, 21 Mar 2025 21:55:06 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=ajg+Lr72; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=zUvQxknq; spf=pass (imf10.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742594107; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=egGtESki8KL5HAPZex5IRhZqtYZyfYRDstcRYfPi7TU=; b=6oU05sgJf+w55Qdxr/2qEnX4QBttFxCN5fzuBLI2CqApKVzcgTffWlLQuTKu1BmppKbZam OTk+rdjMn1eXMi7t8DxQfoNsJC+HgfOeEI2nxfNmLDn5XrEjfh+V9iFQnZD/HOgwXoUsNK aFfw4GJS56t7eH2UUntmL6wmbT0JhiI= ARC-Authentication-Results: i=2; imf10.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2023-11-20 header.b=ajg+Lr72; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=zUvQxknq; spf=pass (imf10.hostedemail.com: domain of lorenzo.stoakes@oracle.com designates 205.220.177.32 as permitted sender) smtp.mailfrom=lorenzo.stoakes@oracle.com; dmarc=pass (policy=reject) header.from=oracle.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742594107; a=rsa-sha256; cv=pass; b=Vo+tdHV9QO5t9TIdCiDzDUbgmKhQe6j4iKU2zhioIYeTQCYXAOxOxTi7Hd6V4FATV7YpYz lbSPsn3byBBFT1BqVXLvODoPwKwSFs5//LLBQrDFPvnLNFK5Ub7Ka7o3HfyDrgU2Ek2xE/ y8HFUC5tr2aEdVz8HMYhCLYnGY2BWsM= Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 52LKft0H021302; Fri, 21 Mar 2025 21:55: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=egGtESki8KL5HAPZex5IRhZqtYZyfYRDstcRYfPi7TU=; b= ajg+Lr72kEVLGWtd6rvmjS7zc7qu1Y+TPGIKtjjVJGR1R7DPDlJ0Jqb9iHWNUwlW E8ttJau8oBDeBduFI3t/zsjg7z415GGq4bkqMMffY8neJgxZ7pHURcRIfy/HZB9K /cF/ItgRg+W2mvdmSMNwbM1PD8euGaIhPrKO/9E5app4OHYkiR+HMp88zDzT5j7S VqY/aOnR+ND+wIfmW8Bj/QtBfySRYI5XiLN2EHDpu/O6tKrfyn9T2Ibb8hq6L1uA 3WwnPlkkqNGQ0FNtyu9HXuW1OFm/zDZ4lvCxthn5X2cy2zrGEhdasmmb96dDNwaA Nap0ZsYazpDJpTBiu/kkGA== Received: from phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta02.appoci.oracle.com [147.154.114.232]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45d1n8sgb4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:55:03 +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 52LL3Bxs022365; Fri, 21 Mar 2025 21:55:02 GMT Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2047.outbound.protection.outlook.com [104.47.58.47]) by phxpaimrmta02.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 45dxem9n1c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 21 Mar 2025 21:55:01 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=d+/HlfYdM4x/LDKC9R4LQjcpFxqKJ4iBycd1hAbe0uF4xabcR+V29uYwEkq8YSD5pwrCFDYi7lW8QmTTKZlAXICwYu5s/3c2Q8vMpmMmPnH+zFQNISBHuIT42W0FOLHQN8K7i/BjHLvw04kA/00lqHRJ/ZmGwZXtz2QQgUqEWwiIggvViNBFEIy1EpRjBiaqU5mCQvVvRpYaXwaQdP+/R6z3kXTSoEGO3f2RyhxlV9hyF7+1Ko4edCD9YzMgwXVVZbNMGlkO+iAN0Tc2eY/ctw8WPeNcDSbJqyS1jFOHLKKycGdzi2bY14CIyWeKeQoKrwhf6UieF+FPhDNBOlVXBQ== 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=egGtESki8KL5HAPZex5IRhZqtYZyfYRDstcRYfPi7TU=; b=aWGz/LPlATQqTpgWdZTzJSBmDGuugEZFXm7B+++1Cs1kzQukxKNGfxuqPbezr+d4kn9RMDZ9u9p99et+M2T6RlnRh3V7C2pWJdjBHGiPqS+fyZbT0kk5ZPEWLufqjli1zq2IHxag4tC8+ZgundctRkHT8BqR5b24y/JrjfuTuDfEJDCnU7TF9ZZtL3R5ccZOieY6X07XvVbskFKcFH4Qjive1IVwbuD7LcJfPbL+8BZ7E0VpQjVANna0HnMhuN5vtrHtmXEiJZ5BTuvD7YXgoj+eLA6qFM1zF5EXqow6INSQQaGLTPL5PTVTovxsz7SzqxtfGDYC5AQ9mk+ePlViOw== 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=egGtESki8KL5HAPZex5IRhZqtYZyfYRDstcRYfPi7TU=; b=zUvQxknqzQGDhWgUw36+Wr8PCdcCCoipL9/KyI1OJLJDBZtRbuIDBXL5H9D1l4Hm25T9kTG4F6kse4M+VwkrDCvwdsDyZDaGijm5L1dvq3F/MK8CUYMpS0vhUGnIcQx/L/wAmQIMu/HwhKIe4aBswTH1DnHQHFP/u5GUW0MHv4g= Received: from DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) by CY5PR10MB6144.namprd10.prod.outlook.com (2603:10b6:930:34::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.34; Fri, 21 Mar 2025 21:54:59 +0000 Received: from DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2]) by DM4PR10MB8218.namprd10.prod.outlook.com ([fe80::2650:55cf:2816:5f2%7]) with mapi id 15.20.8534.036; Fri, 21 Mar 2025 21:54:59 +0000 From: Lorenzo Stoakes To: Andrew Morton Cc: Vlastimil Babka , Jann Horn , "Liam R . Howlett" , Suren Baghdasaryan , Matthew Wilcox , David Hildenbrand , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH 7/7] tools/testing/selftests: expand mremap() tests for MREMAP_RELOCATE_ANON Date: Fri, 21 Mar 2025 21:54:36 +0000 Message-ID: <82fc24b357b76f6f8475425f9fc99d0d15d9078a.1742478846.git.lorenzo.stoakes@oracle.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: References: X-ClientProxiedBy: LO2P265CA0326.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a4::26) To DM4PR10MB8218.namprd10.prod.outlook.com (2603:10b6:8:1cc::16) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM4PR10MB8218:EE_|CY5PR10MB6144:EE_ X-MS-Office365-Filtering-Correlation-Id: 64e994ea-3c1c-40a0-c161-08dd68c306ae X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: BcAYMJSFC5yGVRccCkZx9yDIWkYE5HmyXo1k0GaNyCqiTpdaBNSxCwOZaxN3BCIx/lkbUmjSS42zdIL11EmvcA2NI6AyMGDHL68F3CUTfV7qzhkPwORI+CAxj663mBCYSGjr1rbN8mqkCsQzXArVaBmWIliTjRpC5U2mTSoqHbZFXIG1HJjunw9hYk8VemwVzf4Gg8tpMn+LKv8jV3LuUuFDzFCU773nKSX+GmOewuOH+G5KpKsUQbEnw6tS06SErtOYgRxDedikCZwzUoSNV0oZ67c9PkSmaSgEfvm2VoaSHdYxdKlx+C0+bf9V2JSDzLeUC9ZQm5chijdkP7ryJpKmaYzYxtKzSQj1EwBBVnp+PG26GpMVHSnslcO7B4CsWmkFi5gigoWZYdfKbd8sUoAcPbbQ3hr8BN5awEwnEW/+ClJkXn7DtA23ZxUPnigd9EIgr+cO7Y47lPUbMFunZyurCZANiTdpydTBuy/hkMFyw75/UoP8WulC8VaMbiaZlnNWUKvnGfhhvTGpq7yWrCJTdvjl+4KbdPyIncNkemcqOAEX+h2CziwOWyGsBt83+crxC1f03VlQcBEOtZgtNKgzzRrNAoBXd1ITC7dZ/Pmvi28aSo3ODlnAJYqStQS9S+H6QMMz+xEpbgEkfO/F8vwNCDDh7PcbAsy/2ztqseR/OG75PKL73Rm8xpmGtf2dfcp5a6NUninXv8Kai2Dqnn03mILE6CXCzCh74hc4ApQbqB8eWuQnwQUMI/pCM7KCSv6ynLhDCSzZs1meLDJXMn3GYAxzQLe+Qfr60vRmZfqc/UTahHdFszkjJxY5TTA8kZ92J2s1/5JDHQh8dcWOkE4yzJiQM3HTyGSEJJrMQChevcLnkAZfCEbQSKTbbAtL6nNkUxcybLdWTZf8XltKWi5c7yN5/2WOc/5i/EOGsHUPiP4L0M+BA5yDoikchtiaBH50Lxu4JnGRu5OOrOnvrY851w5mHuNYBTUN8hzMCYklShr6AGNltHBjDN4H7VquSOyQ72aOv+SQH8QmZpqBXYRc1G0vphKttx75mgDHlSNZFGO4N27kejtE7/62VYs8lG5ddGDfN2FmIlmW1Eo/eHKd9fSqN4yvYGjHpROCUm86ITYFuhxTKNc9X1f6yQ9KDVApTWCUcMocZnQofTbnTR9ATX84XDCP4R/BddFkbHrCZmLxhAYy/krwfNx+5e3avZrABDazDGMoEpC+1h3f8Rk5+SPaoWkKAJm7EBaHYjVXkTo8lXoMABno/p6fdM0PIGnfZMXp6frqbNaVGSpmzrZ4E0CtN9+bWWql/gQGhPXLHfs1eBfO5dTLnQcER+gPEqpfjFQfCZHaUAst0UYlgM7rRoAcJ8NItDvjopQldTpCr5iQMst4wwkOBWi3MSqI 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)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: DaBm2je/lRI0YckcIkCifSvglKe0HldMe/+N9ZVdFU/R+E8iPUqhEKM2/3jyr8tMCdX4NGVOc0J3UAP1eWGWq7sUzcxH6LLlRJYzFQh2CA191hhtzvOKIQOVQE/KyPkSCcPCc99tWzo/qocVpZ5AxkEWc3dADkFDkHXiV4b9P3JAGkwh+WNxdKhiITT4pSK0gbYI3h5oyWlOgcdl0DA5tVxaAI+hcNwvXHRsio9uEJ14jc6DTtUq0LPjk8rbTSq4EKwrBdY8wRpfPLWHM1Kbdcr+c4fdJcvy/wQSM7SpSWqp5R0KM+TmYA2aF8CSl1NDYtFwdIpBFe44YJm7Ui58yQKU5/sMIaHhB0iIKQQVvxBKI2/3lVGFvHHwQ6Aw7/SHaII05dt2aP5fgTKLq3WIlj52XYRnA7VpllQQaXbs0FPZ6sxO1HUE6Y3rfhp3PpheqJF5g4oeL+VKsJQgEEozejU9iSDqCFMdfplExi/YZtLTIuvJaa6NF0s2kiAihasUynxr7F100H+3+ka/im5Z/8H3zZw/OTaJbkUiOdg8tLM1/ik+PQW5wQLrNHjLvU0IWHisevTdc+KRTF0UIv2PJw4uB8ZdvNJOnDXE4sMK+lSBLFHUkQ00ujzzRQ6wzEbSJgSvvkbUplken3CG3nFJWe3FZy2DQQ6CYJ+cVlhbX4Osrh+40NvmoEI3DNwIeSNDpFgWjGFKq55sv5h631kzCFsvRyVj5p60s7BOcooVS5mCHowRWf6pN135IWYUKa+H9PQ/CDPjzagj0q/CPxapio88gxKMf/tyXr/VJth50+UfmMs3EKcHg3s+1DGDQzJyUUeyKghgrpDCTf/bxLw0iwdLFvl4VqDmljRqPZ06MSb4HVgbys3J3RyCYjcPopSe9CtTl6GUC1U26wAxxg58DPGID2PR4x2Ey1mP7mRtQ2HwlaG/b7L+MFEAJLhTWAo7GIElTv/d6Uo11tb3gjtSli5pkOMyfr9xjeFjA0WrCb9OFk6WwA9b5SpJ5/EoC5PKQ85UYcIMxDfMt4yGyFze7Vcxk+2I1XdVR/jMmptb/1TdC1WkCmCWhI7SAjXH+x27xOKaMm7vEUY8Ft0DYDtXAwfyqsZsTRGN+hgjELTt1bn6qRHqshGQ65F+C1paeowcMVor8W/4Vr1gfIv/AdQeLHFZLDmX4gg0AkLsYG+n+nMlqnBptYdqfPpgL1XcPvBR9kaPblahHub5qWvVWd8J62WRSGbid/CadTUMbilAVuRZKdAEqKVb2gQV1FaOU8mh6bmYJQVtmDDZmCFHlNpX6brL/r+Z1IbIhIAQJiqECWc7U1viWG8Fqugj3qJNhzwOQ+OZ99ZiBDCLyjGdN1x/XS6WAwrRHDZvDX2KyIXI/7X8FPjidUx4GTFwCAe6xE+tcg7lvLqIn+Q6Mti1P7ovOmciKL+Hy//BpUuwC6yF2MIf9ofbCMN4hCYa/8/7z+zEWmRcVRXMP6P+8eMHctK1vDHZIssyqc1FGH18B7OGlsQGkBvqRwd7ZYptUp/Ka+dZfPIqAYJfbovm7vp/Lrw6g28EHlBbDfRhCXFlEukEz+oP7VK1vLamEiMfHHkqMmI0qm/ltC6+OeO8W5acRwoLfQ== X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: doL9wY4ohkW3UTlU4nmIhnfdLLTauVjBiqJnskkqUiwUCoBlK2soe8TmrABJYcPLB2B1rCvFuZ9iS5TVsmMDxDgnedvqh+U6YuP1AoOyxUGORoFbRNVOrDM4hTdvzWIW5ASLKL59CX6CHxqGbWJO9oqijcyXNRTv8lfJAwGGJRer0HRhbcGjO96AiTVo7cUIx+IDVJa8wsNN2hIMoFUjtZ2DYv+y+KTwXxQns0rQLu7IIS6Wo0mhO0XCTqbTwuQcOJIgrkAELSYq3E63jMkyM1Fz/a1LBA3VVay8XRYzAOuXDMCzPmrI/hLkLS47QJtHYSO3UadFOCE8IRXQS5kcIPyyt+qfwjZtAmRKiw4nhdiuOHBn/1RUM0i3KfsGFgr11SETWC/+KOM4aS9HtQcem7iD7ZrvzFhcRB9C2U1c85fJn4a7o9uewJ7xZ0td11zGa6FeRar3EaV+mvnlRyi6laJLItb7XwPnDeHRK/eLWFXSqd7o9TW4Qh9kz/9kJm0MoNeKzKgnxN5S1dCNzXujvMSIE9sgBrKFFC/lJTcuTd6Jo/Ro6jiqJwz0huwQcXNcbYaSu0c+S70qIt2Skaw0POEjbLk9QPPHnWZu7BsqzyY= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 64e994ea-3c1c-40a0-c161-08dd68c306ae X-MS-Exchange-CrossTenant-AuthSource: DM4PR10MB8218.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Mar 2025 21:54:59.8551 (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: 41oqi6QXuXXrrcSGYMRyq9UWMIvxvlKxgWdVEUATq+U72opqNNly8NIuorx8zgQCeYBnM2IISUBRdTHMERkS45AkiznxBUM3N0zAt9K/Mvw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY5PR10MB6144 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1093,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-03-21_07,2025-03-21_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 phishscore=0 mlxscore=0 adultscore=0 mlxlogscore=999 spamscore=0 malwarescore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2503210160 X-Proofpoint-ORIG-GUID: Ron0i1Eeolkg__5vTMM1kB6_QDIiL2OS X-Proofpoint-GUID: Ron0i1Eeolkg__5vTMM1kB6_QDIiL2OS X-Rspamd-Queue-Id: 2310DC0003 X-Rspamd-Server: rspam05 X-Rspam-User: X-Stat-Signature: j3ytsudauk4rbjjpzr3zzw14twtysgef X-HE-Tag: 1742594106-303439 X-HE-Meta: U2FsdGVkX19hTkoeY4saeAW2YN3m1PqkiEMwZwVVlHtRVfnj278K51ev9ThGSYyma6UGPV4W2odpaCm9jUIhHVfxMFCS/2wHu/qyaGT1ewa4yQ55gCVBIsPAcxtfuKxJoXHHS6Ugl8e03yWCIqJFdJIWm49rwf/xC4fbUz2VD/1LiQy1xvBRtl8tJISN9OcW1TkjVwtOLbtl3FvA57epSNhINtrxu/Jz93KZxAXONb/gDdbso/0OdVcWMXaOiVbmiNwwrYqMplzs9rK37+gZQgxm0n5pY3sOB1rBHKLCuKqQigJzRA5tBWqnR4D56qrLA1Eby9E3UHwx7fXCngy/K1CK9/3pcLeO++advHNBkXmmFmW8//3Xgby0kl4HjjhxjKB5RT8wOMoAdBQLIKlNxecT+SLjMkqBMLQqDI5Bd7ET3NAM6CDLwgiudmUi8r1j1b95bdUYmaGl6O2iKzZBL8S7Uqnj8XTBXx1oKFZRtpdMbW4tMlwAPteAhGTZQvYpSRDmZCUAwo2/hQaEKAYfxpcWepTiv7kKF2WYaDSrmZXqwqd90/lL9fZQPS1gI2sNUR2pySr0hJ56SKrYJImO7BniqTFDfzdiSOjFhl4qDz5XkHg+WOH/bBE3w9g5XNe9CvKFH4bBr9LhtF82188bVd2fZmkDDg9lR0xsnv/4KIshrhSNnb5Uri4RVcfibWP3IZKvIOrL6xnUiFix2b3G72Uai9dGoCFCEwfHm8h9pRM/jvN0DhPaCtYJbQAm1hf5D0H7xoPBcgyEbnKMcCcvgoWgt4r+kZDZiklIm6y+Py+8lY3/ZjRaU33H6d5diKs91ytVmnA/SPN2qOhPonAec66QoppvkdAwGIzoJFEJFA8JPOTShSxHB5Qd6WXqxHrevjnZbVprpMVoaYPHTu31glP3p+mD0RNrPvdO79tDj+048jXRceV65MDz4dScOG/qf5Ys/YJ3JgAZG7389l3 n6nfi3pD CX+VuddEjLybewGgX0nWId13Q8bhKwgepSCGmsvv46fl+qcPICqR6TMwlXzFCmUoJvnhtHr/6qxXa5pANP9Jr//ZklReuSoOrnCPYPgyJvgEUZWCzXqaB2cCNQ+s2BgRs3NWFJIugjgSRLMh3ZG+rx0in6N6FtmfT5cT6nySkeL0hlI/du1VIO87lwGwidhmcRniSuO0i76AgWIWT7uFik2tSEnthhq4h7vKgHT3ueQiBXUee/aYNOyM4e47Yxk6U73NVX0sV6MieO9FQEyTFU6fRrQHfzJbLHSq0PqkliC7J4FEAN8K7N0Qu9lZz8a+xUrKN9Wtjxpov6UIXdKnJF70Cv3ptafJsps3JZoQ7EVv/YELGv6YJtgYT+AtR+XUknwhAXnZptoq4VlfMB0mBTZOeCttp9szXAikKMd1BCB8owp9v44N7HOmc7XD9YWQ/ICeBcm3TRRB88sq7wFWPU04GI8cmg00DkH2Sh1TuNfGaO2Y6h8EZkSW6aCSff0A64zCJP86Up/BAvOTz2E0iO4iKSmlNfE4zwbopTKzBbcYZNJgM/fUo+/i1VYsCA//S7TxJLVkE9J9Sc9ESrvGLIfI2l5Flz/KHlE5BIpdZm0GWQyOKZ5Y4Zz2IcN2gHW5u5X5B0539jI70GfZkHB83gKvWzw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: 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 | 270 +++++++++++++++-------- 1 file changed, 176 insertions(+), 94 deletions(-) diff --git a/tools/testing/selftests/mm/mremap_test.c b/tools/testing/selftests/mm/mremap_test.c index bb84476a177f..2d155f2ac1ba 100644 --- a/tools/testing/selftests/mm/mremap_test.c +++ b/tools/testing/selftests/mm/mremap_test.c @@ -8,9 +8,11 @@ #include #include #include +#include #include #include #include +#include #include "../kselftest.h" @@ -29,11 +31,20 @@ #define SIZE_MB(m) ((size_t)m * (1024 * 1024)) #define SIZE_KB(k) ((size_t)k * 1024) +static 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); +} + struct config { unsigned long long src_alignment; unsigned long long dest_alignment; unsigned long long region_size; int overlapping; + bool use_relocate_anon; unsigned int dest_preamble_size; }; @@ -60,7 +71,8 @@ enum { #define PTE page_size #define MAKE_TEST(source_align, destination_align, size, \ - overlaps, should_fail, test_name) \ + overlaps, use_relocate_anon, should_fail, \ + test_name) \ (struct test){ \ .name = test_name, \ .config = { \ @@ -68,6 +80,7 @@ enum { .dest_alignment = destination_align, \ .region_size = size, \ .overlapping = overlaps, \ + .use_relocate_anon = use_relocate_anon, \ }, \ .expect_failure = should_fail \ } @@ -184,6 +197,12 @@ static void *get_source_mapping(struct config c) unsigned long long addr = 0ULL; void *src_addr = NULL; unsigned long long mmap_min_addr; + int mmap_flags = MAP_FIXED_NOREPLACE | MAP_ANONYMOUS; + + if (c.use_relocate_anon) + mmap_flags |= MAP_PRIVATE; + else + mmap_flags |= MAP_SHARED; mmap_min_addr = get_mmap_min_addr(); /* @@ -198,8 +217,7 @@ static void *get_source_mapping(struct config c) goto retry; src_addr = 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 == MAP_FAILED) { if (errno == EPERM || errno == EEXIST) goto retry; @@ -251,7 +269,7 @@ static void mremap_expand_merge(FILE *maps_fp, unsigned long page_size) } munmap(start + page_size, page_size); - remap = mremap(start, page_size, 2 * page_size, 0); + remap = sys_mremap(start, page_size, 2 * page_size, 0, 0); if (remap == MAP_FAILED) { ksft_print_msg("mremap failed: %s\n", strerror(errno)); munmap(start, page_size); @@ -292,7 +310,8 @@ static void mremap_expand_merge_offset(FILE *maps_fp, unsigned long page_size) /* Unmap final page to ensure we have space to expand. */ munmap(start + 2 * page_size, page_size); - remap = mremap(start + page_size, page_size, 2 * page_size, 0); + + remap = sys_mremap(start + page_size, page_size, 2 * page_size, 0, 0); if (remap == MAP_FAILED) { ksft_print_msg("mremap failed: %s\n", strerror(errno)); munmap(start, 2 * page_size); @@ -324,20 +343,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 = "mremap mremap move within range"; void *src, *dest; unsigned int i, success = 1; - size_t size = SIZE_MB(20); void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + int mremap_flags = MREMAP_MAYMOVE | MREMAP_FIXED; + if (ptr == MAP_FAILED) { perror("mmap"); success = 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 |= extra_flags; + memset(ptr, 0, size); src = ptr + SIZE_MB(6); @@ -348,8 +382,8 @@ static void mremap_move_within_range(unsigned int pattern_seed, char *rand_addr) dest = src - SIZE_MB(2); - void *new_ptr = mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), - MREMAP_MAYMOVE | MREMAP_FIXED, dest + SIZE_MB(1)); + void *new_ptr = sys_mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), + mremap_flags, dest + SIZE_MB(1)); if (new_ptr == MAP_FAILED) { perror("mremap"); success = 0; @@ -375,9 +409,9 @@ static void mremap_move_within_range(unsigned int pattern_seed, char *rand_addr) perror("munmap"); 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); } /* Returns the time taken for the remap on success else returns -1. */ @@ -390,6 +424,10 @@ static long long remap_region(struct config c, unsigned int threshold_mb, long long start_ns, end_ns, align_mask, ret, offset; unsigned long long threshold; unsigned long num_chunks; + int mremap_flags = MREMAP_MAYMOVE | MREMAP_FIXED; + + if (c.use_relocate_anon) + mremap_flags |= MREMAP_MUST_RELOCATE_ANON; if (threshold_mb == VALIDATION_NO_THRESHOLD) threshold = c.region_size; @@ -431,10 +469,15 @@ static long long remap_region(struct config c, unsigned int threshold_mb, } if (c.dest_preamble_size) { + int mmap_flags = MAP_FIXED_NOREPLACE | MAP_ANONYMOUS; + + if (c.use_relocate_anon) + mmap_flags |= MAP_PRIVATE; + else + mmap_flags |= MAP_SHARED; + dest_preamble_addr = 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 == MAP_FAILED) { ksft_print_msg("Failed to map dest preamble region: %s\n", strerror(errno)); @@ -447,8 +490,8 @@ static long long remap_region(struct config c, unsigned int threshold_mb, } clock_gettime(CLOCK_MONOTONIC, &t_start); - dest_addr = mremap(src_addr, c.region_size, c.region_size, - MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr); + dest_addr = sys_mremap(src_addr, c.region_size, c.region_size, + mremap_flags, (char *) addr); clock_gettime(CLOCK_MONOTONIC, &t_end); if (dest_addr == MAP_FAILED) { @@ -549,6 +592,10 @@ static long long remap_region(struct config c, unsigned 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 +612,19 @@ static long long remap_region(struct config c, unsigned 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 = "mremap move 1mb from start at 1MB+256KB aligned src"; void *src = NULL, *dest = NULL; unsigned int i, success = 1; - + int mremap_flags = MREMAP_MAYMOVE | MREMAP_FIXED; /* Config to reuse get_source_mapping() to do an aligned mmap. */ struct config c = { .src_alignment = SIZE_MB(1) + SIZE_KB(256), - .region_size = SIZE_MB(6) + .region_size = SIZE_MB(6), + .use_relocate_anon = extra_flags & (MREMAP_RELOCATE_ANON | + MREMAP_MUST_RELOCATE_ANON), }; src = get_source_mapping(c); @@ -583,6 +633,12 @@ static void mremap_move_1mb_from_start(unsigned int pattern_seed, goto out; } + /* See comment in mremap_move_within_range(). */ + if (extra_flags & MREMAP_MUST_RELOCATE_ANON) + madvise(src, c.region_size, MADV_NOHUGEPAGE); + + mremap_flags |= extra_flags; + c.src_alignment = SIZE_MB(1) + SIZE_KB(256); dest = get_source_mapping(c); if (!dest) { @@ -599,8 +655,8 @@ static void mremap_move_1mb_from_start(unsigned int pattern_seed, */ munmap(dest, SIZE_MB(1)); - void *new_ptr = mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), - MREMAP_MAYMOVE | MREMAP_FIXED, dest + SIZE_MB(1)); + void *new_ptr = sys_mremap(src + SIZE_MB(1), SIZE_MB(1), SIZE_MB(1), + mremap_flags, dest + SIZE_MB(1)); if (new_ptr == MAP_FAILED) { perror("mremap"); success = 0; @@ -629,9 +685,10 @@ static void mremap_move_1mb_from_start(unsigned int pattern_seed, perror("munmap dest"); 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); } static void run_mremap_test_case(struct test test_case, int *failures, @@ -640,13 +697,17 @@ static void run_mremap_test_case(struct test test_case, int *failures, { long long remap_time = remap_region(test_case.config, threshold_mb, rand_addr); + char *relocate_anon_suffix = " [MREMAP_MUST_RELOCATE_ANON]"; + struct config *c = &test_case.config; 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 += 1; } } else { @@ -656,10 +717,13 @@ static void run_mremap_test_case(struct test test_case, int *failures, */ if (threshold_mb == VALIDATION_NO_THRESHOLD || test_case.config.region_size <= 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 : ""); } } @@ -703,8 +767,8 @@ static int parse_args(int argc, char **argv, unsigned int *threshold_mb, return 0; } -#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 = 0; @@ -721,12 +785,15 @@ int main(int argc, char **argv) char *rand_addr; size_t rand_size; int num_expand_tests = 2; - int num_misc_tests = 2; + int num_misc_tests = 6; struct test test_cases[MAX_TEST] = {}; struct test perf_test_cases[MAX_PERF_TEST]; int page_size; time_t t; FILE *maps_fp; + bool use_relocate_anon = false; + struct test *test_case = test_cases; + struct test *perf_test_case = perf_test_cases; pattern_seed = (unsigned int) time(&t); @@ -763,66 +830,71 @@ int main(int argc, char **argv) page_size = sysconf(_SC_PAGESIZE); - /* Expected mremap failures */ - test_cases[0] = MAKE_TEST(page_size, page_size, page_size, - OVERLAPPING, EXPECT_FAILURE, - "mremap - Source and Destination Regions Overlapping"); - - test_cases[1] = MAKE_TEST(page_size, page_size/4, page_size, - NON_OVERLAPPING, EXPECT_FAILURE, - "mremap - Destination Address Misaligned (1KB-aligned)"); - test_cases[2] = 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] = 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] = MAKE_TEST(_1MB, PTE, _2MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2MB mremap - Source 1MB-aligned, Destination PTE-aligned"); - test_cases[5] = MAKE_TEST(_1MB, _1MB, _2MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); - - /* Src addr PMD aligned */ - test_cases[6] = MAKE_TEST(PMD, PTE, _4MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "4MB mremap - Source PMD-aligned, Destination PTE-aligned"); - test_cases[7] = MAKE_TEST(PMD, _1MB, _4MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "4MB mremap - Source PMD-aligned, Destination 1MB-aligned"); - test_cases[8] = MAKE_TEST(PMD, PMD, _4MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "4MB mremap - Source PMD-aligned, Destination PMD-aligned"); - - /* Src addr PUD aligned */ - test_cases[9] = MAKE_TEST(PUD, PTE, _2GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2GB mremap - Source PUD-aligned, Destination PTE-aligned"); - test_cases[10] = MAKE_TEST(PUD, _1MB, _2GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2GB mremap - Source PUD-aligned, Destination 1MB-aligned"); - test_cases[11] = MAKE_TEST(PUD, PMD, _2GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2GB mremap - Source PUD-aligned, Destination PMD-aligned"); - test_cases[12] = MAKE_TEST(PUD, PUD, _2GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "2GB mremap - Source PUD-aligned, Destination PUD-aligned"); - - /* Src and Dest addr 1MB aligned. 5MB mremap. */ - test_cases[13] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); - - /* Src and Dest addr 1MB aligned. 5MB mremap. */ - test_cases[14] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS, - "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Preamble"); - test_cases[14].config.dest_preamble_size = 10 * _4MB; - - perf_test_cases[0] = MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "1GB mremap - Source PTE-aligned, Destination PTE-aligned"); - /* - * mremap 1GB region - Page table level aligned time - * comparison. - */ - perf_test_cases[1] = MAKE_TEST(PMD, PMD, _1GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "1GB mremap - Source PMD-aligned, Destination PMD-aligned"); - perf_test_cases[2] = MAKE_TEST(PUD, PUD, _1GB, NON_OVERLAPPING, EXPECT_SUCCESS, - "1GB mremap - Source PUD-aligned, Destination PUD-aligned"); + do { + /* Expected mremap failures */ + *test_case++ = MAKE_TEST(page_size, page_size, page_size, + OVERLAPPING, use_relocate_anon, EXPECT_FAILURE, + "mremap - Source and Destination Regions Overlapping"); + + *test_case++ = MAKE_TEST(page_size, page_size/4, page_size, + NON_OVERLAPPING, use_relocate_anon, EXPECT_FAILURE, + "mremap - Destination Address Misaligned (1KB-aligned)"); + *test_case++ = 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++ = 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++ = MAKE_TEST(_1MB, PTE, _2MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "2MB mremap - Source 1MB-aligned, Destination PTE-aligned"); + *test_case++ = MAKE_TEST(_1MB, _1MB, _2MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "2MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); + + /* Src addr PMD aligned */ + *test_case++ = MAKE_TEST(PMD, PTE, _4MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "4MB mremap - Source PMD-aligned, Destination PTE-aligned"); + *test_case++ = MAKE_TEST(PMD, _1MB, _4MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "4MB mremap - Source PMD-aligned, Destination 1MB-aligned"); + *test_case++ = 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++ = MAKE_TEST(PUD, PTE, _2GB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination PTE-aligned"); + *test_case++ = MAKE_TEST(PUD, _1MB, _2GB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination 1MB-aligned"); + *test_case++ = MAKE_TEST(PUD, PMD, _2GB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "2GB mremap - Source PUD-aligned, Destination PMD-aligned"); + *test_case++ = 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++ = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned"); + + /* Src and Dest addr 1MB aligned. 5MB mremap. */ + *test_case = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Preamble"); + test_case++->config.dest_preamble_size = 10 * _4MB; + + *perf_test_case++ = MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAPPING, + 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++ = MAKE_TEST(PMD, PMD, _1GB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "1GB mremap - Source PMD-aligned, Destination PMD-aligned"); + *perf_test_case++ = MAKE_TEST(PUD, PUD, _1GB, NON_OVERLAPPING, use_relocate_anon, EXPECT_SUCCESS, + "1GB mremap - Source PUD-aligned, Destination PUD-aligned"); + + use_relocate_anon = !use_relocate_anon; + } while (use_relocate_anon); run_perf_tests = (threshold_mb == VALIDATION_NO_THRESHOLD) || (threshold_mb * _1MB >= _1GB); @@ -846,8 +918,18 @@ int main(int argc, char **argv) fclose(maps_fp); - 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); if (run_perf_tests) { ksft_print_msg("\n%s\n",