From patchwork Tue Feb 4 22:48:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 13960106 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 E67FDC02193 for ; Tue, 4 Feb 2025 22:53:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 788A46B0098; Tue, 4 Feb 2025 17:53:41 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 71104280001; Tue, 4 Feb 2025 17:53:41 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F0046B009E; Tue, 4 Feb 2025 17:53:41 -0500 (EST) 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 2E3056B0098 for ; Tue, 4 Feb 2025 17:53:41 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id C5A371202AE for ; Tue, 4 Feb 2025 22:53:40 +0000 (UTC) X-FDA: 83083765800.21.C0AF2D2 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (mail-mw2nam12on2054.outbound.protection.outlook.com [40.107.244.54]) by imf09.hostedemail.com (Postfix) with ESMTP id E775014000B for ; Tue, 4 Feb 2025 22:53:37 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=e8e6jfOJ; spf=pass (imf09.hostedemail.com: domain of apopple@nvidia.com designates 40.107.244.54 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=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=1738709618; 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=GBSbgn8RrnR9Ey8m0wS0VZAwZBcX1gA2gBrbdayc+ls=; b=ZVVZpyCSyMpbYENXizUPrG6VAKNaK+fkEvaztowWCwUVJbmajIOfO4meWw+vT39olJP35R iDkFyFQI5uHgnM/HyKAQRgJPBvpRn3A3wLDIb4Geqmp6ut8pNmHPV/glKhLMFbelN30EQ0 SvxjfbYdTiy9WwH9dCcPU9Di+dcLlZI= ARC-Authentication-Results: i=2; imf09.hostedemail.com; dkim=pass header.d=Nvidia.com header.s=selector2 header.b=e8e6jfOJ; spf=pass (imf09.hostedemail.com: domain of apopple@nvidia.com designates 40.107.244.54 as permitted sender) smtp.mailfrom=apopple@nvidia.com; dmarc=pass (policy=reject) header.from=nvidia.com; arc=pass ("microsoft.com:s=arcselector10001:i=1") ARC-Seal: i=2; s=arc-20220608; d=hostedemail.com; t=1738709618; a=rsa-sha256; cv=pass; b=5D9e6CmxivPTB4XS/g9GtX08cHnlDZsiEQsINBXmaqgs2YCZThPoWrrRFvsW4kUr/cZYwx r60F787ue7XYReadSzD9/6vJTfxe/1KJHmoADX4ijxADfSeUr2pgyfHFVE8JhFl3ba4hDU iso0yIrt5LM1RmF7XdDrtSlsBBXghQw= ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WyrPJ54kAFnl3WrPpZKUiXqUCDeFFobRVjbuTq8yT4B/vaDIByY6cTu4AbRoThgFqyCH3jRjFAesJJYyfTHx6lhfHZfE784dSIW+LLeem9y1vsAzUvYj024gbCHer068aNaBpWb/wGaBreIgF6dJS++NfBmbBLcHi5WWUjLiJ4FApoEr3HtfaGnDXwFQV/H83ymzeVQqjYWqosX1TlutY1WfiCZF4LrtZmLWRbKS6pbFFsUt/cYHNAY/frMZJq+yeN4+wTuVMpUh4Y0bKqXKxTWh1O2s9x4gqFQ7MxonmJrQUCumAU2Jfx4KYEBOT6AVFJOBEO31umsSZhVvkGSWig== 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=GBSbgn8RrnR9Ey8m0wS0VZAwZBcX1gA2gBrbdayc+ls=; b=ku7JMOxdSrhhTYk5rClQL1VF+cPFcrK80v/EDiV4io2bGyMWM4UQCRZxzkmTs3CvXS4TbfaeAHHt1DaF2aZ3JVIMB1dFAWx/ojgZhmUvon10sNc7otJC1aukgQ3BgSSXUISIQ53AXSo5J94YAKa1ba3J8bdcz3P2oB5McmwMuzElgonsJ1vt8yfiL7Tvt5CNrkLmdPTusB/JILF2ZCZ14n0llQ2vkdf7l3nhrioACffU76fj3W8Bc2oaYzyDQR8i5ZHt+9d+D4kYf3HXMLFscI2PYLRzVfxLRGPqV1pR/8GG9jDb7BzLi3D9Lq5RWp/zC3tKH0RKAQAxCQVTCG4U1w== 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=GBSbgn8RrnR9Ey8m0wS0VZAwZBcX1gA2gBrbdayc+ls=; b=e8e6jfOJL/BHqouzgeq/SjWa2wPMcA9BYDsJyo6HiNsM0O7RMwIcQjVMVejV13DopIXofXWwfig7egKlqserXYb49aegVQpUscW2niTeAGg6YJ7oE3PH6yS4sw2jKH5d7GJNGxNUyLa7ajm2cpJdjmwymsTLgEruA2TzhcwuRt24SEVL5bN/hZysuPSYd8PeX43ooeNt/DWftjNlhhs/AI/OFV8xTnF3it3y84gTNZ67JXmzTgD/laDe1V4aKgxHukKkDp8ZcqItivkgejkaTrO6CXF6m7UP5UfJu1HSiKaRkFwSGh6RsthscvVq/5VnSei2ZwX0JuAiD7pt8Q1HBg== Received: from DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) by IA1PR12MB8537.namprd12.prod.outlook.com (2603:10b6:208:453::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8398.22; Tue, 4 Feb 2025 22:49:05 +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.8398.025; Tue, 4 Feb 2025 22:49:05 +0000 From: Alistair Popple To: akpm@linux-foundation.org, dan.j.williams@intel.com, linux-mm@kvack.org Cc: Alistair Popple , Alison Schofield , lina@asahilina.net, zhang.lyra@gmail.com, gerald.schaefer@linux.ibm.com, vishal.l.verma@intel.com, dave.jiang@intel.com, logang@deltatee.com, bhelgaas@google.com, jack@suse.cz, jgg@ziepe.ca, catalin.marinas@arm.com, will@kernel.org, mpe@ellerman.id.au, npiggin@gmail.com, dave.hansen@linux.intel.com, ira.weiny@intel.com, willy@infradead.org, djwong@kernel.org, tytso@mit.edu, linmiaohe@huawei.com, david@redhat.com, peterx@redhat.com, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, nvdimm@lists.linux.dev, linux-cxl@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, linux-xfs@vger.kernel.org, jhubbard@nvidia.com, hch@lst.de, david@fromorbit.com, chenhuacai@kernel.org, kernel@xen0n.name, loongarch@lists.linux.dev Subject: [PATCH v7 06/20] fs/dax: Always remove DAX page-cache entries when breaking layouts Date: Wed, 5 Feb 2025 09:48:03 +1100 Message-ID: X-Mailer: git-send-email 2.45.2 In-Reply-To: References: X-ClientProxiedBy: SY5PR01CA0004.ausprd01.prod.outlook.com (2603:10c6:10:1fa::8) To DS0PR12MB7726.namprd12.prod.outlook.com (2603:10b6:8:130::6) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS0PR12MB7726:EE_|IA1PR12MB8537:EE_ X-MS-Office365-Filtering-Correlation-Id: 48fc2c59-edf6-4b58-c23c-08dd456e209f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|366016|376014|1800799024; X-Microsoft-Antispam-Message-Info: jD/xootGSsIm9+Wf0xYFz06h/Z746pCd/GnfjJ8XLR1IBtk8POE8w6Xh3wyiRVEpJfQ+61UASz7oDI39zjSpg8qERlHdTh2GoWWRggYqgCEjTLfrRxL2NA/keOva1R0obTj6BzoUpPizdtb5eZWmXHRTYUrpAWUpmzfl2elPBMKS2WKx3Bzlq2cvjWWM6HdQstoWDT7Xld7ALs8ld9jEahFvSIKG+jZljabc3Jmw5ez7MUlIx9wrVdr9abwcBW4MqY0PsjzcMDyULFsX7cAvOVikgL303tijaoKdZ51MxdzhlnB5+SaoOgFgHXyDzkhRBuIAecHXS6J1sBzM4Mw5T1Q5ST9yYDdXTsInHQEsN1Rt1Bic7fmYlQxhJ3TKWlwXLAkQhDJUvOGahvjmrfpB4gUrK9G9vJ2bLwNB6/hLRlA4EJnyrBc+6tZ1S7kZPefvyV6We5IpPx1FDuUAHgvBZPZ3KaSvH34i29CT/rK0qgkzRrMXwiLF5Q+7x5Thhxrb9F/npq+8ALFtxCM6VV4VWYb8LHx0JAVvxAKevP1O1HI+RVNRj6P5lef/bLpZitXh01FDk3YD6df1/G+OZmCqWamhNKnWajDtnGK5D63UXLDQiQQlCxDdButm4sDxJVWvzmZFS/WcZ0piRtV4Fvz1ST4b12SINHSfkMRBzncT9nb9349U/N0LdBWbIJVI8jmkZQtQ6BoJW2xqINaST5l/i7xFvcK/ZZT1LPwwulJu6uowp4mwocdnTHzHQVVTIeStLSNw8kz1k988dziJIrDFWu6WRaKZ8LNaGU8/ZORVzmYyMrbFk6wws1U3UvjgPj/okA4/mGZyHYh8MqV96YSavOomCx5eYxEmI9XmY3qMi+jI3vObGHcgyMds5AfpY3TkyDIoV4qD5KjVJJsH4glQbTZ7pQyBN//Kje1Z7JTnjf0axjBDGw6dSY6DTld4NG5qkD+hmq0b4NSuBzqyr2WQMdL0U29xmJdNl2K+EMKy/clhdG7lSZKphprPO9jhrrTfnpUPKKzvwViGrDGib84l0uRaEoRjRyZQ+wqqeyVH3gbSk5V7J7Rf12Q1A1+yM6ymD9yAwEUrnAHiaZQcnZo+fMx89McIOtZq+J2OsnphGI2cs57XMEA/qzUZKpGWTxCgpQik4Tq0XU35E4PI1cTuZKcRGtxpR4/bYfj3SmeZU5xaeaP1AxoYVpdhpwCFCTbeAhEWQFwXxUOuDeNuyWdSn+SI81yLGkk4wfGqiZGvOMjjqfvuV0rdBJonnC9bzeB7cKFvwFqNbPcz0EEdiGrjYbFK5hglol+XRmy2pOBUEVkbU4DfvJeNXVmdn8ZgkvDZzVVaQcbJZK1EmfvZ4HQOmMTONuZwVc1+5KjjoFkRGUYqcLjIuhLjGW++SKHHXhUO 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)(7416014)(366016)(376014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: EXENT2OeBHOpyLuHqJHw5CNHH1Joi6g7znrm1C4BBBes2nd0QUKeOtCsoy8Oh4R76Kz5ovJ0YWIQ8QgMkgpFiAHnauJkw1bYFTBex8+64UjNkier5b+X5kfOFrwWxn0K6YoqGpkOT2kBuGpXbx3UBjJ8E3HIN0srBUJ6HsBr379bmu7VVyEH8rztEMJsfK0rTKsC/Ww9a/XjN2lozJwG3rCi3YYz6agFNUVohSOkUSG0RPHXptJROJJ1+EFh4lYFXCapUBX+acf1/KWAP6ukdFtpwWaNgqG7XFGk+KyAzOzr8ONQXb7QeAKvBuuKpb5xMcOl1bd/PFNgTnSl4QQWCrdfUYrlplFBLGtL3wmodVHnTmsdZFkWWrCxe+BamBGK4+Hy9f/A4DryPB8N3cCEbvWc6pe3FVHzYJNge9Ixp09DDVz8HELmEdXwfELp+KIwg/TveVyumMijc5+5JAEwIUQYxJnZV5V3mqYVq3LxMxV6zzQUEec0VmRZSWOkN04c5N41bAccoeRG5l93m3sOigr2XbtF8U4nJncgpgddBlUp3HIrXEli8gRn45UK5pU0FkkznSx3eUdbQ2yUm6m/TuzfnptkmvsPI2axDJ3azaqbsfqL975DEAkHsQqe/PxehascBnFwnBh9hVHKy4GjCtUwhkDPgY6VkQyrdjvxcamzED4owLOLU+b69O2Zqf3xdGmtfJgUnN4rap2WSauRbogdr4pvLaRwdr5ZLwdRKhHP6NgqsLWg2Ysl0GvnKdDvUqObrxC8i84spNuC/rcJNorsylxTb79AKH4PbA7xPJLr90Kar9eGEyBmqdpLL6TJ20B3T9fr0s+zt60d8zbtIaijcuV6+x8T+qO2BWEis1F/HSN6gDlavhUvsIHWH0ZDfnve3w5M+kD2pWH1gp9XkuRYBXtfMTz4zbqIkaxARrIACDULt5tJUuid7Ddv7A5sRxmny4zrSsnN/6m+kEO7YYlIctsKH61CYD+8XhNS26VIJUF8oubBkqEBfhtcuqBDCjbu6kz/xzP27NAO6uhiyGNLRByJCcUbPCAgDFx6IXrfyw4eatjBS9qIvoIBTaOSXqIi5V2NftzibPbIkhAR0nFVR3wr39geUNoAQ/MGDDr83x3geaEsbAjtgEJGEcUbJuKjrKkT761BFabMXLYXXruTOJVPbCQwzGmqFI8UfrmUGWybP5GP0H6sVcLtxX30QNRAZnNJmk6IkSkQbpPr5lVKnCIL2akVIWsIx0CeQw+5xDaa/llipaMbvDAC1DHV6HkteCbGaPp3HCU3ktKIeVC/oqjXE6mhEBE8UfLbC1ZnJWvrYKm6i4P7CrUTuW/3a2+jCRhJXmRIlIfy8B6K8lkhJHdTVeEbDt8oX5gj+/UDqhKGWDadXvsoJU+SAYcG0m3DgBBr5OxM+EJBRk/gbz69AD9x3xuU3FrChnTwhDcfHAREmUT2iLBp4r3xw5lmID9zEKoJ2H/VYT+Pb+CSkqof7bEJEp+iWQt8VQTHwkB1q9LGnzeIktPP/FgDMFGHQWN4q9lWMp7bBH8ZGlFEpdhd39SgxEP5+fJNpRpc3FHBCU4cdQnbMAlnlgVbKi2L X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 48fc2c59-edf6-4b58-c23c-08dd456e209f X-MS-Exchange-CrossTenant-AuthSource: DS0PR12MB7726.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Feb 2025 22:49:05.5680 (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: xT5YKdS5KwE19F3TVU42gxgzMylW2iucPWGbUPhG2Mx1LBfTjtLSoki4vVFQG2x6Cs37cTa+Rezo1R0THxhDOg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB8537 X-Rspamd-Queue-Id: E775014000B X-Stat-Signature: qcs59yomhyit6s66zyd9r9g6x5bbmbgo X-Rspamd-Server: rspam08 X-Rspam-User: X-HE-Tag: 1738709617-293591 X-HE-Meta: U2FsdGVkX1/n+kd8yoUtZeZKC9eVPaRAm/bsHITchnO6+VVHr1FPf/NzB/ddswQArg3HUveyD0AuqD7D6ANENdGjTTQkiIZ+BBEqdB5THP6dCyMtdYtuXYmKNCKK22zhxArHuEGqpJ3+bqXPbLer2EPNdDXqbRXCVwPGkfi+jsUb03kO+0Kag6mnZtMA1+OyN7oyTm6gw2z7tXcB3dzzo9oYjk4CHlIH2zUxMn+rZoh2lQct1vM5Aj4Obp73AyYNDynMWG4ko1ugdag9I3b5SXQXe4Pv+fnVVAozugc1GaSiirxvtDy3fStBLa/4Egr4FK+9g7E3D2kaQgfQNRRRzfF/Lk0dQf+CXBkpEL/AX5J0g6Vv7dRiU7qASaoJ6+l7kDswLpgjuk5LZzkq+7jCIPCHP4MxHspqD55SDpibPAzapH+G5rleuHMHQ+U4h8lbsIDTkBRJKYUZGWL2z2NIA5pHSBjmFCZCdL1RS2L0yobmMp35FOCN0KSWG0NE0TM5nL4pExAPKIWVq1vzlFRic/CabqhieeR8nddp5N2Qs/IssWMXoenwzaDgS6R92MRr5XA7WSqnvSD3W00yp/r4TnjdWTKBoQqzBZSnqNIalCedlclyd3u9oMkUq8VV5pRWSstxirh0tCL5qsVqMyw1ALTdOHvYqpomLve/diTXcxykmmaHFBGVKHjHuO4wkyju3dl4b9AKHJOnZQqAldsm9Xg1dfWQtG1WQafmVEo/osOiV6sP1g4qBvN9QEhu6G4DVik12TGaS6HJhqK6o/LUTZG4OPUXpeO+5Jl5ZcrigWr2GyXn3cUsr+NNS51RvP5X0xUTdNpdRKOFjnozqCe9h8iI0Mye5lRgnUaZNG6BGAu6wTYxn6Rk0PEI2Z1LfvJSKZFEKRM0bMfyYOic626KeUjX5cMfk0Yqtaca1EaCc/tKibmmX2/hjsU6ktXhHzv0ibbyGWY6HURypY95ulc J9e7VpjW A83M9Faojr5ap96NbRnL334yR2JXWg/FJcIKYPhRB8a8uCTDJpYk9S4LAFs1sN4WQ3aVpewRauT1zdKVmVuocycFmGhp3HG9/SekMn37ZOAXqR5bvyDfS079SEopXRwuhVO11+kD+7deMIZpx5JYxVeGa5fBo7NQbADPWBP6D7xAuAyhF2rdL/uOQDmG5B2jfW6zVZfmOJA3Kxvr7EMRXvVmoCQcaRBKf+OVCA7DM4HLiwNGqXeCglMPjAjOo3L75JNh+ByPPdwzY+4/MFQgweLYCBW5QBhuYHfwE3KJGEh0TxaY7PYUVdW83FYy456aq7+Nre4jjvjwsLyPuGahhGeFLFJ00EsVVGTNhQ0fI48sWkyjsZHLduYS2YsIZCrwcXsCX+RPvJK1/f9uUboJjD4f2u4emgAbCGJwmUAoUkNiK4D5k6tjxDzulqQ== 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: Prior to any truncation operations file systems call dax_break_mapping() to ensure pages in the range are not under going DMA. Later DAX page-cache entries will be removed by truncate_folio_batch_exceptionals() in the generic page-cache code. However this makes it possible for folios to be removed from the page-cache even though they are still DMA busy if the file-system hasn't called dax_break_mapping(). It also means they can never be waited on in future because FS DAX will lose track of them once the page-cache entry has been deleted. Instead it is better to delete the FS DAX entry when the file-system calls dax_break_mapping() as part of it's truncate operation. This ensures only idle pages can be removed from the FS DAX page-cache and makes it easy to detect if a file-system hasn't called dax_break_mapping() prior to a truncate operation. Signed-off-by: Alistair Popple Reviewed-by: Dan Williams --- Changes for v7: - s/dax_break_mapping/dax_break_layout/ suggested by Dan. - Rework dax_break_mapping() to take a NULL callback for NOWAIT behaviour as suggested by Dan. --- fs/dax.c | 40 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_inode.c | 5 ++--- include/linux/dax.h | 2 ++ mm/truncate.c | 16 +++++++++++++++- 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 710b280..39f1dc0 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -845,6 +845,36 @@ int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index) return ret; } +void dax_delete_mapping_range(struct address_space *mapping, + loff_t start, loff_t end) +{ + void *entry; + pgoff_t start_idx = start >> PAGE_SHIFT; + pgoff_t end_idx; + XA_STATE(xas, &mapping->i_pages, start_idx); + + /* If end == LLONG_MAX, all pages from start to till end of file */ + if (end == LLONG_MAX) + end_idx = ULONG_MAX; + else + end_idx = end >> PAGE_SHIFT; + + xas_lock_irq(&xas); + xas_for_each(&xas, entry, end_idx) { + if (!xa_is_value(entry)) + continue; + entry = wait_entry_unlocked_exclusive(&xas, entry); + if (!entry) + continue; + dax_disassociate_entry(entry, mapping, true); + xas_store(&xas, NULL); + mapping->nrpages -= 1UL << dax_entry_order(entry); + put_unlocked_entry(&xas, entry, WAKE_ALL); + } + xas_unlock_irq(&xas); +} +EXPORT_SYMBOL_GPL(dax_delete_mapping_range); + static int wait_page_idle(struct page *page, void (cb)(struct inode *), struct inode *inode) @@ -856,6 +886,9 @@ static int wait_page_idle(struct page *page, /* * Unmaps the inode and waits for any DMA to complete prior to deleting the * DAX mapping entries for the range. + * + * For NOWAIT behavior, pass @cb as NULL to early-exit on first found + * busy page */ int dax_break_layout(struct inode *inode, loff_t start, loff_t end, void (cb)(struct inode *)) @@ -870,10 +903,17 @@ int dax_break_layout(struct inode *inode, loff_t start, loff_t end, page = dax_layout_busy_page_range(inode->i_mapping, start, end); if (!page) break; + if (!cb) { + error = -ERESTARTSYS; + break; + } error = wait_page_idle(page, cb, inode); } while (error == 0); + if (!page) + dax_delete_mapping_range(inode->i_mapping, start, end); + return error; } EXPORT_SYMBOL_GPL(dax_break_layout); diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 62c2ae3..c9ffabe 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2732,7 +2732,6 @@ xfs_mmaplock_two_inodes_and_break_dax_layout( struct xfs_inode *ip2) { int error; - struct page *page; if (ip1->i_ino > ip2->i_ino) swap(ip1, ip2); @@ -2756,8 +2755,8 @@ xfs_mmaplock_two_inodes_and_break_dax_layout( * need to unlock & lock the XFS_MMAPLOCK_EXCL which is not suitable * for this nested lock case. */ - page = dax_layout_busy_page(VFS_I(ip2)->i_mapping); - if (!dax_page_is_idle(page)) { + error = dax_break_layout(VFS_I(ip2), 0, -1, NULL); + if (error) { xfs_iunlock(ip2, XFS_MMAPLOCK_EXCL); xfs_iunlock(ip1, XFS_MMAPLOCK_EXCL); goto again; diff --git a/include/linux/dax.h b/include/linux/dax.h index a6b277f..2fbb262 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -255,6 +255,8 @@ vm_fault_t dax_iomap_fault(struct vm_fault *vmf, unsigned int order, vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf, unsigned int order, pfn_t pfn); int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index); +void dax_delete_mapping_range(struct address_space *mapping, + loff_t start, loff_t end); int dax_invalidate_mapping_entry_sync(struct address_space *mapping, pgoff_t index); int __must_check dax_break_layout(struct inode *inode, loff_t start, diff --git a/mm/truncate.c b/mm/truncate.c index e2e115a..0395e57 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -78,8 +78,22 @@ static void truncate_folio_batch_exceptionals(struct address_space *mapping, if (dax_mapping(mapping)) { for (i = j; i < nr; i++) { - if (xa_is_value(fbatch->folios[i])) + if (xa_is_value(fbatch->folios[i])) { + /* + * File systems should already have called + * dax_break_layout_entry() to remove all DAX + * entries while holding a lock to prevent + * establishing new entries. Therefore we + * shouldn't find any here. + */ + WARN_ON_ONCE(1); + + /* + * Delete the mapping so truncate_pagecache() + * doesn't loop forever. + */ dax_delete_mapping_entry(mapping, indices[i]); + } } goto out; }