From patchwork Thu Jun 20 12:53:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 13705365 X-Patchwork-Delegate: bmarzins@redhat.com Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A82B1ACE67 for ; Thu, 20 Jun 2024 12:55:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=205.220.165.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718888101; cv=fail; b=AiKV6iIK49R6Kt5dCzunbPycTgb1XmwRIGTsfNt8J75l4J5JcDAHYGltXOIABuHjOw/GeSxXrFCqkqQpB7WettFZCs7PkWLbGF7nngD0uxGfCzCv1tDcROdi5XaUY4hxctor/TirAChnzbyg1uF7u45TsflJH+VeGh/cZI1r/8Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718888101; c=relaxed/simple; bh=lqISxX5YEW/WeNeJDQSw1eC99xDJXb80NYGmqhZ9p5c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=hdbi4Vb9ev+zzRUfcGxVVPloNnAEgB+qExZyrT54S0J7Q6HSTB/SDlpciUgeLUCzdegLUzEQ80mcumznUBZfFUK2b0b4/JKqjiwqAsp4MTV1ONGzxHj+7+qvxDHsH34cLRdfOaXXWGXFrOP84NAggIvrpLDvW2C9pKnaM1N6CtM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com; spf=pass smtp.mailfrom=oracle.com; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b=e1AbHarY; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b=zEgXscnz; arc=fail smtp.client-ip=205.220.165.32 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oracle.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oracle.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="e1AbHarY"; dkim=pass (1024-bit key) header.d=oracle.onmicrosoft.com header.i=@oracle.onmicrosoft.com header.b="zEgXscnz" Received: from pps.filterd (m0246617.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45K5Fik1002321; Thu, 20 Jun 2024 12:54:43 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h= from:to:cc:subject:date:message-id:in-reply-to:references :content-type:content-transfer-encoding:mime-version; s= corp-2023-11-20; bh=CeXcO95RprRpKSW+3sToKcTkGBFVJhtusSrxlskOoZE=; b= e1AbHarY76DbR5zemdvNUoFUU5D6HTCfPdO+bmvWmMZUZIOEhtrcXlt0IFC0Qb6X wfthagKmN61ibUbTk6csgbz4LhHEfqfyPGazysoK+MVJgzL6uMsrYN4NrlezUkmv sY0z84Jzn0Tn9dIXOeb6OZ6s1HPrQ6qG/K7eoUTl74wqSVplxRWOx59pfPbMlS3W KO7OcdraihYD92EVsFIirtfGu//DwzCY2w4mHeoCPYHyM0rrmlBo2LkjLFip6oPR zh6iD6W1pumGzGxe9BZ/Y7wbEAn6YAHMZ+Q7BUqABSdXInsGCD3n0WvSgoqwq9r1 BxoZLHCxHRfgG24YDoq3tw== Received: from phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (phxpaimrmta01.appoci.oracle.com [138.1.114.2]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3yuj9r34ha-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 12:54:42 +0000 (GMT) Received: from pps.filterd (phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com [127.0.0.1]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (8.17.1.19/8.17.1.19) with ESMTP id 45KC7uti032824; Thu, 20 Jun 2024 12:54:42 GMT Received: from nam02-dm3-obe.outbound.protection.outlook.com (mail-dm3nam02lp2040.outbound.protection.outlook.com [104.47.56.40]) by phxpaimrmta01.imrmtpd1.prodappphxaev1.oraclevcn.com (PPS) with ESMTPS id 3ys1dae6nh-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 12:54:42 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Kku7jG3OpQ5oBSCk8mS2PI4gdLOJfdEayGL5F4ti+3BWGfZEETl7K4k/ay2jWnBinC5iOzafc90JMW3gBP5Z+CfgAqJf7UiJoI+sOt8TVhw5lk52ZnktVoZ1yoV1SXO2Ir2nOWRMOujw5POtbNEWwyEKJvZF2wTgJsVesNay2YmoyifKZ21CzUk1A84axwVN1S0xeKC1LrcPv5cr1cOgVbi3eYUYmBF3FUpSXisAIK1g4lhQeLZcaLVew80tgTLsBSVZyT59fmRXAcyrpYjDR0mDkH9nDu0ulOjtNzMwtHlcpcTpwiB3/Ol1rVr6jHiMiTEZ8umt6BF45/8vi1tsSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=CeXcO95RprRpKSW+3sToKcTkGBFVJhtusSrxlskOoZE=; b=B37tuutpy+kBlWIOEsXEwYxEzXDh9Ck5U0UOJz6Ts75LRQnTxM3vuZ0oPnrA8g/7qcVPAlYgUYycQHUb6PCN8IHVk3QfaqfDtsxaBJMwlzVpUKspPSDXpB6dMIM6dz4yO743Tmzi0N9PliSg7ChsMTeg10Z5mXQKpDO8UyKHCl3qMbvELZ35FL+kmf/Aqt/wQVIzqNtKLf03wqyf7RJYxSvhYzi0laVkzVaUk4uhZR4lCG07CDHC1rGF/j7lZJ3QCTKfktKlYstxaJ7iQpcs1/bUsYaZepUTLx2Q9WXY4yD26vRhuZYD5vU9TbxOjPhzmh3fhfyqOvHi4gWbD7AENQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=CeXcO95RprRpKSW+3sToKcTkGBFVJhtusSrxlskOoZE=; b=zEgXscnz0krTwBbSznqUSL14IjNs1VKsIxMGdqcuJTC1DnQLQwsVKzr2pBLWyjPQg3G8U7wsTo/WEoLUgo/CdZtz6PfZxXDRRJ9cvftrzbXM90/Pp4K00g18ul06KiSzkEaLgfZKuv+k5bv2ARtRzJgtrwopjKyOiUX97blb5AE= Received: from DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) by PH7PR10MB7695.namprd10.prod.outlook.com (2603:10b6:510:2e5::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7677.31; Thu, 20 Jun 2024 12:54:39 +0000 Received: from DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088]) by DM6PR10MB4313.namprd10.prod.outlook.com ([fe80::4f45:f4ab:121:e088%6]) with mapi id 15.20.7698.020; Thu, 20 Jun 2024 12:54:39 +0000 From: John Garry To: axboe@kernel.dk, kbusch@kernel.org, hch@lst.de, sagi@grimberg.me, jejb@linux.ibm.com, martin.petersen@oracle.com, viro@zeniv.linux.org.uk, brauner@kernel.org, dchinner@redhat.com, jack@suse.cz Cc: djwong@kernel.org, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, linux-fsdevel@vger.kernel.org, tytso@mit.edu, jbongio@google.com, linux-scsi@vger.kernel.org, ojaswin@linux.ibm.com, linux-aio@kvack.org, linux-btrfs@vger.kernel.org, io-uring@vger.kernel.org, nilay@linux.ibm.com, ritesh.list@gmail.com, willy@infradead.org, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, dm-devel@lists.linux.dev, hare@suse.de, Alan Adamson , John Garry Subject: [Patch v9 10/10] nvme: Atomic write support Date: Thu, 20 Jun 2024 12:53:59 +0000 Message-Id: <20240620125359.2684798-11-john.g.garry@oracle.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20240620125359.2684798-1-john.g.garry@oracle.com> References: <20240620125359.2684798-1-john.g.garry@oracle.com> X-ClientProxiedBy: BL1PR13CA0303.namprd13.prod.outlook.com (2603:10b6:208:2c1::8) To DM6PR10MB4313.namprd10.prod.outlook.com (2603:10b6:5:212::20) Precedence: bulk X-Mailing-List: dm-devel@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR10MB4313:EE_|PH7PR10MB7695:EE_ X-MS-Office365-Filtering-Correlation-Id: 6cba38a3-da64-4c9b-ff1b-08dc91282529 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230037|376011|7416011|1800799021|366013|921017; X-Microsoft-Antispam-Message-Info: =?utf-8?q?YrZhW+2Q5OZBU4/1akC3F41E5r1pg4V?= =?utf-8?q?DtRP4PQmj9V0Z2R974hZD/5iCV4aYkEPtiFeCKHClS4/YYXmVQpFBtI5azBWoM3e8?= =?utf-8?q?VeXqaMHwCmMwzfCoeLpnTbiHs4CiwgQUKcymHhukGoMyg4s38fsD2mmSqAvuB2tWB?= =?utf-8?q?9wHKlTyClsWy6OtVbZcPu5LbxO2jvey7qsALIci+oejiXQrEXYmxQX91Xcdvpwtoz?= =?utf-8?q?eHtF36SBNsIqHuwkz1siEj92erbGUuE60nUPliM4nWYfRd+iyf7S41EE8vjf1XTiQ?= =?utf-8?q?gi3bNdG+Obo+dWM5r/8dYeWfnfydx9gZxtv6NFMLpguSOHYq2/N66xEitAAoY46ai?= =?utf-8?q?XT7AO18GzQ28M2jL82MCndSAXviCe3jyJ7r/MKSMiezKU1XLhUvno5inUFuys5gq1?= =?utf-8?q?wMM+PmGDz2gi8qUg9ym9rGeu+Ca1uj/Yvnh0iQNwJilNPRvFNnKvmZfuUpxSS1JPZ?= =?utf-8?q?r/bi9VioH2mGdcU1xopcEdpaQROXfstisJ5Pv/+AEI3ZnrVpPViAx1ddgEbQrF8e4?= =?utf-8?q?h3OOl4qYQEZCVnfKywx4QgCNVQvN80MRfE3yZyTe4Ae0CowSoaM+AuAD07Kov9o4Y?= =?utf-8?q?VHN0iAUqGG8ekTxiKXv2AoxI8fpo1Zy913dXUaxjHTSJVZM968KBiBjxKbeGBcORg?= =?utf-8?q?JXAMMFTflJvWLDC/sNa9LYOoXe+zt6hYNOOu16I43GUwu8lLpl0hTpl6GOs8EQZkN?= =?utf-8?q?ciqs8fJWJvmpeOymYzLn4d6GmHZaTVoaH5Zax2E9Zyo0sCwYJNObuk2MjxRXDgQnz?= =?utf-8?q?G8uJ7v9Gy4LhNoDieLFVzn4XuzMLAB3IZqetD9sL4kTTOJIPqhViHt2DEssB0cPC0?= =?utf-8?q?9qeukQ8dUHx476w7S1gmnDzV8L9TquPCYGCkIuG0zQz3noMOHwR34F60pL9+tDI67?= =?utf-8?q?9T0EEDp8HN0xuzhPOa/sclZtFzgZ849SUnoEpJXtWHV9WLogcH8Rwc3/8k0ALFIP5?= =?utf-8?q?8pVRgKQOhB66uFXYR02St7BZturIwYLBtT9/7kif8KQGZADFswylNmL9VShvoRCPK?= =?utf-8?q?dd94HbCUiQHJYixZggWM427pQ1EOPzTSdmosPYpM27C9/BqG9Srrk5Er3VDA7Td+N?= =?utf-8?q?GozZ6t0pXElNmRZQe7A70UKfZEmWrzc5xFRIzHxg5A8pXERwHK4SY49IkAZ7Mh1UB?= =?utf-8?q?0oKMhniBcTyiuqxTKqB+fBvt4vtAs/ohKvIgkjXKzitvIUFkhhK5JLNVusOw/m20p?= =?utf-8?q?niVm+VJ1YM6hz9896b48cSVgth8ldIEWtjLXt24GdbA75TAVEa0VS+xfe8/Qj75x4?= =?utf-8?q?PXsNlSOqozCg9kP0VlGqWVIXB9W3NnPko02K3IKQa0sqBW1TTBWEJxX0=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR10MB4313.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230037)(376011)(7416011)(1800799021)(366013)(921017);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?xCwqRs30ucm4tUcKh6zJcQfPQHnZ?= =?utf-8?q?2R4kyNnYlpgTu56IDXudBPY1rXQtS1EW/QEur4v+gnV9erUy+kFe0cfD8kNXXi/By?= =?utf-8?q?68unK4tCG2hXh/pMXwaNFAXShsX5b4okeBI1u6h3tomP1mOgcuSChENGFseB5ztfl?= =?utf-8?q?84bIZOUSHMOvqOn4jlrttk5TqhUSQbV34YsRcYB7czTCaKOhJ5d5H65+4c9NU1rau?= =?utf-8?q?41zAYr4Delb7PFZOLq+9XDq53OfJkKJXEcaGKG5hukySxE/ldl2qbrYVNxJR6Yg4+?= =?utf-8?q?FAmkOQlLgHkMlDUVUZWu9xVBb7BcEICRjGQ4bHwQ0f4epGRlIUb+Ns1okW+Ser32b?= =?utf-8?q?MTPYG8qtN+XL6F3l0UN5FAZB6Nz0/qtXdZ4NvBcQGKKc4CskRnDeH8jfyPMI8IW+D?= =?utf-8?q?LJVK4Epgg+iFtHcPWSaR09i8NUshYXPdakV5kshel8TcwrxeXOCIMlz193lMpZt/3?= =?utf-8?q?az3OL4gUoBW7FXfpfy3rJbuV5+nKqjyQJwCccZY3oCh48+gsVeBs78vi9/q2LIkDE?= =?utf-8?q?m2drKeqCY9bBA4Lo3pa1BpUuvGDwCxMRPHW3CD5jjCTSX63Hrf8cuFxIPEvmkrijE?= =?utf-8?q?O08IUkTeRdacNdgY9M91BY71RQ7o1SJ6Pm3TnLkJZFMMytjWIbHvM02ISzd3JkpDw?= =?utf-8?q?Vj+9UtFM+epehlZr2FpReMMAOKKkkCnZqplLelORCHgEyVDM23iO5w6BTKi6oEkzd?= =?utf-8?q?C6Sg9dVreKA/3h6xvRe2JrM8nXf1MxGys9UHm89YkiQrXa6ofNy+laGKI3xd9Qvv7?= =?utf-8?q?7p9b8yg5rIVQ3bHOMBiia98xW13LxZ9f/tIs8SK77R5/jMcbHUqCifrUym89reHz/?= =?utf-8?q?T2TEIKm1t0jQ5H0VTfieyd6vNRIAyQow4ZxQEl6BbHdQeQHPgq3y0nWFn/nNyApbp?= =?utf-8?q?9Lk+U5a4ZxWOGhOMikWDQRR2piiAUHsMOy1Nt/qGlVnAHsSB5ORz/Ei0FxtopSSw6?= =?utf-8?q?rCoxYAle+Fd2iWv0BY1I/DNg4z4hMF+dHTMm4FolMKFtUFPvjjwIzRbzIiYF8jMOZ?= =?utf-8?q?kWxVxTNdDcqZKEpMHTyACoAEG+xQMC8gSg4AuHF2+0brPnP0AqqpNYz8UR8oH7qsl?= =?utf-8?q?VyJ9TMAiABIj7fo4A7u/LyNlQ3qLpgjXnfSkRN+z/DlV0cy6tzm2moe9lSFJC7wny?= =?utf-8?q?775+hYtu3ZgWVDkuesNpbTZWjb+APag5kk/Tt6i9pHKw+0Utb52+WREmdCxkGHXc4?= =?utf-8?q?Gprs8xR48NUwhb0fcV+3dXKT+1e0qjsbU7AIBCc6CE2cbUZXMfRr1gxbgAzZui0CU?= =?utf-8?q?WGRYN3esimw2mNykQYRsiaSmQ9wrf2Lc9yODSHtnYNlcBchMXmzOITflPJ4o6dM2H?= =?utf-8?q?wrnLYV952fRBeL/lNdY65mQ9+9Gbin074iuiwybg/wAxIyyZ9X+uQ1DI80WsZ/7vA?= =?utf-8?q?VLgIx80XhCdZidDE6tIN/AqAFGUmMCw1mluap/VZp69Ph5yVE3J5r2l1XiEe8oV8O?= =?utf-8?q?5xoXwRRVXNM6C+f+39coTASB5Q3bJkEa4sSXqIgpQG8SXpBLa/n5QiCzl3oiRWHF5?= =?utf-8?q?mRsWMV3Qcin1VoNVoh+g/RsdHS1VfBaTzw=3D=3D?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: x20jWBJC09w9UpRIKzf0lOi2nqqKQCZobEXt7URmxjAHTs3HfJCU6loI+xqVvRHYAoKRX5Tp7icCF9cc3uTH+7mJS47xDwFmyuiqrDDLj33vKcW0088tFkxcirCVcP95u+lhclSfbXSlsbKkmH4Jc21pFCaz5Ys5YhCx7MvhKIGmNH81sarUxU1rk4lRJh1vZWveg/NSBgBz4Pl7eeZoDS/bH7dXLfksZPdktN0h6YGnvksyFg76ovSzbMmXt6RYhZ2Q/cmTPNIaLq/LqFc6rQpCy/fYB59Qk6RTo6nG1cfGea7d0d2XjxYnFisoFpH3QLwNZKpenXbmTolNFyUiI2FGvuVZGz+jb0twBzeqKVyo3UAxMhx1mCe5vlEzcNyBlPuPanE6SQyw2GoLdc1deuAaDgAYH3kHxWDD4RU+0JzXp8Fuj2R3bR7SOmJ2NHAa1gMgaeC1Uk4m1nox76pICuCFICpcH1nUgv32anP6Arn42VtvNkyxpp9xHc1TgXZ0/c7AuJ0vPHBwTKUnSQRJfxU76tp/N0/TFPOwBoC3bmUGBxBv/TN+U9xakTbSsSNBcaqCFCDXEFUW7eOzmQ/Jt+JzxOhJQV5AtESYlpUITbk= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6cba38a3-da64-4c9b-ff1b-08dc91282529 X-MS-Exchange-CrossTenant-AuthSource: DM6PR10MB4313.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jun 2024 12:54:39.0004 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ThZraPXp9QLH9lUzfTz2C+sMxdaVhZcZ/Q9+wFsdXCVpDw/n7bkfa1SE0MVC4Aouo5iBwtVkMedvNpRB5fxA7A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR10MB7695 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_03,2024-05-17_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 mlxscore=0 phishscore=0 suspectscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2405010000 definitions=main-2406200092 X-Proofpoint-GUID: mNS_5icj699YxJY16q4thhmq4cZy4-aS X-Proofpoint-ORIG-GUID: mNS_5icj699YxJY16q4thhmq4cZy4-aS From: Alan Adamson Add support to set block layer request_queue atomic write limits. The limits will be derived from either the namespace or controller atomic parameters. NVMe atomic-related parameters are grouped into "normal" and "power-fail" (or PF) class of parameter. For atomic write support, only PF parameters are of interest. The "normal" parameters are concerned with racing reads and writes (which also applies to PF). See NVM Command Set Specification Revision 1.0d section 2.1.4 for reference. Whether to use per namespace or controller atomic parameters is decided by NSFEAT bit 1 - see Figure 97: Identify – Identify Namespace Data Structure, NVM Command Set. NVMe namespaces may define an atomic boundary, whereby no atomic guarantees are provided for a write which straddles this per-lba space boundary. The block layer merging policy is such that no merges may occur in which the resultant request would straddle such a boundary. Unlike SCSI, NVMe specifies no granularity or alignment rules, apart from atomic boundary rule. In addition, again unlike SCSI, there is no dedicated atomic write command - a write which adheres to the atomic size limit and boundary is implicitly atomic. If NSFEAT bit 1 is set, the following parameters are of interest: - NAWUPF (Namespace Atomic Write Unit Power Fail) - NABSPF (Namespace Atomic Boundary Size Power Fail) - NABO (Namespace Atomic Boundary Offset) and we set request_queue limits as follows: - atomic_write_unit_max = rounddown_pow_of_two(NAWUPF) - atomic_write_max_bytes = NAWUPF - atomic_write_boundary = NABSPF If in the unlikely scenario that NABO is non-zero, then atomic writes will not be supported at all as dealing with this adds extra complexity. This policy may change in future. In all cases, atomic_write_unit_min is set to the logical block size. If NSFEAT bit 1 is unset, the following parameter is of interest: - AWUPF (Atomic Write Unit Power Fail) and we set request_queue limits as follows: - atomic_write_unit_max = rounddown_pow_of_two(AWUPF) - atomic_write_max_bytes = AWUPF - atomic_write_boundary = 0 A new function, nvme_valid_atomic_write(), is also called from submission path to verify that a request has been submitted to the driver will actually be executed atomically. As mentioned, there is no dedicated NVMe atomic write command (which may error for a command which exceeds the controller atomic write limits). Note on NABSPF: There seems to be some vagueness in the spec as to whether NABSPF applies for NSFEAT bit 1 being unset. Figure 97 does not explicitly mention NABSPF and how it is affected by bit 1. However Figure 4 does tell to check Figure 97 for info about per-namespace parameters, which NABSPF is, so it is implied. However currently nvme_update_disk_info() does check namespace parameter NABO regardless of this bit. Signed-off-by: Alan Adamson Reviewed-by: Keith Busch Reviewed-by: Martin K. Petersen jpg: total rewrite Signed-off-by: John Garry Reviewed-by: Keith Busch Reviewed-by: Hannes Reinecke Reviewed-by: Kanchan Joshi --- drivers/nvme/host/core.c | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index bf410d10b120..89ebfa89613e 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -927,6 +927,36 @@ static inline blk_status_t nvme_setup_write_zeroes(struct nvme_ns *ns, return BLK_STS_OK; } +/* + * NVMe does not support a dedicated command to issue an atomic write. A write + * which does adhere to the device atomic limits will silently be executed + * non-atomically. The request issuer should ensure that the write is within + * the queue atomic writes limits, but just validate this in case it is not. + */ +static bool nvme_valid_atomic_write(struct request *req) +{ + struct request_queue *q = req->q; + u32 boundary_bytes = queue_atomic_write_boundary_bytes(q); + + if (blk_rq_bytes(req) > queue_atomic_write_unit_max_bytes(q)) + return false; + + if (boundary_bytes) { + u64 mask = boundary_bytes - 1, imask = ~mask; + u64 start = blk_rq_pos(req) << SECTOR_SHIFT; + u64 end = start + blk_rq_bytes(req) - 1; + + /* If greater then must be crossing a boundary */ + if (blk_rq_bytes(req) > boundary_bytes) + return false; + + if ((start & imask) != (end & imask)) + return false; + } + + return true; +} + static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns, struct request *req, struct nvme_command *cmnd, enum nvme_opcode op) @@ -942,6 +972,9 @@ static inline blk_status_t nvme_setup_rw(struct nvme_ns *ns, if (req->cmd_flags & REQ_RAHEAD) dsmgmt |= NVME_RW_DSM_FREQ_PREFETCH; + if (req->cmd_flags & REQ_ATOMIC && !nvme_valid_atomic_write(req)) + return BLK_STS_INVAL; + cmnd->rw.opcode = op; cmnd->rw.flags = 0; cmnd->rw.nsid = cpu_to_le32(ns->head->ns_id); @@ -1920,6 +1953,23 @@ static void nvme_configure_metadata(struct nvme_ctrl *ctrl, } } + +static void nvme_update_atomic_write_disk_info(struct nvme_ns *ns, + struct nvme_id_ns *id, struct queue_limits *lim, + u32 bs, u32 atomic_bs) +{ + unsigned int boundary = 0; + + if (id->nsfeat & NVME_NS_FEAT_ATOMICS && id->nawupf) { + if (le16_to_cpu(id->nabspf)) + boundary = (le16_to_cpu(id->nabspf) + 1) * bs; + } + lim->atomic_write_hw_max = atomic_bs; + lim->atomic_write_hw_boundary = boundary; + lim->atomic_write_hw_unit_min = bs; + lim->atomic_write_hw_unit_max = rounddown_pow_of_two(atomic_bs); +} + static u32 nvme_max_drv_segments(struct nvme_ctrl *ctrl) { return ctrl->max_hw_sectors / (NVME_CTRL_PAGE_SIZE >> SECTOR_SHIFT) + 1; @@ -1966,6 +2016,8 @@ static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id, atomic_bs = (1 + le16_to_cpu(id->nawupf)) * bs; else atomic_bs = (1 + ns->ctrl->subsys->awupf) * bs; + + nvme_update_atomic_write_disk_info(ns, id, lim, bs, atomic_bs); } if (id->nsfeat & NVME_NS_FEAT_IO_OPT) {