From patchwork Sun Mar 16 04:29:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018329 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 AFAEFC282DE for ; Sun, 16 Mar 2025 04:29:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E0E41280004; Sun, 16 Mar 2025 00:29:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DBCF0280001; Sun, 16 Mar 2025 00:29:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BE9D5280004; Sun, 16 Mar 2025 00:29:57 -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 9E030280001 for ; Sun, 16 Mar 2025 00:29:57 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 7D0431605F6 for ; Sun, 16 Mar 2025 04:29:58 +0000 (UTC) X-FDA: 83226136476.11.BA31C59 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2087.outbound.protection.outlook.com [40.107.236.87]) by imf26.hostedemail.com (Postfix) with ESMTP id CA084140007 for ; Sun, 16 Mar 2025 04:29:55 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=ciE2N5GK; dmarc=pass (policy=reject) header.from=nvidia.com; spf=pass (imf26.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.87 as permitted sender) smtp.mailfrom=apopple@nvidia.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=1742099395; 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=s+S7Lx+3yaZd7C+9gB7O+ZdHUwZpN9rSDyBW0GV6rHc=; b=4as78x5M1hVgMNMzsC98V2NAYtLC9wYeiL9KRoyaTcKH/YUYuNqXDZBXGqLHu9Pfpf4irb +cgqzjAFU2WMb9SSSCVrzIXPPoUmYiL3pFNwBp2n4U2+KSNW/3FUTj2WpRwwy8ObPNRb9N Epxsuh6ORQbiD1SY2h/oclkm9VKtu+E= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099395; a=rsa-sha256; cv=pass; b=CRZG5iBGicT0F6vYvi3GP6JrJHhJ2TlOvdVfo3vNTnvSSV9Ch9nKupUPNKJhm7Ox7f2Zsw 6Ldq3TvCaSqm9TtixakGlR417bo5Oj0d0t9jCHrvIIOmj+zTL2q5VSVeD92TQmnOaJRf/a mq57kmYxeUUuHrrojHOETiobgOk8tjo= ARC-Authentication-Results: i=2; imf26.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=ciE2N5GK; dmarc=pass (policy=reject) header.from=nvidia.com; spf=pass (imf26.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.87 as permitted sender) smtp.mailfrom=apopple@nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WIQRYr719Qoht3TgY74dn/lMFY813Hy7RtaPtwbPEyMqo5Yuqho1/XY0PtRXyYqZCmR7ktddZKhRWWv/ulMs8cXOhpU3+xZitevAcx2+RSijk2AP/qnMdb6hSRy8roj9+40OAvhTxol0gsw4Cuj49dEu10x/i9N+rbXPvK/WGO+N4o93z21lNSS5dItv64j15QfB821g4ddEWD5K2I2wo5kUPtuEi9oCTG8MzpT5OdWduOMpAP0X6BbuMQiUKIX6FwjH6UupyX2ntN4/8o7dqgaa1P8UtfgRfpgsAvTHxvytDG92YYOMst6HdlXQDVCyd9RvSpOs/5ki3BGuNEs/dg== 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=s+S7Lx+3yaZd7C+9gB7O+ZdHUwZpN9rSDyBW0GV6rHc=; b=OtDt0qvjdr7/ouf+EkN7ccDPenK+yl3lcLIB8+//i8/1TmQCo3PjsLKC6hMen2YrfvRIrHAtwN3iuKmZRMWTxQu2To7mKsEYBF96ftzzbxI5GCn5h9S3uLjpnx288+r+/8gsN+Omx5AZ6kM5EVQc99RWNIhYbKgT64RJaemEfjNFcjdy5ccOZmsHvS2LIRsxlQiwntlsZiDalHllUyXm2tmDsQjVf7hlVGyCYd6rlzJiRsABDihdKUxjH8p/Z3X5FOI6N+/7eOd4ECKk40UdTv3X5XZYklcal7lykLNU8cMuLWTFftOTKaEp+tBfA8iAKz0Fc6GXnMTsZ7daYQg9UQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=s+S7Lx+3yaZd7C+9gB7O+ZdHUwZpN9rSDyBW0GV6rHc=; b=ciE2N5GKOWIoljw372eYNzCYacOKeMs2OD2GikngwQ/wo2EQfzE07EAlnxHX9kpVbJp1TuQuTPIBYCxSwlJVqiCpAzO9tuoBJKupO9hP132VcBh6tQ92sESZRpE41ttcF0Xywu5x+b2HhLNzdbh2ac6wvyI6NVJka6cWjAw9lJICb/msLcPWg+rUxWTLSUd0pnOvSf/+jVg9J75iVLfOF2wsyiXIU+z1xKWHe2eQ7yTAuPtn9EZYuij+zzcGHLx13zxvXzzl/uuFMCNExp80ORk84U7BrCnW2lS/d7qw0Ifhs9s9G/saDf+BWF7zZMdwN5/XAfr9LsPscuRy1t9VfQ== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:29:53 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:29:53 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 1/6] mm/migrate_device.c: Don't read dirty bit of non-present PTEs Date: Sun, 16 Mar 2025 15:29:24 +1100 Message-ID: <40c47a3f2c613a2d13d1b073e2ec77859e5fdb15.1742099301.git-series.apopple@nvidia.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5PR01CA0031.ausprd01.prod.outlook.com (2603:10c6:10:1f8::11) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: 86b9fde1-c5d2-4283-7ef6-08dd644332c6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: kNW3d+cEq6FYHKGsZ60aYFkQ0250isS4nUSZVUff2gm1NToPMxS+firzOJ+mPf7y3w3aaGqwgj1XyBzgu734RyrJyE1SihPTGkqc7ibIZIVHXrysc0S30dAw5S2w8fJ1R5b9F3poozmZG89lGRw9MoWABP1a2JnU4qKYKDJmFBBzOBFZjGfPKseFYdOHZcbF5Y9lzYxoO1SSwGtXj9B13IR3QRimGzxxyjyG8/XTpLwOYEcvM2Th/jVSddH5L0r52nsxQvN+cwdyVNvB4fAxE/iRe6OdeWF24ytKKtN5Idf5efFLKCOYtZdlUAopsRkCwX/aIsZJLpxS3aqqt0nMTVdrmJ5HnA5OyOLyObl/eZzcWA1dnqPsEhGV1JhDC1/rq29/OZyfc8ImQHZvmm+vdM9a/1rJcnyJt0J+exwL5ghThQmgGLb8QuvSZYNG+JYyZN9xw1QO+PQmCxUQmLj0Ti2JCvsiX5co2YwtFlUVPVA6SXuLh3i1eX/dpoCVtA2rFCe/tAnAOCUfsP6d3IC7vjzL7fWw98PgrvPlwPmgwLWmPrxYl3yG5OC3w2wzHE3OSwrgyxgH9FEbxnmEgZQlXB4eexN8X4x11VqhLL+ElCgT4RnVpubN/OZAxr8yZV8sb6nWOySU6r/RvxU1it5lx0y5+zWAx0LtEJue2S8ht6aDp6iJ8egAccdT+fsnykbrAteBa3959ST8yPznI33aH4NqTCNmHgZFCSbrBOdYpNBYERjWUySabmB210NFlIpQk6mVuMdaiqXusTz4qzxLEEAVzT6M6y0HknNmNK1/5rTMlALyUVtelwJfJWoTvX3Pu1qQx5hU7gIHgLnMvkuRhdjETer92X/bXt9kdsatSUCv3lvAoWQHA2j9VJMIKvrl2D2L6qbvpwZAjhMwMh7Oq8NH5+Bf2081pRXZoeVWmntT3DioX/bSogHi5GRw3okJF/40m2yjKdgH1p57ZBEeQ5mQ/+1zHaXL3wO+a4x0q5SyV/rsi646AHCejqKzZffhmGDBVmqdgdhZaiUKDf3a7Ytl/TkS7t+Tb3+hkUDnLH16mwj9xlSy0kJxhwF0g/+KRBHQJ9X5GYmSoZ9sC0HW8W9gByaYlVeKGwxBsxiHVw6InddCeglBPdiNkjscaxnt7ZitRnfLkP9MkEzQkVQmJrgKboN0eMEg6mge8CMXwSZH4+YMz1LnnP0zTKS6pmNqBfKX/pfbHCTqQHyq5aN4xVBLMgRoa66F4fxRmZAZBbjvh4WU6HMQI901ePtA/Da4dGyQBVWuczG1APP732J+bi2LgoNYpfD39+d6/1SvbyhQomTTKsAHA1QyUNPtTDJ4IH0EgqBbcbEClDhCBj+wMIDwYc2QMFdEVnJhfrie9epUz6GvUDFFfNNk+CDTZkXK X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: A9HpIbN0jvNM61Mo7VjyGSk1QTklne+eqbQ2Z9SL9O/b+qCj3TQOimbZD6HbW3UtlCZWiVZApV13JLrJssjyu/vssTV0GHaDVMGRtNnPl4XgpHOruGSVdEgkYI81rVyPEGXffRfoBEfSy6jiaYzRbVb5OqYUgf0TZz3lD48nuax3BTvvNnVhgYVqZKX7W8YCEs0bpAuQTx1TNBSjzi28uXsQHwG/s9CH5DBuIxAcMm7a5UjYapKcPR34NlNfww/XIGFhI6noMHkhELdDy98F56dMAGPARA10FQt9SYCMHTJRf8SrzG/s3mHubbaLzjR8yTrD8iW+y5C+rGoDOlXRTPr5csP0U71uZpPy3IFsp/Ibe+KB+RFn/fkdwCkXXPQ46GXB1a1RTgWMkRyjXBTo/ZZDSmhe8ByYL/TRX/nHHr0g9lRO3FQXlIU8FwAoOBo9VOli8Wz9bTCqwWqgvILVhqVsLY8Wd3P169kNx1V4yCmghl99QMdPxixl9WJkWDhMh35OTqOa1DDBH+DH+1LzQkRPhB80x5JxC4W8LbpgrBDcYcCrAgFsTNSaWIqFaHAYRrROeohBKWVUvjXwhVvSSymPte3f8S/pK/54XRkm8hYhMLoyQloRScORG1YeyIiqLTj9/cKAxy78oncdkJ7MmyPmw/EpJwRtfNc8svY7x+E8jOHABd3HzJJ5PBsHYDXSHTGKigg1yhxK0+TSIiMN0yIC5r5LsCdl98hlk5rSVHUEtIWsSzSK8G2vQrzosEHwCpu+ZX7YFDfvCQjgBpUSxdvp3tN48TxuoOBjQeGy/n7Qyun09DntyUpPej4EMPThP92xBbjYWha3v/Di7MHGL0S23Id6m8DwJ0J8q8TG4llL3r8axp3mTSdjhACX44dkTu6EO6vJbbbWvl0fleYHsKaGgpD5Bm+dy6UUFnCW2/4hYdAYc5AO76AQYUDEzXP+GDnm3zF8wBcjI8lXqLtgaWESa1HaSV9Tl58f5fGnpMcj7M/BCPRWzAg1hZl+JP+FYqGZTLDM1gUfHsxtDQ8Q6PYrkxjz5h5E0BktoAuVZdYNdUhK9Q1/ECXnIFtzoVgOPeHZRYb8PnJ8Ob7LoOY7gQ7BHJNeTvmSNHER5zhfGSRRLnIUBiki75+V0Cy0xPWnGxd+aKozsvLufTK0mxIVNGuolwQMe4Mm1Ha4xulO5gaxatpOUhDiD54uaCz333H2wrn6fX3xMRDR5ggtUgfT0Ayg9KHyb5WPoXQkgXKzlD0vohZGQvGuSE5hkBrnla9wUlUjCmgj92Dnfq7nksOVZruqeaYwZjeuBq8tS0w+elyyvzfm6aVslW1Nqwv9VUaFLEXNajwLpkfLzSZBLZjN8oeN6NBkOjDz5xmGeQj8WK6N0PkjxZTkghdsme5yBRTDrM8NwyqW3bCYVxt77qXK0gI5pyiBh5gWnnPfOdeODk9Vs3h0SvkHzbjvhTC62G1vC9gBQi5W3oOyQvfsk64E2b/q4sSt2OyIj+apyLzF4hsoU394GFsIvMdAu+yinWuyKN7HYGH9bPxdZGE9e+WUqi0mAfLExgQ7yyfCHyvrdm6zNVg2ebBd0QRJwCpewr35 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 86b9fde1-c5d2-4283-7ef6-08dd644332c6 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:29:53.5056 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oCKrmeTffsYKA7lYNmXUzbIPOyf78D2TQ+q2oMKM7YZRgBy/sz4bFRkHLA62b0ijiaCkwiZNrdeRnWAILq2KvQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: CA084140007 X-Stat-Signature: i7qhfxpmtqoae5z9courdp441qxkixzw X-HE-Tag: 1742099395-652390 X-HE-Meta: U2FsdGVkX18pUmO6jdahTBhUJOGhG+9F/9wacjrDPiVG7nSIUTpc3s90VFMIgvNlX0xAJ/K0wQO0rzirM8h/tbIptk+gBCLwNHksJjFUeFGnx/tZEBy5j/8Asw/J+eVhapbDelX+qB4QJl7kemHS2UFqIiVJlXHvl4eb7RjqQ5chJYurexuTYGZGsRsgIXinNIBpUqH1Vy1eHXva+YOe9m6uTlOggal15/6C9Mzn49dM5haGg5vne3hytnD13V4JHJICPURMT8H/tZjzDPwA7upOagf4rCvtdsMHYs2dSk8ix8Zk/dzq49RL48/DAvWZYJNaLvVJt+RnqAMgjQJcd6DbfRG06lYSsGVh2a84ZR8IgCx62cg6G34xHMI5Wju636zUIYJ6/YA81F5i4OhbVp/AZ6XzvLUYCgmDAIwZKwUamgupCD67G1yJZ47cZByxqrWEQVgzgheh4Gj/i74hJhzQ9dFc3OiBfSpIihliG9blp3/YQ0KzJIEmwDXsxbbFcAEX2kFnxbH/TzNP/f4OP1wAPnxOP8Nm4s0/gnQRtfGMacoyZLLr5d3tJxnPbyph4DHyjh0GmEDbBBKS+tGaI+RpJBB17GsZJbKeyRlgiECPncqyLvOXHrD5sHPcxw7ej2Hi2dkZyrmt47kJQFBMHLXwHTZqxURH0fngP9/h7XXEyv0aanjQdE9+SD/UsxomZHJzoTvW7mMKiKQhYfOVhBzpFq3GjbDf+n+1UVFTcW3WvJrnUlNizjL3ow2MKQsn3Hja2qrrtaL5rZMvDYFp+QuTqA+Yn/pqF5lOk+KabzeoweykbbcheOA3coGDbi0JGxLbmQ5UoqQkUHIhYXjaddjWqej1b3GeMF4EzPHxXFZ8ANIeqsaV6HHcoP7iV9FeNg738T5d7l62CKwwHVRrq9QTsVCwO0e699nEhq8HV4tXbVLuciV641iC5r6eA3O4bXfSklQ51e1Xc8JGgpQ frVV7wgc qvoAdildfrm1yqk5+4driTtgQYJ2ii4vNL9Rr/2yrsloHmDL77F2HrcSvy/PkwoHNvxQbRioNPO0pIKrt7EujzuLE8KQjx8CdUjxaa643x+abWZ1IHUzF9qgw6agE/5l9be1UGIjcb7CcSQRDoymVoX+ZtrDf//im6EGYDW03x9tHL4P/+i8jdazKSKrfkRZwsOQmZ6gOSt0R4Qk+xT68v/pAa5ylINhzGYkjD31nnV0uc7bntHWeRX2fd+ZRM8gVcW6AyPe1wX18b02cPxbfPIM6wrAs6lQwkQj2fAmv1D/+fuWiuQqFDo5E1Ql8iy/5jR/WTS3D+Ad7lKr2CYvhlLtOH7QhFb+4G0hbihhx8rJEkbXbHzo/fxwhofbmniWqb/TO2c+5J1I3V3rx1JSbKZ4VXgCtCrKxUC93GRtXo4CHYnQ6st/r2AO8bw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000029, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: migrate_vma_collect_pmd() will opportunisticly install migration PTEs if it is able to lock the migrating folio. This involves clearing the PTE, which also requires updating page flags such as PageDirty based on the PTE value when it was cleared. This was fixed by fd35ca3d12cc ("mm/migrate_device.c: copy pte dirty bit to page"). However that fix will also copy the pte dirty bit from a non-present PTE, which is meaningless. However it so happens that on a default x86 configuration pte_dirty(make_writable_device_private_entry(0)) is true. This masks issues where drivers may not be correctly setting the destination page as dirty when migrating from a device-private page, because effectively the device-private page is always considered dirty if it was mapped as writable. In practice not marking the pages correctly is unlikely to cause issues, because currently only anonymous memory is supported for device private pages. Therefore the dirty bit is only read when there is a swap file that has an uptodate copy of a writable page. Signed-off-by: Alistair Popple Fixes: fd35ca3d12cc ("mm/migrate_device.c: copy pte dirty bit to page") --- mm/migrate_device.c | 15 ++++++++++----- mm/rmap.c | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/mm/migrate_device.c b/mm/migrate_device.c index 9cf2659..afc033b 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -215,10 +215,6 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, migrate->cpages++; - /* Set the dirty flag on the folio now the pte is gone. */ - if (pte_dirty(pte)) - folio_mark_dirty(folio); - /* Setup special migration page table entry */ if (mpfn & MIGRATE_PFN_WRITE) entry = make_writable_migration_entry( @@ -232,8 +228,17 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, if (pte_present(pte)) { if (pte_young(pte)) entry = make_migration_entry_young(entry); - if (pte_dirty(pte)) + if (pte_dirty(pte)) { + /* + * Mark the folio dirty now the pte is + * gone because + * make_migration_entry_dirty() won't + * store the dirty bit if there isn't + * room. + */ + folio_mark_dirty(folio); entry = make_migration_entry_dirty(entry); + } } swp_pte = swp_entry_to_pte(entry); if (pte_present(pte)) { diff --git a/mm/rmap.c b/mm/rmap.c index c6c4d4e..df88674 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -2176,7 +2176,7 @@ static bool try_to_migrate_one(struct folio *folio, struct vm_area_struct *vma, } /* Set the dirty flag on the folio now the pte is gone. */ - if (pte_dirty(pteval)) + if (pte_present(pteval) && pte_dirty(pteval)) folio_mark_dirty(folio); /* Update high watermark before we lower rss */ From patchwork Sun Mar 16 04:29:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018330 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 3E3BDC282DE for ; Sun, 16 Mar 2025 04:30:05 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 66D38280005; Sun, 16 Mar 2025 00:30:03 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 61BD2280001; Sun, 16 Mar 2025 00:30:03 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 449B4280005; Sun, 16 Mar 2025 00:30:03 -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 24959280001 for ; Sun, 16 Mar 2025 00:30:03 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 04F12B6C5B for ; Sun, 16 Mar 2025 04:30:04 +0000 (UTC) X-FDA: 83226136728.12.1F7A4FA Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2047.outbound.protection.outlook.com [40.107.101.47]) by imf23.hostedemail.com (Postfix) with ESMTP id 33D10140009 for ; Sun, 16 Mar 2025 04:30:00 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=QL60k9+r; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf23.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.47 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742099401; 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=sdENcUd4EUUfm/VFpPMJTnHakQTHxg72+suy6RP57ZM=; b=1kewo1nc6z2/YMEYPZRpsz1NeC4sVeTknnXJB2VesDUH+nkoa/bn+4KSAqVWSgBUWvGYhK i45CSoF3p4NYHGATQhVdmtUJ/PyVGtaIYOynU82OUI6Ba0veVAWCpG9kKIA4uZShXxlwzc 1OgvYGOUWe9yytUVIapmjpqXcxlOX7Q= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099401; a=rsa-sha256; cv=pass; b=D6XosrQdfpqXADcmtj+U5Edz3/jke1CcrA3SmPo8Udepgen+AyGKs4suLQjQGJ2DLNaQBL 9s+F9lcshR9vASFEpql8Yc5KDEWmdQDXdxCyS1VRLPpsNiHLZd79HySuIKqaeZN2Cs34jL xZhfO8oVjuLrnYk2ZLs3wpx4hfaZSjk= ARC-Authentication-Results: i=2; imf23.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=QL60k9+r; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf23.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.47 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kGh24G6RYQs98F4XBluPLZkuU/UsPv/DhEPlpQ/eSj3WgVqSEP8hbCkS/mL5/7AAa9y4ciirftBruTcUFbjwjmDJW70OrNNtawH0SZiBoGtadAwaCOmugskjVLeHiZEFisFNmM2Hgp8tPWuj51XnvcqGCw/lT23SI0tahU7pzPwQWUBeG/Fc2fPPA6d1X71AZEVYofE5pg5vPvPgSp5PCg+o+SHtkcDcQi1ACtPXGq2sptPvRB8YcMTSRZcZp8GhedezYTpH8hHhgKP/jcEV90G6baFya3HKFUBayVh631hIOFvr81tOB15C89NFhWNSUaM7bq51CLv0qeLKn9ZzGA== 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=sdENcUd4EUUfm/VFpPMJTnHakQTHxg72+suy6RP57ZM=; b=nRuNuaC1C1O1rvlbT2+TSSNTP6OnWefk3Itv5KbEQzMDYDzrRsMYlo44gDhaWW1HkSLbU8mESFP2+klmMbQ475RrB4vv7oXXB+3/GVX7TbwyKfm7zwDK9wA33ONNuVjPNT82NkRQwfZ8u5sxx50qVo2l7GRBUjpjWaZuOSs0321+KRAVQk2/JidLvGJvw8s7OtxvKtSCKXraRX2D/eOlWe6mZJg6jTbKWuouEMU+6tCJwXUO8rTDWTqFgnEGnc3T9mncNoG5ShknxJBZKIyrZvJ/mHg/Ox2AZsos5kppd/B77cDAq6wdhmj5PCmh2K2FZoEQPkVjoJBjiTQlZBmYhA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=sdENcUd4EUUfm/VFpPMJTnHakQTHxg72+suy6RP57ZM=; b=QL60k9+rXdwzTX58x0TqrMmKHMXcTPGt3ZeWkCDjhLQmilxQxVenXGGfcpnFlDExsGJiGV/rCtk0GlZw82LXMj2+Gu57GDw/nBs0SfRBeuDZrTlcth3Yiq8SneM38bL8oDUqaJBj7lWIAozSZOcuELHIC+o+xfMA1v8MXHLKUAQpJVv2PtjztRy+YkWwPTj4lMW+1gESTNAhy0y7e9RJ+CZW0B27dqpmDKNb4QCbgXIT6qvuTey1sy/UNgW/C59OoX7jvg7QOXdLd1GxBsw+TXN9JH4oY6LHoKIkhEPoX5GxwzfCmTCKFxFvaK0zw8KtstQie2iEoSWFAdMZqqBHTQ== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:29:58 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:29:58 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 2/6] mm/migrate: Support file-backed pages with migrate_vma Date: Sun, 16 Mar 2025 15:29:25 +1100 Message-ID: <1371381f755a8f04a8228e52c36ddfde72949b57.1742099301.git-series.apopple@nvidia.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5P282CA0066.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:203::11) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: cc247eb4-1830-4a2e-451c-08dd64433574 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: 6TZKyWZM2wzwaReLO1Da+cIoN+JaPmlehwmYggKo3hDRXALd7VCcmTqEO/oGNs22aodYK2tNBM7Ipy9znjbn1chtmRJy5uxmYqYxPTUSg9GzqHXkTpyACE6kUhIxKzLHxBVQcogS5NIjUnclDN5PnnfNN6MEiv67BJ/CT6jQuhPDAB9XaaER9aVjFbdmYVm4CgtBr6eUaKL3vYvlyL4wXA/361QJpAbnB31fq3xatMos1ArdpIVB27SZFifA6E48/w5kBIE4QjAq1/OyvLswFOQ7r4vpsuVfug49/TGhF+kxrmapao/zLjaCA0JhCpFC8i57MfSqFEaiOHjRZotuHoe/xx5TmBWx67T406TjarxvG2OSDezPo96OCkvytYXsQVRzFe5y1IBAc+HQ2M+TRHIJYqBdS88ZA4it4tph4cFKYrLMPVcZvGqSGsiaBvfxLhqCHG5IekH8jIopCsj61PqBU1Q3x/hnSaKf1dNq/xw10vAqgxNhdQmJHfvwir1jJrIVZB7WnDdKlqmMongwlhCYyusqON1AJ5ARxYoKeAD4X5BOS0W2pcj0fI9qV3Ie3QiDAbYIrhvR/llwlEbAV85IjHePkYBqMN2oPWkLWkfZ6MdShZ89QiFH3uhUZ2F3bflIAbANajhNx00MjeuAReNYAbn2sFCYTSIZS5h6VrRYiCIernmKGX4tawzv8Bz4Tp+rp44U91MMuSS69xz8V8v+UnuVMXUEv14c00io6jyNv5yn2ru/MxRbQCxTSq7weVnV71lH1pfaH9CU07b1Xu1wiD4P5zCXc5CaOThVBgKn7rZqWq6wiqU5As5U27GN66JwfpE/9njt6c4W1bNQ1+g4vTLz0ywvyoUvdE9FW/cFJQL7Ybi5s2gInvbg1B0DyeDCQTri3HrCO0ehOP3We+nowlq+PMnnQgPCfJUkeQ+kGUe0dCnrrQG1fYILHb4mTMUbXwEmBvQAxpNnQP4Fgrda0AFwl8daA0+Cu4omfethSYvWLVhckj405Q3GWdNjW27h5ZEfeiyiwmmiNGjUdwAAFhqTopP3V5e0YPZ2eg3PxmLt5CedSOivCkKWQDQGyg4Dpv40s5wzJtfTsK+aZYzvsvKtkKGrWxeLTkDAT/F8UjM79XEPdiyDm7CMFUCrIw4lpuzoF9qt/DaAtXKkrICJqYjQ9jfc9HdCut46bAiEdqW9FZ/7JljQND029XwCrEw8vjeo9niOS6jJ4JM/y45xxO4oHt6KxTHADyCsysNS74ybJBS2ZM2Xj88NtjfJHgyGHWWrAzFS+ZCClw2sGhKLETFQuh0N+pU4PmPLr0cW3+IwT6Fy1F051nNTU/BWlc67gCHjdS+lIRGjmZHwaD0YDHBO6VwTNBTO+fBR2By+3onCNzKiTyyCyzLwc6wK X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: lP9udXUJYc8WHB6jgoDTg1HNSzWfNpNeGsQ67SZSqVLqHcZlAlyQ1C2Gf/UM7GMLZEjZOglcOEZHwDE9PPvIlPfguK4U0/QEdu90e8/5xZFwaYrzkxg1qEy1jq3T6IFsNrCPTG15zvgGwlZKJw28aQ9UhZRy9n+eMiry1ba+esvjxenXAmYZTOl/l0fxxM2rbsPCAGEmT0+ttgCgThDWoe6L+TVj6Fc/sSLY7rzNUV/LVDEv485pni59M9rpVTXK/K5waK1qy2eLN+gHEcFfpWvRVwKdBC5569o9oGUFNzYaYl0BPQFVt4MwyLOTftALZNOgmzeYJIuntDd9Maa753Wpoaupn+fPIU1H1VtaWUVsj2n51SWsI9cYkson2kj3+wItJlhWEtTbMzZgcHNql+1ShPwPGpYbxyIWbaROz9vSJcOmDoJuo7hd2zBi7N78fr9eLX5jNxOPiFS/AaQIv6df6slMNMdU+/jANIaRBRPDqWiJkRUekoPQLpgylYP+UxMvDsi61B31SbqdKNXypcFm9AX8KF7vSpnywH9td/Z11/bf+CSDm9Cdc6LKpuiFFfLZz6cjnrvPw36KKumzYVJoZLoaLj0GkdXNt5bAkCd2UF6B7WtXfqOZyGs3IMUNrI6jM9rhQvAVE16/jJZcTSshbtI5Srj4eiKzmMiZmiqjfzE+PHyrMyL53zAkiBV7XLW5x6eQ+cEHEXkQPb/pUjA8JvXw2y//gsnwsUuZLAollwttSZpresRhmmVDLaW8f/p0u5Uuu4aQ+M4PQXQMeBf2zhitOfTpTBSKGCwnaMC1GtzPFiU3m9VQ60zVfNLn/xnZet6Qt2//DUiXpjWt+Hbz+NMPED7eKK/R4xNKYRsgpCfnl0o3eaFWqR+Kiyon3tCTHWeGTqjipPndtEmpUUmfuB18FZ29+pYt35ilfTPDA8MxWZoeMw/v7CDM6ZHIAn4WWz9Mwf+TbNEdr2yuTXRl6+KOY8bg+QrzzFKyQihFNe1fo/6LR38AixOnK9AYb1eAaXmX3HAnz74oKGDRxREE27QZJu4cT3DEF/I204Flrpim1ZGkuRU2Qlt/nQ+5dRRievwekV2cYeO7P1PeZTtASpPhmG8qrHQ6jj6JD/2OM6YzxYjCtqddmW5CpMc0McKo83FMOi34TqY67yllL205e34oLCWMMtk0jSPs3o/w0tJ1u2o74lrmRTzt0sbYr8MnhuZasNvL2vTT1vj9KioEuli3PczAickMXEtHYyYFWV02sgmlRmN7nU7GngiuTJRsaYVhg/az5AVUOd5uFc6IR4iojKiH+jlGmtCebbmKExmDFuSDO3V+0dQhjKHNKsSBx3+Pti0BpqNyCXQOBtVpfoQay9FCnq8htbyKwE34GcXa7Ve3gRIXaGRkKJlETlnZg45aORkAfls8//JHaqpDtF20CynxAFAzBldK5MgmK39ZoSB+om5w17h3LcODC0i4wVW631vuDuWKbe7DRhqcdpP8mjRfiQeqjBMWefrCPqyvNwGa/X6pMYWJeJadRWI/SothIAHp0KCBiJzh8PnTv4iJIMskHvhUqwigwZfwYEBbAOgH5y+9Cph23deg X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cc247eb4-1830-4a2e-451c-08dd64433574 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:29:58.1631 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Q8eHt9mRyL037xuZemLULfTsA3ulReyRYa/9f1ylnj4ITYkiOUIkfjYDFbZAAxtANMiPSx1iXB1/zNtdKkBHBw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 33D10140009 X-Stat-Signature: b1faagfuozyfj4ctxt1oz3s5ihhhsean X-HE-Tag: 1742099400-182099 X-HE-Meta: U2FsdGVkX1882ztdGQDTCCR3CQIFx/tD66Qh8DEP8jIX0m0GOacWypDwzrN6Z4C4dDWA95IajZ2L16aCbd1LFvY3ePP1d4JjYuarMDRO7p5PxXwpP14YNYxjTAZq1p2dnpxB77yLjDXPcrZGg0+TR73FwCmmACKCJh4SkC7ffRjxZoWLCdiTVbe8NF5G1skpdnmdvHgxmAbwLYPchZpUWYcVw8AXMDSrk/aWISg2BIKz8rTxF6qEXimlZNFY/U0W8ky5Ak2Lgloufnk+E7xdeQINBsRZSqoHfs10LyYMzrh2haEmqdn9tnzK8aehB37xFq3Sw5duSfy4Yb756U7JM4wSNDt8rj/DIatBeLMg+eFLbmI66ITfBu6ascVPvc/s+fwZMdS3oqEK75xGRO9/0KDfJlIdDcJrdfVmB85DV7DTT3Si5xnYJN80S7FIiL2Ah3XxIk/5OJhP8bmDEBkHfz7UqiavYPJOf5vChr+OqRbJ56RPTsj5LzXtaH/XJtt2U53/i/uwcvtcWTjCzKWD3DtVjG+F/OueWwG04mZzNBdGozoMtLnV46ZTwsOClR4afhPltnqPxNT22XCyImt+uRvhxZYXZz3vjFj/xd/+Tya8/uMhVQaxcMTNNQXkpNGQieZR5itpabb0ImJnoFYzM3BO/74cXFl+nkiB8nglzcuhUn0n85nRFIMrZG9MpHfRxeBfhhLTk/DfyCrC+FCl0hyLr9G8qzOkhlPmFkBFXaoMjEkMINA2ksmO8hyht8LlXheusmW3C4RHrL0E+ql7pXAnbkQG7gSzjuIf5tmwm9607RcqubZFi1DeZ1bManGhf9xTi3F1Weamo/g5whNoxzZ41TEPrg1mkVDE+2aKE5veMrAr0d89cPibuLfub6kG9dMsj3mf9RyL7IBHBq4VINxzlrtemgMIINuSYZqU7fh7gJiB2uq5+dN8vYZmpebHTtPGwg91jhbYmW1+D/g uGJBb89u dO97xCyqd9yG6oIGzb85b9LnJ4yJywYKm0kpx/G3Sy4auwXspzFU2cIg4vO1SRcF8ZBENl3D/F//bYMJy1TVSJvZ1NpJiCG0un3B4lGAiPWqDkGyQEsZvQJ/Kb81hphe+7/FlQUJjza+m4DbES54mSB1eYqh6guu8dH3IhQuAD9NklOZaj2BTpKQAGSAx93BZ9elpZJuE0otFmp4T9EoXzthbci3aIq5sPc3T+LNMW/aCxOsUxchfe3pmxz9eTciig3je3ec7ogoeQJ8mzCDXv79TfjtC4IaG7jiQ5SVuyrNG+QpymgwkAmtx2qSZR08NyWYkheX8jKwp10MAunAzvFx7U/AF59aVHr8MLJ6bTBYLm0F7ItjnKGLZ3VTNzyttQ00E9KHYLTzec+2eWSIVlL8b7JAUNmEsuGNBvqPLQ3Oh4zPIKow8l4n8uA== 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 adds support for migrating file backed pages with the migrate_vma calls. Note that this does not support migrating file backed pages to device private pages, only CPU addressable memory. However add the extra refcount argument to support faulting on device privatge pages in future. Signed-off-by: Alistair Popple --- Known issues with the RFC: - Some filesystems (eg. xfs, nfs) can insert higher order compound pages in the pagecache. Migration will fail for such pages. --- include/linux/migrate.h | 4 ++++ mm/migrate.c | 19 +++++++++++-------- mm/migrate_device.c | 11 +++++++++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 29919fa..9023d0f 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -222,6 +222,10 @@ struct migrate_vma { struct page *fault_page; }; +int fallback_migrate_folio(struct address_space *mapping, + struct folio *dst, struct folio *src, enum migrate_mode mode, + int extra_count); + int migrate_vma_setup(struct migrate_vma *args); void migrate_vma_pages(struct migrate_vma *migrate); void migrate_vma_finalize(struct migrate_vma *migrate); diff --git a/mm/migrate.c b/mm/migrate.c index fb19a18..11fca43 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -749,9 +749,10 @@ EXPORT_SYMBOL(folio_migrate_flags); static int __migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, void *src_private, - enum migrate_mode mode) + enum migrate_mode mode, int extra_count) { - int rc, expected_count = folio_expected_refs(mapping, src); + int rc; + int expected_count = folio_expected_refs(mapping, src) + extra_count; /* Check whether src does not have extra refs before we do more work */ if (folio_ref_count(src) != expected_count) @@ -788,7 +789,7 @@ int migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { BUG_ON(folio_test_writeback(src)); /* Writeback must be complete */ - return __migrate_folio(mapping, dst, src, NULL, mode); + return __migrate_folio(mapping, dst, src, NULL, mode, 0); } EXPORT_SYMBOL(migrate_folio); @@ -942,7 +943,8 @@ EXPORT_SYMBOL_GPL(buffer_migrate_folio_norefs); int filemap_migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode) { - return __migrate_folio(mapping, dst, src, folio_get_private(src), mode); + return __migrate_folio(mapping, dst, src, + folio_get_private(src), mode, 0); } EXPORT_SYMBOL_GPL(filemap_migrate_folio); @@ -990,8 +992,9 @@ static int writeout(struct address_space *mapping, struct folio *folio) /* * Default handling if a filesystem does not provide a migration function. */ -static int fallback_migrate_folio(struct address_space *mapping, - struct folio *dst, struct folio *src, enum migrate_mode mode) +int fallback_migrate_folio(struct address_space *mapping, + struct folio *dst, struct folio *src, enum migrate_mode mode, + int extra_count) { if (folio_test_dirty(src)) { /* Only writeback folios in full synchronous migration */ @@ -1011,7 +1014,7 @@ static int fallback_migrate_folio(struct address_space *mapping, if (!filemap_release_folio(src, GFP_KERNEL)) return mode == MIGRATE_SYNC ? -EAGAIN : -EBUSY; - return migrate_folio(mapping, dst, src, mode); + return __migrate_folio(mapping, dst, src, NULL, mode, extra_count); } /* @@ -1052,7 +1055,7 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, rc = mapping->a_ops->migrate_folio(mapping, dst, src, mode); else - rc = fallback_migrate_folio(mapping, dst, src, mode); + rc = fallback_migrate_folio(mapping, dst, src, mode, 0); } else { const struct movable_operations *mops; diff --git a/mm/migrate_device.c b/mm/migrate_device.c index afc033b..7bcc177 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -763,11 +763,18 @@ static void __migrate_device_pages(unsigned long *src_pfns, if (migrate && migrate->fault_page == page) extra_cnt = 1; - r = folio_migrate_mapping(mapping, newfolio, folio, extra_cnt); + if (mapping) + r = fallback_migrate_folio(mapping, newfolio, folio, + MIGRATE_SYNC, extra_cnt); + else + r = folio_migrate_mapping(mapping, newfolio, folio, + extra_cnt); if (r != MIGRATEPAGE_SUCCESS) src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; - else + else if (!mapping) folio_migrate_flags(newfolio, folio); + else + folio->mapping = NULL; } if (notified) From patchwork Sun Mar 16 04:29:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018331 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 9FC5AC282DE for ; Sun, 16 Mar 2025 04:30:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C9050280006; Sun, 16 Mar 2025 00:30:07 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C4107280001; Sun, 16 Mar 2025 00:30:07 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A6C70280006; Sun, 16 Mar 2025 00:30:07 -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 82066280001 for ; Sun, 16 Mar 2025 00:30:07 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 584CB5554C for ; Sun, 16 Mar 2025 04:30:08 +0000 (UTC) X-FDA: 83226136896.12.E610CF9 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2088.outbound.protection.outlook.com [40.107.101.88]) by imf20.hostedemail.com (Postfix) with ESMTP id 8252B1C0002 for ; Sun, 16 Mar 2025 04:30:05 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=Krz7tgQz; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf20.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.88 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742099405; 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=NgRT6WueUkXEphwCJUp8cua2k9wyzPo9pbza8QRm0DQ=; b=CWsjX9Jxa297/EPcw5z66FEFmIGTj/RO0DVGNEQAzO0YxmnfX/Gr2Molkx7IyuPiJcuPcp hUoVnRZReNJDxTdukuo5K0K8ArteaMKkEotYlcBq52p3id7xM+TK1SmJBbPjr+WTYMatbG n4Uo1LGHAmcvZnq0a/5L5Rk/FoM0B3Q= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099405; a=rsa-sha256; cv=pass; b=Hq6EJl/iMMDJhNj5P3U0lWOLoNwcgw6k72qqpGHK9SJus3gv1+GiwhfBaZVl/H+w4EUs5Q QV7HdVTDgTJdg6J3PbIibK+J4imyU3NfBK/c/52LRCotCp4hsGDgkuTwmUz8rwpQkQTFdF 6WdKYwOXxY5G6M2tSy2hFdqRWix0HFw= ARC-Authentication-Results: i=2; imf20.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=Krz7tgQz; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf20.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.88 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DX7eYKCdE2bL7KkhLd9DAPRFrxOdHvwDQkoCO5Xh+Qw0caOKzT+93wTgDtVj9ZBDxPxo9MHquFRvUkiELIcbXNh19CpxYfCZlGbb5eaDjQ/J9y9RH2JILRyflqm50AI5AFwH7D3N9d1DEZk/g/UzjDsLdXt1oUy0wXohGACmsGvmX5PKIRMptr9d2y3GilKrHDDKVYRXlsJV8SVOOrOUj7Xx72ANzweLGRrEy4K5EZLvur+52St4cKF9+f4qO/hrRJKsnLACjC+61GF7QUet6uOj6yGE/VrzJvkpjhQJpzgZYnj1bzNqKFKOvEAoOXdQH+Pdx0z4P0dFU8cSG4CH7Q== 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=NgRT6WueUkXEphwCJUp8cua2k9wyzPo9pbza8QRm0DQ=; b=bHhqUYe4+y7rDFmLoVeK3E993oZ7tH6LiQ1oYlXuOloC1nmnKC8/Is96dmQY0YibWP4Lyj85BhRsNlZ/shcn0WNKBwLNXOAtCJBXJ2sufcPId+Gw1wy8RYnS0+7hMF1B1xb7z9USW7GR9kzmwx/9rXWmWWP+ulIaUHRo5huTGYSvjquINRuFkVSon1o7iRI0lmuKWmLZxO8wFWedoUc3wLXWmghCPRQGNhUcQM7dhF/JtKJTBg5Qt3lBXIYXhPr3IGaeix+4tR/7tE5oNDusJqTgCBeX7hILPBM6tEQ/zYVaLAAORT+/tVe0i2wrWkdp8YA+7MAuWMsgTuIyDk08FQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NgRT6WueUkXEphwCJUp8cua2k9wyzPo9pbza8QRm0DQ=; b=Krz7tgQzIr827ehFY+3u3Rxfqr6NuflRpAwALqm+yw1rWKD96eFOD6CZgh4xtpF5vtKTiIJfhXIgY3QqYBZnHEe+nHvydd+YXPnP7WipGuOOdiZwg8p51i3STAU7ZzTK2jmXmSwhkXlSLgtCbKZgVe8VUSXzU8f7zlVFh7Flzm1NPxw0RvJpXtxN5mnvi/mxrf6gYzxLGXZTHQTW46BS/fwDnnbhnWBffC20nwCn+u6eDazdfNW9rNOdwb7s+CzINh3vbVKC4p3wixAqnSelwWwYD9372E1wgybdE4RpevQs6zXLAXJNsgEX2Qo543LqtLrItI63gZrZw0sj8DemBw== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:30:02 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:30:02 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 3/6] mm: Allow device private pages to exist in page cache Date: Sun, 16 Mar 2025 15:29:26 +1100 Message-ID: <846bb6f8a3077ceac767002a88119adde2e86491.1742099301.git-series.apopple@nvidia.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5P282CA0058.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:20a::17) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: e1851664-a826-4158-bb4a-08dd64433804 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: gylJrbRE1Fngn2PyPKYO1KWoaV0nk/cAiXw0kdE7Xzako+RcGOURbYMg/goINAD5tfsXGXJC9Kfe3+DiFP/kPWUXvaE0XNgPEHBtpUg+jmV5pAPEvPeK8td6ZdltW2dtxYvZKhKjUYe7tFC1AmeD5hXzo+1A+/O2NS8itrqLn24qJKs/E78dn7+NsxOIAerYX8Dxv5cepDlxOYCb8LcsMoKfZXliG8m7cQlHcEtBbelVvoqg9b6EMtlxCRzr2Y9Z1dc7tAPmHeihJXi+QDjgAwZvK0OpTfjsi8oCAt42VWX0jyrMiOfKajF0QKYbZoDQHlCNfj8VvVclhEwC17oJN93Qssv7K8JDmIax2dcB+vwqOFf2pHhT9yA8e/I0jgRbbTWK7fdqN2M1MYp2QxBtYrXY3WLWcm8CWua+KryU3ZMLycIEafVo3YeBEfFIs7qmB7Jn1lFng907+LQojZZVydng1G2P5b2h29bkmgaWUh3KNCjAWUNl37TZHoFoigsyHZo0Ujohj2nXjBTAm+e62buBszBGGoHW2ulzG4vCEu4F51rFjJd163HQoHU/vASXlqKWQkEvYhdWnis3umpknQ5LC6rR/KFULs+k5LcJB0ffT/mCReIcnEVFVlztjN+Kiqif0661ykR7Vl5pQaf2OtYC7CqMIbSw4m28XsOUW1HOgqEQkBGu8/c3AiBxGG2s2fVyyzLAf/lsPWasK9eWn3fMLDvVqrJmfV5Z8hVSZPG1/0sIxDiVWDIsx6qADMXc26ra/xU8UBYDYNzW0PUvCGPR9RwKWUR302vv4jMcuKDfPCz+tobzakKf2eYR/JDhHBlC6xYPqpLPuUA9+lGb0gMhIhZR6iL9D6kl27+nK9j5gHqXGK+iRSZoFf0lZ3N3Rbr7Csa1DnM8yD8/uk5VLEbf0d/tUvb/yLPRghh8KQhl7KFYp3L+RXpJZOgj1vddC9PifRUox2VFmGEPM57QY8oGYFDAVjECAqqKowjI+2cdEOz+rYh8MDiinHWhJQmefR+Hg+a5Lcad+Pqw/pV86mAhdR9YpajdGRFS8LJTwLuIdA+FN8DNm6GXw+47Eqewyr2GQlKm14AUXiCKaK6TaNTunvzwwiutNN1mhP6yK1Scmkm/3CXaWcPvCuKHxCPgHeUdrbs68i593hWF3zm2SP6qs8saiAvu6fJxddMkj/pU81z4Vlgb+vaX7T1SyGOGtLRM7z+yc8xLR81ENvMVePktbrH1VSCYD+hYozCFPVo51BwISu0olL8p//s3gGhq/7x9PPICPKjckFDy6BIiSjpKKz4ydG7FrkrJcp9nNdKTKFUQJEclCgu6h/17BVt+9AOAXCd5/Vu63Ph6Hjk5UTZRNGbO2MjPiy0MhPKmY8V92dgndplbvThHyU8bWNaH X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: iOkFIZnBDwfQ9xlvBe8dh65ivII9ovIk99u/Q5MA7nUNPmnVV0zy/dFqiu4mV+lKSFOiGa5JbUa5NzB9qZRGW8YYU8cjceDj8l+JMoVNIp7Gh6muPvoYvQDZd5hRHrnYK3QEspoUeN3nq3s46b+moQHB+bf7GQ6mKxJ7lSMnxFwrg8rktklOMhHhUzZuL4zSR11inMnPGFPGKrM9v6Kwoak2lREj0BZiwpbelZmLrMm3rB5l9kDgYlPDtNoYO6XnDyzgO8r0M0yKan4zNGJuTJCDho9Q1ig8TIqMui8W7r8QDNv0qkmsDxFt9O7JKtV1B0NhADQnt7iXUq322zsnP3fOIUzUs68QjJk7/CHZFLqdQo9zo2WDJDcNnqGw8fn04zkavumMplBXzmLER7+BjRCwGIvCE9mMamBsYLi6GtCaR/hXhnQ9KXR63A4Qdbdr7LFFDHSouJGkVo3eflYmB3zWxIjSXkuK9aPbv2sPPVUAHwab/eIbtTf8mS43LhqOkdxp73dpisyxaVe9k5AcwcxbGwrmYNwUDBWhbU0DK6qH+HQfAU0bHL7s0Ah+RpzseuL97UZKiDLU89u+HtSEdZ6zFaDaWlmaV1eYoGPKnSVfjzIA55gLljrqJgLEZl4WDE6KDXLNDpiX/vTLG6qSM5ZwUrDoEs5k2u75o3G8q3k2/wfr3grmj1tHLkqVEVyIqIQq0Oez1gBzl4InenQYo0w5ORe+rovL4Z1/KTFTzI3ScZS/Yi4BrfFkl+tuq9igv9NSjoNg8GO4b7fo4l/Cno4sjn8hKvpahF3SivHKMlM0JLZFts/k8a+1bYrL0VhpywgPwef3wiP2/57axVmaMasF6iGh0g1A19AYo0QghRBFMVLPf3gqmPg2ya+2vtsXKLoLm+IWlc97ZSQDVOQp5CAEyHTuiWsJQ99+7dNBpi4hfkiTYZB2V0gAsaowHtBzp7lLe93BwdjTV8fhVj23uIjI5PBkSpi4LZWu9MeUOWamBO8RnmuMZFQYjcJ0lNJkMWmaQ0AKchGThogEUn7bNBPr8kXAcqREwpHo4vlcWMbEqQ10EYJzdFmCR078P24Q4XDCNqcaFkvGQuXppXJ6+40LFUOFYAvThtKe0uaCrlT0u48oIYzrdeYq564Nyu9R9LmwycLddIlgV8Whn2icH99dZiIQ55vkxBo7jxyAk1WTjORBe4Agc91ElDNapsvUgZL1NkRyeAlyNPywaL82onZ2XuhVjCArVSOizEMidM1W7TXI7vSrM+okS5dfotJnM+0eZ68LacxUFd8SJXqcjNkWIF61sd1UVzwGYOfDiu3X1/YkWnz7+1AFfK4QEoF2Vta6vY82WEwsO0T8SnKQhpP8qkWxIhzAuHq93wgjmvAcxXP9JXpBo6Ubt0EcNx/XvG3EzUFGQkWCvPaGLGF+dLOgwOZy5HZ+IAiKQnnwEjqicr7azzW4Di/QcANjw8bahNrH5oW5UqTSmVg0FREaq63e0Swh4zVhwwE/iTQ5+wRsMC52Dm75Zc+YKdOAJyq50ARAfnee4IWm9uhw83uNb+DM0KBri2DLDWBVP60nOj97DL/MPJnuwNeDA8LbA4mj X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e1851664-a826-4158-bb4a-08dd64433804 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:30:02.4710 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bJP74SKwaVhmf8RSCNMJ4sHxM1YguYY2wXmp6vEK1uNiN7nyIkgoa1tvDX5x18JELFrIee19UQnd51b9hKhoTQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 8252B1C0002 X-Stat-Signature: mwahdh8tno44gr4x6ykow6qmdtz1rwbn X-HE-Tag: 1742099405-580391 X-HE-Meta: U2FsdGVkX1+L1Gf0l4buk7KQ7J/5sLGcbctFBnr7Irbgw8wBkQ21eb4e0xAT+x6z146W/usqNt1W5cB2D/8nOGBDviWCwsC/ln5jUwtnTfeyQDclRjYQBzFeTC5VKFi7cXVl5D3SHorCuFzZC38f7KaYs2Ot1VyODRTpW5pflBNCrXWokDQg3J6gsMLmz+Sq5vakC/kbSx2Vh8A76WeMqJfheQj2nrAmAYXqDFKxRRxDwlby+keFboqA1qVOzNyqoHV2hj8CTj2ujOzfsoD4FxJSf8cq0by5aNvSqEbLlngrgfAB9oRORHqdZxDpFeOADf8hNWWFFQ3VV6lQxriWIGgCpO/4U/q606PSNn6N+CGt3k9CyGwpQQADLMhyjC7UJrnsPU3TBwJQ5voN8TIZyPFfHx2XP05186n6quiNy1NrYOZNOZIpJpXS02S1jLP55iRNBemZuUiF0EgHkKxwDaQ22TP/+GfQB7+f8Aq6aEwMse4hw8Mz1a9HsRI0/lJKWFg7WMlViYR5Py7FYodWthkf1DsVoce8QtYNV5NYcfVgdTJJrSAlOtpf38ZYqgVPziIsw1R0OthV++VGG3ZNB/bDsDVrRzvP9f+485f1YEote7djIEjtbgOs+OvVLzHV9F73zEP8rurqNC53/LIhwjuh4vd242d00kI3Q6RWz9eFED61vlzqzbyLhpp7y9v+9LLng1PGRvs6oY1AZSoshGFnQqdyYW/SAIqxld9ehZ5zuRtFxEJslom4rmS48RNd1MTLih94Cmcv+KSjWQ1cW+XUnDvxc5p2zK13B67pALlbDSS/vWIDCCW1i4O2ktDTviJu3vMTU63OV3Neb9q82YZE02G4ZNRev8BcLGviYYq2b/LrAcn0jsKMz85ChH3UCNWTXMuxe5hXTYsBp49T0Tlcz47WQWMoY7y/jvF7x0oUtJ014+kTwsGJpKtafEPBVL6NoxLCvD93H1oSEAz q1mLP3OI rEjiqR8dvmWq4rLZzjss+mS405HqwznLktFHlnOKVjRwgJqu5+++mKMqrM8VOw+4AQzeIWYnMdtu7xiG2ut51By/eIAxtprqaHADTVJ5Ql89k5vtjfKaDEGFCA05uEwgdYAV0ebRbqBaNqYr+dGmHWDCoy9ptw9jpkRpJBYWXQ6C0OQ4eRVhKkHzKWe1oXPEFdSaEO4Ht++Rgj1IYWL+6B5j2kp77Cewrsd9nkw+sPsNkzMtdETBrL8XzuJyCkJNoz/2UohbuY/aYuF0jF9Tem7qdsn/iglLZPNvzZN0dYV4/V0kRQaZ1h64PiX4j+I6yIZ8JIvO6pn/CS2f2jKVKJb93WbFiixrY3+A7ezcg7+u7kU0mYbbcf65fZGROpV0sqDxy 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: Device private pages can currently only be used for private anonymous memory. This is because they are inaccessible from the CPU, making shared mappings between device and CPU difficult. For private mappings this problem is resolved by installing non-present PTEs which allows the pages to be migrated back to the CPU as required. However shared filebacked mappings are not always accessed via PTEs (for example read/write syscalls), so such entries are not sufficient to prevent the CPU trying to access device private pages. However most other accesses go via the pagecache, so can be intercepted there. Implement this by allowing device private pages to exist in the pagecache. Whenever a device private entry is found in the pagecache migrate the entry back from the device to the CPU and restore the data from disk. Drivers can create these entries using the standard migrate_vma calls. For this migration to succeed any buffer heads or private data must be stripped from the page. Normally the migrate_folio() address space operation would be used for this if available for a particular mapping. However this is not appropriate for device private pages because buffers cannot be migrated to device memory and ZONE_DEVICE pages have no where to store the private data. So instead the page is always cleaned and written back to disk in an attempt to remove any buffers and/or private data. If that fails the migration will fail. Signed-off-by: Alistair Popple --- include/linux/migrate.h | 2 +- mm/filemap.c | 41 ++++++++++++++++++++++++++- mm/memory.c | 9 ++---- mm/memremap.c | 1 +- mm/migrate.c | 21 +++++++++---- mm/migrate_device.c | 66 +++++++++++++++++++++++++++++++++++++++++- 6 files changed, 128 insertions(+), 12 deletions(-) diff --git a/include/linux/migrate.h b/include/linux/migrate.h index 9023d0f..623fea4 100644 --- a/include/linux/migrate.h +++ b/include/linux/migrate.h @@ -62,6 +62,7 @@ extern const char *migrate_reason_names[MR_TYPES]; #ifdef CONFIG_MIGRATION +void migrate_device_page(struct page *page); void putback_movable_pages(struct list_head *l); int migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode); @@ -82,6 +83,7 @@ int folio_migrate_mapping(struct address_space *mapping, #else +static inline void migrate_device_page(struct page *page) {} static inline void putback_movable_pages(struct list_head *l) {} static inline int migrate_pages(struct list_head *l, new_folio_t new, free_folio_t free, unsigned long private, diff --git a/mm/filemap.c b/mm/filemap.c index 804d736..ee35277 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -658,6 +658,12 @@ bool filemap_range_has_writeback(struct address_space *mapping, xas_for_each(&xas, folio, max) { if (xas_retry(&xas, folio)) continue; + /* + * TODO: We would have to query the driver to find out if write + * back is required. Probably easiest just to migrate the page + * back. Need to drop the rcu lock and retry. + */ + WARN_ON(is_device_private_page(&folio->page)); if (xa_is_value(folio)) continue; if (folio_test_dirty(folio) || folio_test_locked(folio) || @@ -1874,6 +1880,15 @@ void *filemap_get_entry(struct address_space *mapping, pgoff_t index) folio_put(folio); goto repeat; } + + if (is_device_private_page(&folio->page)) { + rcu_read_unlock(); + migrate_device_page(&folio->page); + folio_put(folio); + rcu_read_lock(); + goto repeat; + } + out: rcu_read_unlock(); @@ -2034,6 +2049,14 @@ static inline struct folio *find_get_entry(struct xa_state *xas, pgoff_t max, goto reset; } + if (is_device_private_page(&folio->page)) { + rcu_read_unlock(); + migrate_device_page(&folio->page); + folio_put(folio); + rcu_read_lock(); + goto reset; + } + return folio; reset: xas_reset(xas); @@ -2229,6 +2252,14 @@ unsigned filemap_get_folios_contig(struct address_space *mapping, if (unlikely(folio != xas_reload(&xas))) goto put_folio; + if (is_device_private_page(&folio->page)) { + rcu_read_unlock(); + migrate_device_page(&folio->page); + folio_put(folio); + rcu_read_lock(); + goto retry; + } + if (!folio_batch_add(fbatch, folio)) { nr = folio_nr_pages(folio); *start = folio->index + nr; @@ -2361,6 +2392,14 @@ static void filemap_get_read_batch(struct address_space *mapping, if (unlikely(folio != xas_reload(&xas))) goto put_folio; + if (is_device_private_page(&folio->page)) { + rcu_read_unlock(); + migrate_device_page(&folio->page); + folio_put(folio); + rcu_read_lock(); + goto retry; + } + if (!folio_batch_add(fbatch, folio)) break; if (!folio_test_uptodate(folio)) @@ -3642,6 +3681,8 @@ static struct folio *next_uptodate_folio(struct xa_state *xas, /* Has the page moved or been split? */ if (unlikely(folio != xas_reload(xas))) goto skip; + if (is_device_private_page(&folio->page)) + goto skip; if (!folio_test_uptodate(folio) || folio_test_readahead(folio)) goto skip; if (!folio_trylock(folio)) diff --git a/mm/memory.c b/mm/memory.c index 539c0f7..c346683 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1616,12 +1616,11 @@ static inline int zap_nonpresent_ptes(struct mmu_gather *tlb, if (unlikely(!should_zap_folio(details, folio))) return 1; /* - * Both device private/exclusive mappings should only - * work with anonymous page so far, so we don't need to - * consider uffd-wp bit when zap. For more information, - * see zap_install_uffd_wp_if_needed(). + * TODO: Do we need to consider uffd-wp bit when zap? For more + * information, see zap_install_uffd_wp_if_needed(). */ - WARN_ON_ONCE(!vma_is_anonymous(vma)); + WARN_ON_ONCE(zap_install_uffd_wp_if_needed(vma, addr, pte, nr, + details, ptent)); rss[mm_counter(folio)]--; if (is_device_private_entry(entry)) folio_remove_rmap_pte(folio, page, vma); diff --git a/mm/memremap.c b/mm/memremap.c index 40d4547..e49fdcb 100644 --- a/mm/memremap.c +++ b/mm/memremap.c @@ -143,7 +143,6 @@ void memunmap_pages(struct dev_pagemap *pgmap) pgmap->type != MEMORY_DEVICE_COHERENT) for (i = 0; i < pgmap->nr_range; i++) percpu_ref_put_many(&pgmap->ref, pfn_len(pgmap, i)); - wait_for_completion(&pgmap->done); for (i = 0; i < pgmap->nr_range; i++) diff --git a/mm/migrate.c b/mm/migrate.c index 11fca43..21f92eb 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -248,12 +248,14 @@ static bool remove_migration_pte(struct folio *folio, pte_t pte; swp_entry_t entry; struct page *new; + struct page *old; unsigned long idx = 0; /* pgoff is invalid for ksm pages, but they are never large */ if (folio_test_large(folio) && !folio_test_hugetlb(folio)) idx = linear_page_index(vma, pvmw.address) - pvmw.pgoff; new = folio_page(folio, idx); + old = folio_page(rmap_walk_arg->folio, idx); #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION /* PMD-mapped THP migration entry */ @@ -291,7 +293,12 @@ static bool remove_migration_pte(struct folio *folio, rmap_flags |= RMAP_EXCLUSIVE; if (unlikely(is_device_private_page(new))) { - if (pte_write(pte)) + /* + * Page should have been written out during migration. + */ + WARN_ON_ONCE(PageDirty(old) && + folio_mapping(page_folio(old))); + if (!folio_mapping(page_folio(old)) && pte_write(pte)) entry = make_writable_device_private_entry( page_to_pfn(new)); else @@ -758,9 +765,12 @@ static int __migrate_folio(struct address_space *mapping, struct folio *dst, if (folio_ref_count(src) != expected_count) return -EAGAIN; - rc = folio_mc_copy(dst, src); - if (unlikely(rc)) - return rc; + /* Drivers will do the copy before calling migrate_device_finalize() */ + if (!folio_is_device_private(dst) && !folio_is_device_private(src)) { + rc = folio_mc_copy(dst, src); + if (unlikely(rc)) + return rc; + } rc = __folio_migrate_mapping(mapping, dst, src, expected_count); if (rc != MIGRATEPAGE_SUCCESS) @@ -1044,7 +1054,8 @@ static int move_to_new_folio(struct folio *dst, struct folio *src, rc = migrate_folio(mapping, dst, src, mode); else if (mapping_inaccessible(mapping)) rc = -EOPNOTSUPP; - else if (mapping->a_ops->migrate_folio) + else if (!is_device_private_page(&dst->page) && + mapping->a_ops->migrate_folio) /* * Most folios have a mapping and most filesystems * provide a migrate_folio callback. Anonymous folios diff --git a/mm/migrate_device.c b/mm/migrate_device.c index 7bcc177..946e9fd 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -745,7 +745,7 @@ static void __migrate_device_pages(unsigned long *src_pfns, * * Try to get rid of swap cache if possible. */ - if (!folio_test_anon(folio) || + if (folio_test_anon(folio) && !folio_free_swap(folio)) { src_pfns[i] &= ~MIGRATE_PFN_MIGRATE; continue; @@ -862,6 +862,7 @@ void migrate_device_finalize(unsigned long *src_pfns, if (dst != src) { folio_unlock(dst); + if (folio_is_zone_device(dst)) folio_put(dst); else @@ -888,6 +889,69 @@ void migrate_vma_finalize(struct migrate_vma *migrate) } EXPORT_SYMBOL(migrate_vma_finalize); +/* + * This migrates the device private page back to the page cache. It doesn't + * actually copy any data though, it reads it back from the filesystem. + */ +void migrate_device_page(struct page *page) +{ + int ret; + struct page *newpage; + + WARN_ON(!is_device_private_page(page)); + + /* + * We don't support writeback of dirty pages from the driver yet. + */ + WARN_ON(PageDirty(page)); + + lock_page(page); + try_to_migrate(page_folio(page), 0); + + /* + * We should always be able to unmap device-private pages. Right? + */ + WARN_ON(page_mapped(page)); + + newpage = alloc_pages(GFP_HIGHUSER_MOVABLE, 0); + /* + * OOM is fatal, so need to retry harder although 0-order allocations + * should never fail? + */ + WARN_ON(!newpage); + lock_page(newpage); + + /* + * Replace the device-private page with the new page in the page cache. + */ + ret = fallback_migrate_folio(folio_mapping(page_folio(page)), + page_folio(newpage), page_folio(page), + MIGRATE_SYNC, 0); + + /* This should never fail... */ + WARN_ON_ONCE(ret != MIGRATEPAGE_SUCCESS); + page->mapping = NULL; + + /* + * We're going to read the newpage back from disk so make it not + * uptodate. + */ + ClearPageUptodate(newpage); + + /* + * IO will unlock newpage asynchronously. + */ + folio_mapping(page_folio(newpage))->a_ops->read_folio(NULL, + page_folio(newpage)); + lock_page(newpage); + + remove_migration_ptes(page_folio(page), page_folio(newpage), false); + + unlock_page(page); + unlock_page(newpage); + folio_putback_lru(page_folio(newpage)); +} + /** * migrate_device_range() - migrate device private pfns to normal memory. * @src_pfns: array large enough to hold migrating source device private pfns. From patchwork Sun Mar 16 04:29:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018332 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 2C0E5C28B30 for ; Sun, 16 Mar 2025 04:30:13 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4D953280007; Sun, 16 Mar 2025 00:30:11 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 46085280001; Sun, 16 Mar 2025 00:30:11 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B3B4280007; Sun, 16 Mar 2025 00:30:11 -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 0B854280001 for ; Sun, 16 Mar 2025 00:30:11 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id E20771405BA for ; Sun, 16 Mar 2025 04:30:11 +0000 (UTC) X-FDA: 83226137022.07.ABFE305 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2075.outbound.protection.outlook.com [40.107.236.75]) by imf22.hostedemail.com (Postfix) with ESMTP id 357B8C0004 for ; Sun, 16 Mar 2025 04:30:09 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=Z0tKUjf5; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf22.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.75 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742099409; 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=5SHU6pED30VI4i2x05K56G+ModCjzq+/3eUcWasst7Y=; b=3yNXcAqB1X2tRJrZtKIXhRLK6jMiS8GvlOmuICj1cJJ0lyVzCAEe1AJAs61m5GDHsrd/jF d8LfDWWYObesJoTCzRZWjuxhw22ax+vhfDMKc8ya41hvHPtYBJ8KwPtJSkFNGiRN902FaD XiIYSegV6RuMLXA/k1nzaYHmFxEHHkY= ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099409; a=rsa-sha256; cv=pass; b=HwkOBAtvH9zFWI6AwYA28Kxbl40PCsweDMT2B6fQApGAncU1auRe6I1HYc0Mosy1RZHxp1 HBUTH5M0FtmHRj281ASrh29WCFVHxGiTQ33B8fUD16O4ga35OfqVmeS0spBUQHfQyQlfIo XcWta0z0dYEoNEApGT4xaIr1hPhGRFo= ARC-Authentication-Results: i=2; imf22.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=Z0tKUjf5; arc=pass ("microsoft.com:s=arcselector10001:i=1"); spf=pass (imf22.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.75 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O+9Up+1rTpRyZ5HC1ilQanfxlVeG59UtXEEKt13Th2Rgg6kl6sXnvJO+PGR+IZqgDkrbBOecfP4tPBtcXOUEGq3JveW4XWWMbMdP3/jxk5bztqZiwXpEGpggfF0Gt+JLYqAeSaubsgftLp2RyZBP+LxjpzkCu7uX0nbxVgT76yhehiSNcX4jbVKqxyY14EvY0eCawnQWuGmzX8PSrDw/+TmM4Z+wKx3GF8ctihX8HDKGsmTQEv8aYi0xJPYCQxlkrKTRNqYEwMJ8Gct9G1Qb8xc57NeMhjghpAbx+aZNEmMjRsBS6bDZDS9XBe8WnNRHZPcnp4axWRSDw4BNQfyDxg== 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=5SHU6pED30VI4i2x05K56G+ModCjzq+/3eUcWasst7Y=; b=Knjbvg5zgwuIRp94Fzg0XViQ+KtqJMxoXcwFwAUYlSu0ptOzPfFP4agBSYnTTZQWhZEDxzhC9I9O2tO3W5gqxHcGHgUwN4iXqxR0yIkFfQ3ZdvScTzekXOomSXbllbozwyqsUdtFRX66cZsApnic0Mp0d2vCJD/iyybSBE8KVqNcp0igJbcvOX5yHIqI8DYvK1rOjuHQdQ1ycgAUnhDkWn0TeYOYvlHVurjAEHYqJ7KSM9roB+oIf6wNfxdDIXyXoqL8gYpSPkthxcZ53Ql+hhPyAxpXA2+S2uCp+pGVR52jpveE9oz2j+ybta8rJR3mvK11okx7rdtu7G4LQGvcBA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=5SHU6pED30VI4i2x05K56G+ModCjzq+/3eUcWasst7Y=; b=Z0tKUjf5VnIoyCamHZsOTwdW4ndyt2W2G8VvV7GiiTMin+NlmXwylOHAFH9FIE95pQj4cnGUQrFLtv2la45yKqq5Eh4TCdnN9ljDTzlQDFKNaukgu0VN2QxN/j7rP4vS/JgPtQlJBsZS6G8kj9uZvU4qOgReORlSg4SsENR1/ocPbhSRYodCo3UGVFeNrDN0jHaKIUamgP7WVYHp44Bd9su7pnKdfGMtaoP1/l6JklUCQ7l2XAmygAtlnJ7qPbJZ+en65lZhs/diCoU/KvSE7FcfxjpH5rUHMk7nCJokv+t3gPP0zVub4fltSs4YPCwFw6HU9rXF1eDBTD09n4dUbA== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:30:07 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:30:07 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 4/6] mm: Implement writeback for share device private pages Date: Sun, 16 Mar 2025 15:29:27 +1100 Message-ID: <1bfac47d0477ad5f13a8daac673d4d4c415645ca.1742099301.git-series.apopple@nvidia.com> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5PR01CA0087.ausprd01.prod.outlook.com (2603:10c6:10:1f5::9) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: d0ca5b5b-2fed-4671-49ff-08dd64433ad3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: 2ywLTXMtkeGmjxI8tpPAfHSAICttmqI1pwfPDRbrCqowJUZgXPUQa/fqmA/MyrU7um5o2fPNw3v+NLO0jm9yWNpIk1/Bb69fcd1HBzjHWZgK9g8/p133vyFXYDYsYUqTL2ImesOiPSBoWpKILTMAqp9fa4l2oinsY7Q5eO9wNRJFtH51ZAqPEabJ89eNhdIOYVOH/1HSNwhO54UaEOFquR/izkLGAXJSN7qc28Bjub7UE5gbGBfQUATtDsiQXjOFUU0VMFUCXJxAGwxjK2urKxEmSOnX+eZZoRCuhdDuwATofurWA/J2McWrKA4yubKv7EvD1tj4+tvidbrkA+yYgSyon5U8iNoSafpM+zBqSTQ5AbBR2oLEv86jmtpnpB/uG8/QK9qm+05hiAILJX4Uh2mON0m1VLPfDvA5tkvkJhNzH7ZdQGMcSSOuPGHH6HmtfMTMxCDC9APPTz0FyMjAjlDnyi05VrBZ9U8d21bhjWHMp+C/aQe5QflCyoXqhM14Hl2LZgdjREV3qf0iJVTGMMdwHJaXEg3jaGtW7j/hcNHu6F9Jkqh5yz4LqqYhP32jFxeHnNgUIYKgDGAYnPmX3rWdklb/p6rtxNj24m6/7vzpDutd3muaAbqDlavlNoL160R2ri3w3xWGGzQjzXkvMUmk5e1HAI1oLFD/TZ8kyIehbU0JXg9nIDEnmUUmSWZyvt1PqZYpuxP8UXxvqvbeD9JAGNzZeTgh9txkezvzxHz/1AVO2NdYuSEzZZGm58qsBeSOafciE5XRBhhaz9HwsqM0hNUF4RQbF+F/JBiFap3Br2A8R79xjSxNy3run2RnlmGLJstxk4wYP3K/vzh9iJZ0P4uYnHWj4Ce6XlnzZzAHe0SN20AlFssmB+jDy966Da189AXP4EuDg1dL8URegJEabVhmtddKw23yz5OwgMowMKbMwy71iSWJAHwQDCrLJ22iG0Hlucmsnb0of8qvUbJhFgRgviTgrGPnE4qjvZOHBS5+8VnC77gub/EIWnAONVnzyI6R8R73d6KVlYMBTikAlTx4RuLfMo5XZEEXokCzIDLpAvjVUpPbL+esGfuzpMH7rgR3HTS4xNG3RbrujdiarC6+7nvz+gyEDyMkSLp8C7dlOT6WtGUKUv1hDYwMRLK03Nav6av5AvCREnnbtbKXcRF/nti0ytb6jO1hR29BtWrNvHO9gIlj35qn9bOBLe8D8RfAunbg47XIkbxyhMTZRFqi9Uc0d/O4hOZlWNwSM1hNCvizCXwfmtjIch9nTEokLOOnt7oB+MVlX5M5WvGVuuZnQ4LpBwsEGpMqgD34UjMMDS999iW4VXdsrpIvAo1TjWgXieJjEGYMcPhAHuHcEfHpFKxNlCxG6Q/XvxYdL9Wn6X6fuP1CMcHSDi4/ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: oxfMNpIiggBcek0H0Ys3ybYzvZXLXqev/tIHkO3wXyY1SRyDi+ziTAd41b6yxLVz1iwWhRGlWsMThUqMPrxhyDKD+m6FWrknK1SEQgHDc8GiS+6DpZsx+dO7NDrTaTgBp7ZKDnxjfsPFZtrfhcuqMBLgYs4Kb7UxbJ4H6StgN7MERba6wn6P6zy9bZfhST68/miFEcrec/sz3wO2RFFVSys9oXsvHx81nobJ+QmH0EXj128gGzggG/jqVf52dDlEHkRP3COyPxebUj0HBRok5b3emMflQ/p95iuO0gZJRbZYOy+y0R8eG9QLsY/W/ZQFiG8cgWhJyAJ9+4MKqgZISSbnF2XIOeI16wC850K9WpBJqeMA047AWzNd/97HnLjcZyK8j8kDnncdNz3WHUg3RzLW7T3G7pi/ygd4tqAuiXI47+B/d8+qgF/f+DJa8+d6vn9Cen1sOb/29wQNBcNV/GE3mudtp87xv1gg7hDNO5fY1cvztsw097diNpRzOa3FEiiGAHUBQ03eGxJ849Js879SOt3SE3pwBfiGJ1UiXMcjbybRkOGMDX2DOCTRcUS0K7bORfowE2w1xzWpfdogGZGiTyV30PPiw5ACtsEf2O/R6mjvUnwRmbYwGW3foLsXTkEhGz4V5ucNjXE3ShP9CTNDebFyT99M0YIlIUhADGsj5yT+kvLieUGW0IvIsq0dVoI0/rKFOcN6aScdwICl2PqLYtcIOyKy3UX3J8mzPrkAH3AvB4lQ2OHtXTyTt+AkqIJ36Z5Q3Loe6S1wDWDfZMBfz0lvGihzWLryx2rnw/qnwy8OzFLEWRquASJQQIPkcv+u+wkx+1lINTAYV2NqJdaztNLvroaXjeHLwEZf/c4ny0h4JYYNpN4hQXAfN4QxYuEUtnCyN8+yYhGl39KrbcnNYOupzjWL0OxkfQEUBigi3T1QNaWjFqUkEorNX6KtzbaV3PSiLo3mcMCSOU0R5P32uuLG9MqmqCYzsVVZ5oupPnOMBkWeZq2kieGWSxhPUdh9ajM8rkliNz+33VkT2Op004zUpzCSrakYcv+7kr6ktXkr2CYkwIq/oLMpWZtUmfzWDnghLlCjtkXy+sDvP1r6iLy4u2/gnTMHTfgQd8ChFOc6KoMk4KzmTOxTPVf3RdxhY2hAIph9UkTMeqExwZJS06IOP6ecp3H+4h7IbVaFHSK1uLla+jHi/iWP8KvSEJ+2pTg/iHPB3q9XY7PC3LvKBaXeEf0WsRk6+VxrBc1yHikptAslytMTS8x+faVMYvents5U4MmFH9JKdUx3vtw2v6XLsDoUH01xSnouws7g5JeMgTKeeD0ZNMuftgGbsnwrFVFd6iFxCVFlp68kn8wxe5vDlRgQtr/b7IIPDSMW38WDalSWwxgwkxXbaPIJLfRyz7XKVVWdC1S2A66rF6TdU0eSl1RYH2fMi+GlLDqRO7dXNj0Y3v9Q7T7LSFmDv313sXnDqS0PUP1ekf76aHdUyPgW49ikpjEUL9PP+VWbqs4c42SBco+bEduf8eFfU/hZ3i0BqNkmT6/3xJ1PYdFDM9/T321FDACEbnnonQN0+cI1BHKot6KlIPk6SZ4q X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d0ca5b5b-2fed-4671-49ff-08dd64433ad3 X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:30:07.1856 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: lJFoOnlKV7w0wc8PLzN0nBsfh5EJxxg/vuwozpySClR0IyvGkA1PGZ7cFM4QCh1XjalIlbY0bkl33hHJ8ytSOA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 357B8C0004 X-Stat-Signature: ygtwxs8sdw518hgccz66t1u7jjhqwpkk X-HE-Tag: 1742099409-980335 X-HE-Meta: U2FsdGVkX1/V2siKtmO569tYxhCInMX3xgSpo7Q7N2LU/im6wLudjgtmKb9VPlM37/oouvhgJb5A3uHmMOuMRUbWP+2s2+tRVnnxaUMRlKBiFl8C+ddqROr/Ji8raA5moKxrkdlo87wo9HwewkRdVOVAU7b8emgPitDSoO7RHRsgof6O2nPQ8TfUTpV7pwDn0BMd9p/K1bDMkOoSiPFkEaqLDxfHwwr4RuvJhMyMQf9P1fyB2fmvAArMtGkz1BbNXriLWkg4tZsxcqTPAFKeIkO8H9Sc13sCRCun/LF4PKE3k4atEJP5vfsHFaQijxwLADraRA9FsVEMW1e+H3G5hl3/fvt/L/3ksXelAHaWw6qzCU2rTBAtf/N97iOFWmTOnGbzWxwUThklKJqaEbp9SSRDSvaZ5jhnw5OhpXppvBglC4QQpo8a9652nJP1Kas5awrxlEsp0d14ADuxjcgvxCBjunbmGl/xR9LlagxXJCwQYqmtsbazVDP5ejcAAGl3Y8uqARklA7j7eBiCAcXQuJvH/QG4m34dblthkfOJKTrmUwKyXSmD5AUZBGREf1aODzSnFsJzLB/2RDEL1EFlnlyme7JQX4Ks/3vG0ZwqWfc5tLx9YBQr8swpSQj1uzqffB2IZiQ3ohUlzlprJjovOP5NICH/SA9v28coc1Jmxam1YFjGYYNFrtMM6bzlE2kqQy4BqOd5rKypvobAeqywGkSAQvBCenI9CX/PrYsT20WFuxRbTBdtlzHiJo/OULARPP7CMsygS/IQ4JdhotFDczLwBzPyrgjTWBevk6/WaMEer2J1PxZvUxOPKDXdiH8/ea/m8McXyYfk1F5pA9+Qm1rbf73vXLJmejFJ3MY8EJ7BjLFvWMku5WgsXkqGCetksnlxAQzsgD4nz76h0qGm8TNs1qGV4DUONtS3J46VmFo8fh/E5uDcecaNF2UazfQunlUqixuINwVGlUZeTNO 6n4skWlt bGGRczYjww7RWPnxekwxW4M5x39GjuYAPwMEN7q2zqwld6k/iW1gOSdB1IeD58sFmGrp+LPzsxpVJ9iNeWXF9HIDweF0coYqo5L+KWSf8IVGrtkxThbE//FqijdJMRZFCcw4VPl4a+hjzwkKZsLsnFKp+gFRm5M6/XQf6rgeZrFnVhnyR8AjK10I11VjyhlOaNtNSPLQccBErbClub7zbcDe7qL0/mtcED+SlJpv722D6TbScYYEKXm0mwGMBNfchya72QJw762xYP9MzZltU4oJ75z0IpNCoJWWT+3O6GZ34FWVn3FQvWIOb/Bdp//g6Y3RTUp80bRIbJwELR9sH2bJTAsiizwfAlrF854+jttFnuScOfp2IJPEEji9ysAnZNLOs 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: Currently devices can't write to shared filebacked device private pages and any writes will be lost. This is because when a device private pagecache page is migrated back to the CPU the contents are always reloaded from backing storage. To allow data written by the device to be migrated back add a new pgmap call, migrate_to_pagecache(), which will be called when a device private entry is found in the page cache to copy the data back from the device to the new pagecache page. Because the page was clean when migrating to the device we need to inform the filesystem that the pages needs to be writable. Drivers are expected to do this by calling set_page_dirty() on the new page if it was written to in the migrate_to_pagecache() callback. Signed-off-by: Alistair Popple --- include/linux/memremap.h | 2 ++- mm/migrate.c | 2 +- mm/migrate_device.c | 54 ++++++++++++++++++++++++++++------------- 3 files changed, 41 insertions(+), 17 deletions(-) diff --git a/include/linux/memremap.h b/include/linux/memremap.h index 3f7143a..d921db2 100644 --- a/include/linux/memremap.h +++ b/include/linux/memremap.h @@ -89,6 +89,8 @@ struct dev_pagemap_ops { */ vm_fault_t (*migrate_to_ram)(struct vm_fault *vmf); + int (*migrate_to_pagecache)(struct page *page, struct page *newpage); + /* * Handle the memory failure happens on a range of pfns. Notify the * processes who are using these pfns, and try to recover the data on diff --git a/mm/migrate.c b/mm/migrate.c index 21f92eb..c660151 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -1006,7 +1006,7 @@ int fallback_migrate_folio(struct address_space *mapping, struct folio *dst, struct folio *src, enum migrate_mode mode, int extra_count) { - if (folio_test_dirty(src)) { + if (!folio_is_device_private(src) && folio_test_dirty(src)) { /* Only writeback folios in full synchronous migration */ switch (mode) { case MIGRATE_SYNC: diff --git a/mm/migrate_device.c b/mm/migrate_device.c index 946e9fd..9aeba66 100644 --- a/mm/migrate_device.c +++ b/mm/migrate_device.c @@ -160,6 +160,17 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, goto next; mpfn = migrate_pfn(pfn) | MIGRATE_PFN_MIGRATE; mpfn |= pte_write(pte) ? MIGRATE_PFN_WRITE : 0; + + /* + * Tell the driver it may write to the PTE. Normally + * page_mkwrite() would need to be called to upgrade a + * read-only to writable PTE for a folio with mappings. + * So the driver is responsible for marking the page dirty + * with set_page_dirty() if it does actually write to + * the page. + */ + mpfn |= vma->vm_flags & VM_WRITE && page->mapping ? + MIGRATE_PFN_WRITE : 0; } /* FIXME support THP */ @@ -240,6 +251,7 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, entry = make_migration_entry_dirty(entry); } } + entry = make_migration_entry_dirty(entry); swp_pte = swp_entry_to_pte(entry); if (pte_present(pte)) { if (pte_soft_dirty(pte)) @@ -898,14 +910,15 @@ void migrate_device_page(struct page *page) int ret; struct page *newpage; - WARN_ON(!is_device_private_page(page)); + if (WARN_ON_ONCE(!is_device_private_page(page))) + return; + + lock_page(page); /* - * We don't support writeback of dirty pages from the driver yet. + * TODO: It would be nice to have the driver call some version of this + * (migrate_device_range()?) so it can expand the region. */ - WARN_ON(PageDirty(page)); - - lock_page(page); try_to_migrate(page_folio(page), 0); /* @@ -932,18 +945,27 @@ void migrate_device_page(struct page *page) WARN_ON_ONCE(ret != MIGRATEPAGE_SUCCESS); page->mapping = NULL; - /* - * We're going to read the newpage back from disk so make it not - * uptodate. - */ - ClearPageUptodate(newpage); + if (page->pgmap->ops->migrate_to_pagecache) + ret = page->pgmap->ops->migrate_to_pagecache(page, newpage); - /* - * IO will unlock newpage asynchronously. - */ - folio_mapping(page_folio(newpage))->a_ops->read_folio(NULL, - page_folio(newpage)); - lock_page(newpage); + /* Fallback to reading page from disk */ + if (!page->pgmap->ops->migrate_to_pagecache || ret) { + if (WARN_ON_ONCE(PageDirty(newpage))) + ClearPageDirty(newpage); + + /* + * We're going to read the newpage back from disk so make it not + * uptodate. + */ + ClearPageUptodate(newpage); + + /* + * IO will unlock newpage asynchronously. + */ + folio_mapping(page_folio(newpage))->a_ops->read_folio(NULL, + page_folio(newpage)); + lock_page(newpage); + } remove_migration_ptes(page_folio(page), page_folio(newpage), false); From patchwork Sun Mar 16 04:29:28 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018333 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 47057C282DE for ; Sun, 16 Mar 2025 04:30:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6FF97280009; Sun, 16 Mar 2025 00:30:16 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6AD60280008; Sun, 16 Mar 2025 00:30:16 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4B20A280009; Sun, 16 Mar 2025 00:30:16 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 1F3FF280008 for ; Sun, 16 Mar 2025 00:30:16 -0400 (EDT) Received: from smtpin29.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 292CC16052A for ; Sun, 16 Mar 2025 04:30:17 +0000 (UTC) X-FDA: 83226137274.29.F135164 Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2043.outbound.protection.outlook.com [40.107.236.43]) by imf12.hostedemail.com (Postfix) with ESMTP id 6821E40008 for ; Sun, 16 Mar 2025 04:30:14 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b="Fn/ua8KD"; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com; spf=pass (imf12.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.43 as permitted sender) smtp.mailfrom=apopple@nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099414; a=rsa-sha256; cv=pass; b=LGrkwhePO2Gu6aLhu/aiMjfLMogFdlw0AhwHO95PpOJKM0Nv7WtV5WqfjuKDRYBlO1Kwtn Gps9b0BvGODFt/WzBhs8KeILINPQrfyoHMR1klioAfSUsF3x3DVm5OGTMS1dCuNXnVzBWK P4M/VM98k4pAnoEoqYap4K3ZmsDN4fY= ARC-Authentication-Results: i=2; imf12.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b="Fn/ua8KD"; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com; spf=pass (imf12.hostedemail.com: domain of apopple@nvidia.com designates 40.107.236.43 as permitted sender) smtp.mailfrom=apopple@nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742099414; 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=zjshqkiCaMVrtkBmHmhucNtE06eT8r+7HKLv0OzuJto=; b=KKFwOLU/QiBHnrOruZLJ09YjngZn+oMdJLGRsiLwG2a+v6SnQ+bqknx7uHRLlS5gjFlEot qLn9K0PUWHTAYpj34u1UiFVRdGukq6QkrRnBOYUusZeyswqTEolpUnuhdJChZIaZIhSC+j EyVGLFSS+h4NSAdBRREoZJKM2+KiOuU= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Ejuk6s3C4oOoreCxXhrhheiN057XUFPQgiZGC058yr/8h2/cnm8BfVbAPkPfSHYAjNMaIwUiiSSanhbw9Z/WZ/IZIK5oThimgk6fDJfQ3MqBSERAsF2bwLAsORbvQ6THK4Oqqu5eilGdi5dDy5midwWZiR5cKP/MhCQKrVxottzzOKMV3UxeYMh3KP+C7jeb62VNqrw8yfJZxGYxrU7BlSwD/Gek20ruSH5UpXIftRDiXu3/Mj6PTZrX0YQ2TdRgAsKICR9NhjXdgicrFEU5v/RRGqi9Vkajb6cwkdj3DO7eilfN7WaxomjGrTNgeimtbG+wkKdpXl1z62MPloP//A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=zjshqkiCaMVrtkBmHmhucNtE06eT8r+7HKLv0OzuJto=; b=vjbZik6MrSReE9C0OiP9d/nngkbvkExANMQVjn+4LsfltOa1QADL0TX9bebOp7Z6/oROHJa8UKhHl0HZo9uDGomtI6tyz6mUyR9X3elbmHI3G7wujBlxtUR//KGnPIwmqawaQcjDs0DNtUrapYUOYYv/x0vjQheveed5+LttVUEatlRy5bLZt69nfd9g23zggSg/SvJQATLOrgSon6K8Mq0MSTFL8VAUTKTrKXEIKR486Dhn1R7lkwNzFhdD0zS9Gt+HnC+5hjuLOsDUrZKP87lW9LYv97pAOhoCSmoG1Z0v9GGPcUGjgOVDsuZAxBgYSHZa3ZPA1+T/z8xo/UQ8cw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zjshqkiCaMVrtkBmHmhucNtE06eT8r+7HKLv0OzuJto=; b=Fn/ua8KDPgQyHZMelPWmY0rmGvAbNS/PpzPvgZlczzJmNHd+Sfg46EzhY6wVNOwHSbcX48GXVeZkWIs0EyzPuNi0zo26ipyuI3Gtsn3/IJoy9zZvPnhNwTXqKjflJ2Jo0Jn1X2fQxJnoJ4WqV/MGgLkMfcYjOCCBkET6nmEOm3FpB68t0nKME/9PQGu+fzp4pL46PHID9dYZbMLrm9beQHdwutIyRMeo4jgHPdwen0ZzfN4xfkJdDsOy+WEHklXcUVwOtqwEKjFSfs9BI2XBFtSiWSlUUFHmYp4o2uyzXgMxGyuXQQSEveY+mmQJifAaZvCUsVFESrxM4E8hO7Y2Fg== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:30:11 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:30:11 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 5/6] selftests/hmm: Add file-backed migration tests Date: Sun, 16 Mar 2025 15:29:28 +1100 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5PR01CA0035.ausprd01.prod.outlook.com (2603:10c6:10:1f8::12) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: 1395bff4-ee5c-4178-187e-08dd64433daa X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: zWSyacArtKYWKQMtD5C99SR7Pusw+URE3vhevgBTyY5cNBefr3Ga7dENaG7iRUDNOQzwXNLaS8FzyYT0bwqL4fJFfqyOMhZ7R2oI4ZRx33w4+io2CfZicRB+5tDCYxx25NMwcTzhfJZ8Ee2w5qTEyJArNwZjKRNi9mfTW2gg4bumm924UjYX1a5QA0aARfqdvPpo4IqMwdyaN+ekJS7l3ZSDyFN/At78z2NEI0nJOXC7Sh7pgX8TAcKmaWImCtEAX9d7pQtkgoh3FWSv8OrcqobcNbv9V2w2uz2sEEq/eS+ZSZFDJVe5TtZ4hTsXN84EqDI9c1/4H5TitEmlDbzEeaZUXoJ4tp3l8ggsGNNpAHcciRxWg/JrrfQVJqpBCSuIpJ8wmanhPKSl8YO5qAFprVSRaji9wdzsv+57w0RPz9qLBUCB9Qh+tX58lomUJxVYqk0bUvWhXc48vESWex9F9OSZCBNO4l2i76xYsPxA5k1TY+MqR6QOM6wQQNIAl5seLxsYYXLNocdW8yGaIkXcTHclL05Le930Tk3EhYR6wyDaXeRq72yKer08iMuBXEcOmmqmdTQm83MNUD4RGrrsqQ0B9lTPNJT2yJkg1plR4ogUqLlwsDWxm0uYz95P9ScxN9z4onNelWJtnOnYrUmm8wOzUCGcrgFgSMzXUNgx67MSrrnHIxzEtURdYeQJI//0xzJyVcc+q27A0tvjAML9id9AmvHUhCgM5CfvRGJGO+ubWTCZjoTfiHQeEJH0JWyfMpq6G57B9+rVUeFda0PWwnSAm3u5AchFg8xn3HhueLp3yHr/j0C0VPz0dVgbWI8NnUN8TpfWOqymijrittfLmtAsNvdsn7/9KJNMCHCn63uXfDgJzCLhi2rWJF/9+0R8SubDxL65rrPuDEjbQ8izBzDgQYshJLvm/0fBpssIzr5iG5AeqaaiPIkWdNnNuY5XjR5E+JwaZrqZwWXoS183JTCMDqYwkJPhLpBqJoCK1eIPWLm07k3qgSDL8JGBIT4youYV6FtM+OOC9asNYPzriXFTTkEUk550kM743O/lI72+EgCP+Xmmg2D/q17sS7AE5/QbKVa6nmKHLUB5LesVix7B1dauSP0pcLszdAqq8Dn2iY9liFi5LSiT4ufXfhu7h+e8UENbhRBwXZpA7sBOcN+RDYXKvSVKIVLZItu8O8IgPzYQKOVlOp/UvhCj9Tiz33l0N9/6KpvkwvdjY8us0N4Rz3CWNJ2sF2O9wGNlazdMt2lYBzb99e1ALcVf5ebL6GTr7ULoPXFI5Gq9y7weEs88UQcJYqZvHvnwa+igJ+VO80lHQUiYbTExa/qVeJwQTbEsgOg1Bi3nQ+8RVhn1jxgslUcZUzy1xUX+4hHISrjdmjUqeRIpq0HzVSwt76pU X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: k9grK16W4oSKH+eOX2X9yDJ9SKbO/NCwrzsfvyY6iQKpYVjc05BJAWvI1hP28dWU8ifOrFdS6ffwtSXKIUJMJbn304LZWjulkpyfGEoRtkQXxkklAN3QzC9h7JV7/pbZE5hFXkXWlCXynKSab6Gk/J0CumV/882P6887qo2STfk1suqo6/Zf65O2QaOvrPLo4Ekaqbs+/VpRwIDIDL/gfvrUO9TFvniTPUBuDeK5iCm7Jp50L1vaWS0xFIR4e3RnTb56qe7wRuS5NhIRi9zF9NBg0lip36fJObKXYm5Rf2GxM+lvg4Oc5j31Mtq3qkPuQL+oQP6XGQs6HB4anansSLaY85k8aNrvqGgntj7qGm0QwxTxPTdEIKJ38NIbQOoD3wM/N9kIBhgOr28wk90E39TgVQRGeQdIEKS1/Kdn1hID0xVVcXp5vY6WWcy29ak1GQumBYpUJNippRUsU7YkgkZxHmTkGRcxDQeQ8wNB5+blwWpvKPwOrgHdcGuA4Sc6j8iDVXugFkk/WY5cVpepyK8RM+Smss6fYOGRqjkXt7Ca6uEpNpjd6hqP7hJA0u+Qhwxe/4CKGkMIRlLjtkSGPH+HmLK6pkipUrW2Abb3sX4ATG2o9QVG/hI30pxrwAAYH9iWc+Aly0jaE2AylB3P6WsCyjRqZyWkQg8AKSydnhJsY1FoHzyyaxItANapKERz7lTF3VIKHJ81zUCsPjL/wrlx/zI5k6L2reY3cIInQTFtoYnJQ4hJOU+Yd6AXHwKsW8DHDK0R+6T7DhypU0Zlxhuz+HbMAzyXjF6lyxAtREFRGmwFBlBTSkgUbz+WVouDs0ReXURT3lMQZSWe+d90F0XiGPA6cLjQpaq8SlICSURBxUV++6RVHs+fa0TOokZCBJbEI1ppN4KfWTttnX8BKv/W90KP/g53LfvnhYBVIy3ECyI5AZhc0jILh5bzvha0Zj2GFkbBSx8hZ4W9Jz46eFBq3apQKx6hOVz+yZ2kXcke1tKDDeEpueWdL1Oyby2uMHIyfz9m5edY7rodR/t+CblRzi770lhIgkZnvxYkSOmDFt2yp4fA1KSrmuzHuMiw6bT/mO22/pwHuZeD4ArD4FcB/oyFBQi54mHCfvUZYslE3QCj2vVu9nseadZB3ffP8wazeARztroQ44fHZk9c3oTA6wkQyHzElmnnrkQ7Q4h+0S4sQwnyCwq4i6d/7vF6BtYAJE0/sYnqvZ3rtvU1znNRbThkV2rP7LucDUOfbd8SDeRfyi5h2j01rCvLx5BlO+xXWG5Ip1Q39zzGBXrpOprHiPiMGedls4SsTHOLPAyQvsBFeGiDp/VLIxSevoG7he1bKgVgPGxqSerKGGA0dEFZfpZoZbhnWk1PTROx0LR0JeaW7sYW/qiwueYXAynYmCBrJtyo6MEbDi2dVLeD48xaquL9qLiis7oyt8vzgNGMLikBe2C9hnkFmvo+gd9df9JxeTgmww1smrBMLSXHTf1RJR5eI5OO49uqI54hGit/DjHdgZt+SkBoBftCKEcQfcK+SaZs7vfCaCvraEED1aw1bGs4dZW6+alJekQ5rxvW5WIBAF2xFtoLAH602tdn X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1395bff4-ee5c-4178-187e-08dd64433daa X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:30:11.7878 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vANIbCeOLXRgc8Rf8R9biGsaoCJFZwcO6CiO8zKoFYmGWfhGlu0PHPsQAYGuEO0zQWe1gy/cHb4nqH2CEXstXg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Queue-Id: 6821E40008 X-Rspamd-Server: rspam05 X-Stat-Signature: zjfd6iae77fb7kmx7ptz11bkd66rdtf7 X-HE-Tag: 1742099414-736417 X-HE-Meta: U2FsdGVkX1/HMCuu+vuqLyxEXE+Qfkn3rrcJ9dxWfp6/MRcGlauAi55a+FhWtCas7DXcd/VLzKCUwbRhfVoDsKqeF6iL4zqxTV50jdIAxpuulMEzXaIEdEpfou2x+C/VMNDKovV1ZHgVVHvPFD1wiWYeiKk5QnFVtK/+SjEuOT+lrfnMs51jFTIkAnTA6KoGap7GNVsY96Rgdi+yvK0ur6GjdiPFN/63kf8a42Jrks7tQ5PKM9tMuAvTmFru/O8549ulMacmozTb1t9qX97pOPsUWku4QHQVc55DDr/ATby760zui61shi0Qv1l0QSl+nxTvo4Ya/UzYrBx+Ut3+rBf4ggK69rfl4bY/+95+r2YqqkU/AtI/mJNx6KIvIncXievweL7gGXsaD+dMrKIuYZlAZ8MY8CSITaVSBRJSlwiYlYxMmr46Vvy2ROL2R60H5pQxb6Zqb5n9oGbsCSpsmW05qEwekNzU26KcmoOApBHlSeMjIYwuop67cIb2bre1/g4RyhZnNkOrd1xi0afkqw1Aeu1q/rhOTbu/MWsz+ysdb67JSER8R7C5HsY93dRQEKdgLqYrDUvGo3CsW789v46JRL9KJ4yWnTfOI8WPpM3jYTROMHo6IRe+jeqcZdWimidIr0wvqUhFAyFOrPey0dPc+6jYVoy4cFNcwz4SpGxul30SgDJSMt8RM9Vgl1RpVqZyAlrg+nrvGRBv0WgiU4w05WT49ffyQ3OSxvWUpRH9rOJvbwjK8yBm3IeGUKalQ1inz1MNM/MBNTsUKucp1BfLg/Eut10+LMlq1bT1rxRhofSZ4/8ZHsO/dpTZn+By1CyKa4MDPCel5ceYHz9T6xLLUkAylqWRGiX7WHx8KQv+mBgdmmu8FSgRtLcHmwRphqTTscuSgOF8sTkJkvG/1Bb0blWXXsTcLppd8bCXMvUTKUQGw6o0KUda1YL7uV4LjZquI09JtJe3M0xJoT3 Ppw5GzuO KFAmKAL1Fs9bUlxgFSKkjL5yta1KEpAvUa+ylVdTbNt2AR9GI/RC8CJVOAwB3g924sShu/EWqight9CpGeDIovCDP0JvGSlgmWm6f7zQKv8DOTsr5o2m0Phn4p235+tDTRwT9DTY2b+T4t/8mUbWzwfADbUeUYifVYg4R6aTvjpDkf0bhjtzU64f9DfKpnx2VEpz1SJjvaQuQBV9jtFrai84YMOcdRvhfiV9YqoZ+YyavBAALm+JoidAHWiRMXxZ3/MbM/qzWiDr0TKNaIJgEfZJukC0RbShdRAHaJVqv12WSQSZkHlmCUf7Col81Ek+Y3JY4hSK1/IhH+MTBi/3rgvlmskgLk38swLRZ8dbbIyJJQZa+QJCFQwzQqa7YmbpgnqVU 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 tests of file-backed migration to hmm-tests. Signed-off-by: Alistair Popple --- lib/test_hmm.c | 27 ++- tools/testing/selftests/mm/hmm-tests.c | 252 +++++++++++++++++++++++++- 2 files changed, 277 insertions(+), 2 deletions(-) diff --git a/lib/test_hmm.c b/lib/test_hmm.c index 056f2e4..bd8cd29 100644 --- a/lib/test_hmm.c +++ b/lib/test_hmm.c @@ -979,6 +979,8 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror, mmap_read_lock(mm); for (addr = start; addr < end; addr = next) { + int i, retried = 0; + vma = vma_lookup(mm, addr); if (!vma || !(vma->vm_flags & VM_READ)) { ret = -EINVAL; @@ -987,7 +989,7 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror, next = min(end, addr + (ARRAY_SIZE(src_pfns) << PAGE_SHIFT)); if (next > vma->vm_end) next = vma->vm_end; - +retry: args.vma = vma; args.src = src_pfns; args.dst = dst_pfns; @@ -1004,6 +1006,16 @@ static int dmirror_migrate_to_device(struct dmirror *dmirror, migrate_vma_pages(&args); dmirror_migrate_finalize_and_map(&args, dmirror); migrate_vma_finalize(&args); + + for (i = 0; i < ((next - addr) >> PAGE_SHIFT); i++) { + if (!(src_pfns[i] & MIGRATE_PFN_MIGRATE) + && migrate_pfn_to_page(src_pfns[i]) + && retried++ < 3) { + wait_on_page_writeback( + migrate_pfn_to_page(src_pfns[i])); + goto retry; + } + } } mmap_read_unlock(mm); mmput(mm); @@ -1404,6 +1416,10 @@ static void dmirror_devmem_free(struct page *page) if (rpage != page) __free_page(rpage); + /* Page has been freed so reinitialize these fields */ + ClearPageDirty(page); + folio_clear_swapbacked(page_folio(page)); + mdevice = dmirror_page_to_device(page); spin_lock(&mdevice->lock); @@ -1459,9 +1475,18 @@ static vm_fault_t dmirror_devmem_fault(struct vm_fault *vmf) return 0; } +static int dmirror_devmem_pagecache(struct page *page, struct page *newpage) +{ + set_page_dirty(newpage); + copy_highpage(newpage, BACKING_PAGE(page)); + + return 0; +} + static const struct dev_pagemap_ops dmirror_devmem_ops = { .page_free = dmirror_devmem_free, .migrate_to_ram = dmirror_devmem_fault, + .migrate_to_pagecache = dmirror_devmem_pagecache, }; static int dmirror_device_init(struct dmirror_device *mdevice, int id) diff --git a/tools/testing/selftests/mm/hmm-tests.c b/tools/testing/selftests/mm/hmm-tests.c index 141bf63..4b77edd 100644 --- a/tools/testing/selftests/mm/hmm-tests.c +++ b/tools/testing/selftests/mm/hmm-tests.c @@ -999,6 +999,254 @@ TEST_F(hmm, migrate) } /* + * Migrate file memory to device private memory. + */ +TEST_F(hmm, migrate_file) +{ + struct hmm_buffer *buffer; + unsigned long npages; + unsigned long size; + unsigned long i; + int *ptr; + int ret; + + npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift; + ASSERT_NE(npages, 0); + size = npages << self->page_shift; + + buffer = malloc(sizeof(*buffer)); + ASSERT_NE(buffer, NULL); + + buffer->fd = hmm_create_file(size); + buffer->size = size; + buffer->mirror = malloc(size); + ASSERT_NE(buffer->mirror, NULL); + + buffer->ptr = mmap(NULL, size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + buffer->fd, 0); + ASSERT_NE(buffer->ptr, MAP_FAILED); + + /* Initialize buffer in system memory. */ + for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) + ptr[i] = i; + + /* + * TODO: Migration code should try and clean the pages, but it's not + * working. + */ + fsync(buffer->fd); + + /* Migrate memory to device. */ + ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + /* Check what the device read. */ + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i); + + hmm_buffer_free(buffer); +} + +TEST_F(hmm, migrate_file_fault) +{ + struct hmm_buffer *buffer; + unsigned long npages; + unsigned long size; + unsigned long i; + int *ptr; + int ret; + + npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift; + ASSERT_NE(npages, 0); + size = npages << self->page_shift; + + buffer = malloc(sizeof(*buffer)); + ASSERT_NE(buffer, NULL); + + buffer->fd = hmm_create_file(size); + buffer->size = size; + buffer->mirror = malloc(size); + ASSERT_NE(buffer->mirror, NULL); + + buffer->ptr = mmap(NULL, size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + buffer->fd, 0); + ASSERT_NE(buffer->ptr, MAP_FAILED); + + /* Initialize buffer in system memory. */ + for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) + ptr[i] = i; + + /* + * TODO: Migration code should try and clean the pages, but it's not + * working. + */ + fsync(buffer->fd); + + /* Migrate memory to device. */ + ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + /* Check what the device read. */ + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i); + + /* Fault half the pages back to system memory and check them. */ + for (i = 0, ptr = buffer->ptr; i < size / (2 * sizeof(*ptr)); ++i) + ASSERT_EQ(ptr[i], i); + + /* Migrate memory to the device again. */ + ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + /* Check what the device read. */ + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i); + + hmm_buffer_free(buffer); +} + +TEST_F(hmm, migrate_fault_read_buf) +{ + struct hmm_buffer *buffer; + unsigned long npages; + unsigned long size; + unsigned long i; + int *ptr; + int ret; + + npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift; + ASSERT_NE(npages, 0); + size = npages << self->page_shift; + + buffer = malloc(sizeof(*buffer)); + ASSERT_NE(buffer, NULL); + + buffer->fd = hmm_create_file(size); + buffer->size = size; + buffer->mirror = malloc(size); + ASSERT_NE(buffer->mirror, NULL); + + buffer->ptr = mmap(NULL, size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + buffer->fd, 0); + ASSERT_NE(buffer->ptr, MAP_FAILED); + + /* Initialize buffer in system memory. */ + for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) + ptr[i] = i; + + /* + * TODO: Migration code should try and clean the pages, but it's not + * working. + */ + fsync(buffer->fd); + + /* Migrate memory to device. */ + ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + /* Check what the device read. */ + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i); + + /* Use read and check what we read */ + read(buffer->fd, buffer->mirror, size); + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i); + + hmm_buffer_free(buffer); +} + +TEST_F(hmm, migrate_fault_write_buf) +{ + struct hmm_buffer *buffer; + unsigned long npages; + unsigned long size; + unsigned long i; + int *ptr; + int ret; + + npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift; + ASSERT_NE(npages, 0); + size = npages << self->page_shift; + + buffer = malloc(sizeof(*buffer)); + ASSERT_NE(buffer, NULL); + + buffer->fd = hmm_create_file(size); + buffer->size = size; + buffer->mirror = malloc(size); + ASSERT_NE(buffer->mirror, NULL); + + buffer->ptr = mmap(NULL, size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + buffer->fd, 0); + ASSERT_NE(buffer->ptr, MAP_FAILED); + + /* Initialize buffer in system memory. */ + for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) + ptr[i] = i; + + /* + * TODO: Migration code should try and clean the pages, but it's not + * working. + */ + fsync(buffer->fd); + + /* Migrate memory to device. */ + ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages); + ASSERT_EQ(ret, 0); + ASSERT_EQ(buffer->cpages, npages); + + /* Check what the device read and update to write to the device. */ + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i]++, i); + + /* Write to the buffer from the device */ + ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages); + ASSERT_EQ(ret, 0); + + /* Truncate half the file */ + size >>= 1; + ret = truncate("hmm-test-file", size); + ASSERT_EQ(ret, 0); + + /* Use read and check what we read */ + ret = read(buffer->fd, buffer->mirror, size); + ASSERT_EQ(ret, size); + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i + 1); + + /* Should see the same in the mmap */ + for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], i + 1); + + /* And check we get zeros in the second half */ + size <<= 1; + ret = truncate("hmm-test-file", size); + ASSERT_EQ(ret, 0); + + for (i = 0, ptr = buffer->ptr; i < size / (2*sizeof(*ptr)); ++i) + ASSERT_EQ(ptr[i], i + 1); + + for (i = size/(2*sizeof(*ptr)), ptr = buffer->ptr; + i < size / sizeof(*ptr); ++i) + ASSERT_EQ(ptr[i], 0); + + hmm_buffer_free(buffer); +} + +/* * Migrate anonymous memory to device private memory and fault some of it back * to system memory, then try migrating the resulting mix of system and device * private memory to the device. @@ -1040,8 +1288,10 @@ TEST_F(hmm, migrate_fault) ASSERT_EQ(buffer->cpages, npages); /* Check what the device read. */ - for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) + for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i) { ASSERT_EQ(ptr[i], i); + ptr[i]++; + } /* Fault half the pages back to system memory and check them. */ for (i = 0, ptr = buffer->ptr; i < size / (2 * sizeof(*ptr)); ++i) From patchwork Sun Mar 16 04:29:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 14018334 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 4183BC28B2F for ; Sun, 16 Mar 2025 04:30:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6BC9228000A; Sun, 16 Mar 2025 00:30:20 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 66AC7280008; Sun, 16 Mar 2025 00:30:20 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4991328000A; Sun, 16 Mar 2025 00:30:20 -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 22E1B280008 for ; Sun, 16 Mar 2025 00:30:20 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 402B1160600 for ; Sun, 16 Mar 2025 04:30:21 +0000 (UTC) X-FDA: 83226137442.20.3AC0754 Received: from NAM04-MW2-obe.outbound.protection.outlook.com (mail-mw2nam04on2049.outbound.protection.outlook.com [40.107.101.49]) by imf20.hostedemail.com (Postfix) with ESMTP id 46C001C0002 for ; Sun, 16 Mar 2025 04:30:18 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=TNsLOfxU; spf=pass (imf20.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.49 as permitted sender) smtp.mailfrom=apopple@nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1742099418; 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=RDkIWDdnH4drh8UepiLUBz1wE+6cm+QfrkBbplMcEWg=; b=gxIZ6b4DuekWT2lT7tc+SDdDIChGWlw4k7uVdKXSxkUPFz0qHJQPnCwbcHSt+oXhIwHSlf f3UVKeQHlU6trBTCVBj/3HEACklMK8e6vo5mTO2WnnK1Pewauro4GnVF2ldxHzY0Z9wiD4 no0bO96gob0Wbjd7OPGzJb0DPzUu9UU= ARC-Authentication-Results: i=2; imf20.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=TNsLOfxU; spf=pass (imf20.hostedemail.com: domain of apopple@nvidia.com designates 40.107.101.49 as permitted sender) smtp.mailfrom=apopple@nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1"); dmarc=pass (policy=reject) header.from=nvidia.com ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1742099418; a=rsa-sha256; cv=pass; b=jI6auu22zJfY7VUJNFXD1D65OPVA+b4HYRscDLIn/TlcIyhNQcJtcAr5KH6S7rwsHJHjsN 0xdRSGCwXbuJFi5qbEJ0kP0P1ph5ZvY4g6Jg/pgbUEcVxhOHtfY2N3kIUuYex6GGbfv/k4 0+vU93ZfTtT2pbyjLp7lxcNHBm+vSt8= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rBo3+onBNBTG7rUzIdMFMVJeG+YCP0Unb2jWesCz3mtsM0tQOOCBbPxgjB4oUWtr61V6kvm/FhodgIituP529P/egQY0i2qMFQe+ipckIX9RwBfGwPRQDTHnf1O1yMtwitp7rL/ZPTmpyvYSGtsmOGP8QxYu8HcyvkekcjQ39y2ldWY2kewrsuXpSrKd/3hUMAhl3Sqb1RkL9WuTwjzGrJ9nMDNtAy1lVcsXyqYFicHgHPGrcJeOdBJF+icA9BrHX8WRYGtxpmhFayTGQF5FTw2orB5Y2Pj1VxXgyLoSMEwrOV0wTC1CWIGxXISbhdHpeKHN8+hNPDbU5VWAMR6Keg== 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=RDkIWDdnH4drh8UepiLUBz1wE+6cm+QfrkBbplMcEWg=; b=llCqIVgUV0nxHObatFHgpP5xuCtOBkg8eokmeFDBHAihFO5ljXzCbVMCUP66svp/YWhlLhXQLTMOmQm6r7jb98hT6ViunTcYLVTbqGg5rHYJajeI7B9cLUmq3nJl4mW2bCGy3+x7tsVX6UKtnCA0mWR/7oTUZ1PsKCseugg+w8/Nh2EYEq9TCI99Me3rqYCAwvHtikkQGXgkmyRLXHIy80nKFmF78vOipZQaZLkYL9AhWb7zfx8mPmpHxVO/p+PTV0YLzPlY7mvBFVbIUG4uXJIyNI86075YkzKsaCLyme7wpSgwn+6TvVa9lSAAM3h5Kdtx10/f4lknKjJmGxWXHA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RDkIWDdnH4drh8UepiLUBz1wE+6cm+QfrkBbplMcEWg=; b=TNsLOfxUD+BRzssiWquZn1tNs4AyhG+gTM3Ta0US+IQE4xarIn0rikji3rYjqOn8KEe/BFktL3tJS9UKwe1hZs+W2/lBgPHFZrssmAbDJii7Z1q2IBNYUKTmMPVP/NtGwPKG60w2NRFN5OsAw0eAicPrm1MEvWLF62lQbyGM8r15mrsL3jWeh/mFO43KvdzGtKysEFjEbkjFQ98SNV6G9paywNy2VcPD/iLZ1lhnug+6/6xBb8PuBwxVcPWrGLNSiUg4N9ppru7e/o/XkuB8QIUdTjBaekE+nbE9LeAMQCpNueMB+FwUvMPu2Z5GHwyhtF61sKLEWoFLq5r0ECWXng== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by LV3PR12MB9260.namprd12.prod.outlook.com (2603:10b6:408:1b4::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8534.33; Sun, 16 Mar 2025 04:30:15 +0000 Received: from DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe]) by DS0PR12MB7726.namprd12.prod.outlook.com ([fe80::953f:2f80:90c5:67fe%7]) with mapi id 15.20.8511.031; Sun, 16 Mar 2025 04:30:15 +0000 From: Alistair Popple To: linux-mm@kvack.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Alistair Popple Subject: [PATCH RFC 6/6] nouveau: Add SVM support for migrating file-backed pages to the GPU Date: Sun, 16 Mar 2025 15:29:29 +1100 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5P300CA0019.AUSP300.PROD.OUTLOOK.COM (2603:10c6:10:1ff::11) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|LV3PR12MB9260:EE_ X-MS-Office365-Filtering-Correlation-Id: 019146e4-27ea-4314-ed08-08dd6443401c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|366016; X-Microsoft-Antispam-Message-Info: tHVe8scBJ6g3yb00fTlKRJjS3dQoydpfi1oIlyTwhGu3j+kqtHb9TGJU3w5WAUmVm6/cXdojntrCpUa+onLAmUzBql7LW2EPnZYhdhGIBdcGvkzznJxGCAKcGc1iaCAcpmpbLmSyR0aZiMdnS4LBFa+4QQnEEaWTehuKkCR0CRVCHPCgI3qtij5REgGWID3ocH8VoZt2xn2+JBCKbC/uGDGeQvVs+u0Or/I3isRkfdeQonJmPf099/jxIIKLXvxamg70sC601iQBThJD2y/MkuWa8xr0ek1M63IXOdeg/fAaegx1WpMo/vn+tOM1Phyng6m1aQ4VwDgBDihkmHr9za9j/AktzYYBza9hgbo1ll1Xdrvu9li9p0ZJXLbz2wFezVuq23wo/84rKFLTuGAThgChcIFTWNYBbuKRL2k38EKi55XhWcl0avxvFqeN3fcq1SzZkUXXCIBgJOSQg44fgC6+4N3zzH2Dtst3l3xmDomaQorNgtDOdsvqNJQtinxFgXpVcGrmulZhOxW7s6TXDKK5HO6iLWhcaJSwU1tEGguqLk5yD3D/c3sjYkAuXujUwBAlqpsGu8YpiybrkhlzAJUslA00RH2xVxpHI5B3+HEZQhfHGBB260tiChX/8obAq+JJk+KG4i1nyN0kO9jPVwCraKGzzUpHaReFzfMKD4oJdrvmwR3kbGwH8WseQKdfKY9CygkGD26/lIsEFnv1wXPrjV2yKklvmcpzq0ltNuBbQ7hbDTWCJ8OzRTjXojII3WXqkiAdIjaqsRTA3Xjo8pCymxhL+jh5+6T5nItJNuFkKtR51ubtLvgvNJz1qVskHOnTUFKao2V5UUD8DqCkQwgMohaLvmvWOV+tw6jFM/WVg5LT0vIgHHZwnftZ1qjye0xND6GLiHZcOEONIahrNC9AUNYDiNvCK7sLf8AU/REo5Vqe24H90l8XkzDrp1bs7+kPHnRHKs7n1LLk5FlOvHVUGtWJMABonnBibxCl7g31lI9z7CAZ1+8lm7M7YwO77NFyPuk6O6IKX1x6ZUe985ku3c1jYk6ETlJPD3xx8Yx4cZymuvKECTh7JtCS8VteWAblD5/Di2TNK+2NAoIzAKIvKc9g/3RrCX6kXRUaxEuDNxEMT/ZFz0lezcyU/xPfGB0XpXOdVXHwmscD2yo5CWCIY/I/scPt7ZUxXElifLX9Eo27gIlNmbr5EHM9+Rqvj/Qe9/rSTszjvS5vioBc4/tkQ1yJ/aqzNWtFCh97IoyNc+i3VCuxju8wzSiX1GNc3p/+YNINOfzYIUhhHimEcaSzT4+aju2M14fA/Kv0ERLfHXJP2wNMVL+GrtlUP4dt2mwRoEKHjcIhqVNlE3iuVeVrxfl9juB2TeylHh5dvgtPB8N9A6BCEJ+Wjnv0l8WU X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DS0PR12MB7726.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: tzpDAJjaOHymwU3HJJr1dyCJd72SFoGiyGDbuNJfWgfnCZbGDLFa4ch6Kckm7NqPdQNbe/vjHoGEEsr2W9oaf0W+SS1JAHcZjiQOx4bTA0xxOSgVFRdZFlSV8NM3rJedIzu9eygJ596L6VS4DS7n0mjYVLefWvTy5XnBNfhdUkLXWhYcvfVh+sEwJTOZgI9JW9V+M3UNMWPQqKCxlOEqVcSTXo9KoEPEzeqBXbaWmxNMcXORBBxSV2AySPgw0erenRi7CiOHaslYOQhD+zBtLSY+/I0x+kT/W8DTKqYzdlgZ6wN1I2r5F+kRGFCrXQvwLBi3r0+KKyGfcMtPx0Oz4nxRn2dEVcsWwp+8nx+krb4c7TLtds9yAlPUx7DWp7nm17MnlUZW76L5cZUEu0LWMBLg1rfWtOSuVvO1qULQWMDqT6Y9qQcMzHJoRTvgnWkf3yRXr7LOUCzGPjd+bA2EoSQctvH8hD3O9uhL4OwYlXs9VblmMvmymnJRRBXGnvgj6CWXySRq/7bPJ/+whMOEcNqpd5WDBnOkg43AYF/V0GTcBcFSJ5ldUutlB+IB7gnCJDgoL/g8aYqg+JeWq0hQAROQy77G50OOx46moXRMKHokKIG5RlYmrKd4q3yq2SetzQo7zMeTdXVD0HTV7l7qy+gYHPP2Rfw/2qvoOg03d2l967zRgdCMahNb1lZDokht2KniHW20Mryhl5a8VN8Xp0jP+dYvQu+/m5l/8qow4b69s4ypM4ACwrHHh9CZ5upIVFTiLlcSvLxsBfe1Uh+9lMW70sjrPt/MNbwRa8qIXl9e3H6NlF202d73dCOoEEmILpfpON8RxIpYRYNMqhh3DG1OJ1uEgAUzUKWl90fVXZ9H/g+ZOsYqscetTMrCBlEjqUKOaCoPbCcUuWS5sOFVAP7IssQQ9R5lUEornrk92CzEkEP4JnQl8ywu+sz5/Ij/xZjXXDsI37bzvZqyoMCj/paBEq3DWZHf8c6vLPeRNjEEDybOAXpZo6xZbusXa6GzgbR+bO9rsta4oVlBCX93wDCW3+8FdC4GZRDgUJoIR1rvcWsllzrac2r8YNiVt+pdJhsZbDLkd1HRJIoNuTKFKdgDWiByYaB2jtUb8bIqunYhYwB0KMBcHyAOoX5czS+UJRrGclyueK43aP8F32NNAhgf4XM0YyV0OTXiGGhDQ+YlWpoHIcqrMBHlS6y1aiLCmXCm/MkVuxn1yuGGvpDWMMHjwd5Pe7VEozthRkuw8jsMhb7+RoIf7QgI5wCbRU1YsRJgrU2pJeLMu0N8MNDKxYtJsl/dXIl/QPdw25ZV1j92yzGwfoCCrTt6OsmhcU7Opdxh+VfcZqZJAtlyuoSywTfFkhtxC/IWrggpum4haNpq/6bIcenGSRgN7p3cVOcjM2FidITD9GTExRQfShfc1dPeiUk7muqw2OAC1VqTizYZ0dBJQdwdy+qgypxFCajeEsjtiFQ573UbRBXskJhqn2NLJ74sfPz6fRLEyXBH8qZ1ntDFl0TTE6DZCrnVW52tVId2/49rtFbPpUO2Qqe0ufjkpOXtE2uzrpVNTUnZkO0HuklWXs4G6fhm5lfR2aPx X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 019146e4-27ea-4314-ed08-08dd6443401c X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Mar 2025 04:30:15.8840 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Qtnb9QJ3zI2b0wBJzD0/uvfokdoYLRUSlerU2hIkRMY3jtK8kRD43TjbsabEcIhVv8Md5w1idXIjRyVWn0c26g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9260 X-Rspam-User: X-Rspamd-Queue-Id: 46C001C0002 X-Rspamd-Server: rspam08 X-Stat-Signature: gywqcdoaxq361strhrzwtzxtqactf1uk X-HE-Tag: 1742099418-14628 X-HE-Meta: U2FsdGVkX1/zphDf/jytVDcLr0Orgi+zExbBH163l40p0PQhXtrrFgmFBOC6kyxWbvtvpMK2PtSmpfWgyo5K0sshJ//dt9D0LvS5Q4DWEWsddvnyo17QUcYnNJPXINyR6x+UYevDQrLWu9O7du+f1aas5Oq6OpvC273XPS/J6B1QFdFjY4myMtSq2I9sD91STuOZxoh/newAvv8OYrLbeuSkI4qRpaA0nJe/obd6oVjm2nl8VN6hWtiyOuhiMQzokWoW+pT+IfsQZ94e0qs7uPWSrNrVU4pgzNsfkMPu0mT8MsB+3KngR/M6efMV7ZICW458hbrRbWyEnuTO7EbqsWFOQdaOLeJTOZtCQtSDKsNwRpcHGM14J3Q73JBIRJtLnPwhAMQP8BupuKtxeNx9myZiqzcp7ty8uU7uDieUrSjFQ1WqcoPVfng/Lz7xQE/VfOGKLRo2MT11urW/sL1eFNAdoTZLRiJMoBdi8ZkgW7//pCgD8H/j5VtV26ieEUQBiCtQhgc0eD+jgAdRs0OJokJf8+h8HzsFhWAnCE8GVGqkuh52HWUGDChgDtyx2vcnsK+4s9RrmGxl/iSId7X6LelIgbV+qBgkE7V6l9IcwRqpJoFOCrOB4BmT738w9FbBm48N+G/ZESu10hPDTaRPDCEY/0UpmcrLrR7+OudP+uJ2zNJkFfIwW2WJjwfy75FaRTNAq74cJDc71Lo5dQUMArYp93YSW9fRst19d+NYKWJrLx4+v3cJDGH+0lgzyiAzd5l3zqfILDfnKYFMZ1fovNvlH5oXMtR1IaPh/LI5PuqJExEY9JwKkuPkyEyPSojmdYYxz/C2fGBVnm9bSSHtTdHSk5XhKG2k9xB8oblY42gwqYEoab3HSWsAwbLj74Vos6E/rjnVtfmrhCzt99ZJR+xsxx5kxF5rVvR/gLLwrQPGgnR0S5oNlRtLDRB6JjRYjOeJ47KvMikDe878Hj4 VreL5H37 o9BoFrIs0UeUpDhn7q0lvpOb1GtMoDWq6U9Er/N/6+n0sGY0UFCp+W+pAr1SlGtMqlARQeqCBjr0pD+Zwyd8K8UmPquRAlHfKcRDBlzq9z2BZ01gKO1sUzG/vdXxlhtBbLTrhs19Vi/0p2vHb0N7yChJZfOITSEUDwt+DcYmAKMhh6GxyGWZVSIiL0ZXb1dVs3ULq7IARx0mx2jdxWo8P/doeIyyrD3pWz5zAtynKSA2CHa/RuGi1pLD7+eP0R+vkMD5Z8PnX82aYv/A7jAW2Zm+pHP2Pn8cMx36L4KOyiI+SGtbb/U6wHhn4VJX5wk8cNmvrNZ27X+rsCmGZWRazQV9fxwMYMwJC+bzp2w5oWIVXw0BCPDhx5BoWNhjpaw7hjR0N 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: Currently SVM for Nouveau only allows private anonymous memory to be migrated to the GPU. Add support for migrating file-backed pages by implementing the new migrate_to_pagecache() callback to copy pages back as required. Signed-off-by: Alistair Popple --- drivers/gpu/drm/nouveau/nouveau_dmem.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nouveau/nouveau_dmem.c index 1a07256..f9a5103 100644 --- a/drivers/gpu/drm/nouveau/nouveau_dmem.c +++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c @@ -218,9 +218,33 @@ static vm_fault_t nouveau_dmem_migrate_to_ram(struct vm_fault *vmf) return ret; } +static int nouveau_dmem_migrate_to_pagecache(struct page *page, + struct page *newpage) +{ + struct nouveau_drm *drm = page_to_drm(page); + struct nouveau_dmem *dmem = drm->dmem; + dma_addr_t dma_addr = 0; + struct nouveau_svmm *svmm; + struct nouveau_fence *fence; + + set_page_dirty(newpage); + svmm = page->zone_device_data; + mutex_lock(&svmm->mutex); + + /* TODO: Error handling */ + WARN_ON_ONCE(nouveau_dmem_copy_one(drm, page, newpage, &dma_addr)); + mutex_unlock(&svmm->mutex); + nouveau_fence_new(&fence, dmem->migrate.chan); + nouveau_dmem_fence_done(&fence); + dma_unmap_page(drm->dev->dev, dma_addr, PAGE_SIZE, DMA_BIDIRECTIONAL); + + return 0; +} + static const struct dev_pagemap_ops nouveau_dmem_pagemap_ops = { .page_free = nouveau_dmem_page_free, .migrate_to_ram = nouveau_dmem_migrate_to_ram, + .migrate_to_pagecache = nouveau_dmem_migrate_to_pagecache, }; static int