From nobody Wed May 7 23:47:50 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=oracle.com); dmarc=fail(p=reject dis=none) header.from=oracle.com ARC-Seal: i=2; a=rsa-sha256; t=1743789232; cv=pass; d=zohomail.com; s=zohoarc; b=iID7WDflo/g+Z5wRqm2zSFwX5icEDTc9uJ7a5p8jY2gKpq7IJ0hyQ9j3chAfzT4FjyT0Czm6w2VR+lD91UU6WUiCIAlwn0KBdieH6N+1rQ4i9O3TMdWt3Kz1TIJC65G6tW/rwBQYguyXtfqTkwYPK9NkOv7P52R2kG70VHuYZoA= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1743789232; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vzV8g9fJPZGF77ua2zGkv53ILveshittuorSGiKk7UI=; b=BBdHOTjbVEDLWC0raE0GVwNC2dAveDnrxiSGI+qwEzdaI71PH9zewVFDTyShMYJgIjwHy5jvudH3gXXLFwzD7MzFeMe3rmP/dupSSjthFJHs4Gd7IigldBIFZLuj7SUxupWFwrCbyCMbK1Pk8HR7UKBM1eo9ew8i3pq+FlKITgU= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=oracle.com); dmarc=fail header.from=<alan.adamson@oracle.com> (p=reject dis=none) Return-Path: <qemu-devel-bounces+importer=patchew.org@nongnu.org> Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1743789232529237.70402152569307; Fri, 4 Apr 2025 10:53:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from <qemu-devel-bounces@nongnu.org>) id 1u0lDo-0006IO-E5; Fri, 04 Apr 2025 13:52:52 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <alan.adamson@oracle.com>) id 1u0lDc-0006Co-7J; Fri, 04 Apr 2025 13:52:43 -0400 Received: from mx0b-00069f02.pphosted.com ([205.220.177.32]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <alan.adamson@oracle.com>) id 1u0lDW-00046D-59; Fri, 04 Apr 2025 13:52:39 -0400 Received: from pps.filterd (m0246632.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 534Du3b2012162; Fri, 4 Apr 2025 17:52:19 GMT Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 45p8fsfwn5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 04 Apr 2025 17:52:19 +0000 (GMT) Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.18.1.2/8.18.1.2) with ESMTP id 534GbtTK036168; Fri, 4 Apr 2025 17:52:19 GMT Received: from nam11-bn8-obe.outbound.protection.outlook.com (mail-bn8nam11lp2170.outbound.protection.outlook.com [104.47.58.170]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (PPS) with ESMTPS id 45t2nuc8ny-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 04 Apr 2025 17:52:18 +0000 Received: from SA1SPRMB0044.namprd10.prod.outlook.com (2603:10b6:806:33a::9) by SA1PR10MB5759.namprd10.prod.outlook.com (2603:10b6:806:23d::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8583.35; Fri, 4 Apr 2025 17:52:17 +0000 Received: from SA1SPRMB0044.namprd10.prod.outlook.com ([fe80::8263:a1ff:1b60:b0f7]) by SA1SPRMB0044.namprd10.prod.outlook.com ([fe80::8263:a1ff:1b60:b0f7%4]) with mapi id 15.20.8511.028; Fri, 4 Apr 2025 17:52:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s= corp-2023-11-20; bh=vzV8g9fJPZGF77ua2zGkv53ILveshittuorSGiKk7UI=; b= nmEnrLiZUz4zOkRKPNLV9PGxAx+eFkWQLdRdgrfJV2rfPn5ZxHtb1K+wkNOl3TdJ T6HGWmnmoRNjyrjBb7N70gde76Dqv6u64N2Y2jdo7UsYKmNkETebgjINGIhQX6mj JPVpdo5pZlYNIW8erZZD25pjvWFno8NBk98ES4nVhCDc4cwj74RDto8LE5HXtFNp qCddBX+TeJm/OYxPmFNiOMsAnYqbTS7zB8SSFgoGfalZZogGsjnUjcULYN9CO1zj PfGeigZ49NtgF0dmSJmaOEIUHmBl+yoGKnZPS3vO1xknyoaV+C1XSDQCiUc9niHJ uCo+eT+pLxeWvRXbaRk0DA== ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JnNL6k5gyiBka2SHeoH0xXL29WN0O2h3gXCkU1md71r2QXbUZL+fZC2AzW84COhFSnJeBHlLxjDqJ4alAdEFmOhe5cRn6tpm0gOkRo5RP2GOTGobubDe9GmJbyQhCkW15dEjBVmkFhSwoVLxJ0hA+GgZTDMk0R+RWS3c85sY++E2gjSUSEhgzUN/ft3gc5tn3ZfbQ6JE6Dfxzf/nxKg2aaGk1gR91p/XivRPntr5rukmTdRvDPaydo/FgNbkYwLUpTtzvRtu11PrW/g5B1vmQ6QR51Ir/CQ6fD5WoM5KfPEL+/56bG6lSr4xQ9tdQdoAiDzYoC+x7WI0Mvgz6Yysdg== 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=vzV8g9fJPZGF77ua2zGkv53ILveshittuorSGiKk7UI=; b=o9JHXRiLVkdj0bUakOfuTMyo2qZcPAsR1z0dvbhDiW+wLNz3HYmT6s4Xa94z5ppVduZ/f4uBkZil5+yDsE1OzOcFGfrLjO27SYTWcpLHHWQPTe4srZ5/y8CoyG2JO1tKffCpsQyObGaRqf90zGHP6rAdGgjFYtXbaJzf8DIZdCbTCrOHJWW3QbmPmkuTXNb33/odw9dXLQMC75zROXrxCxZDdt4uYskmqlVMwHUiV5w582UYKQygBF6ujOjDDNKm6dxAbH6KeoOXWZi8+XICB4Brke2pNZkBgd2hKhNk/7BDPzkH2Bd12kI8r765RVeK/uXEUmalRsk60+q/HOd+Cg== 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=vzV8g9fJPZGF77ua2zGkv53ILveshittuorSGiKk7UI=; b=tCfutWILXXjHRhhZftvCqOexJB/7SjMNy+A0pPY/V/rUe0FJ4qdOwbqyReSzNDLAxvp20imbKLRxqZ+tJTt2AOXS0pA18mS46MdgW/fp+fgkZctsBLTlud3PSvEONOsgPOf2dv/LxRs1ZkjvZ3SvlqyJpr7E5nakWJg64Cw8w5I= Message-ID: <0e1a7bfd-ac33-4779-928c-bb486b878bcf@oracle.com> Date: Fri, 4 Apr 2025 10:52:13 -0700 User-Agent: Mozilla Thunderbird Subject: hw/nvme: Issue with multiple controllers behind a subsystem To: Klaus Jensen <its@irrelevant.dk>, Keith Busch <kbusch@kernel.org>, Jesper Devantier <foss@defmacro.it>, qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: alan.adamson@oracle.com References: <20241216-nvme-queue-v1-0-4e42212b92f7@samsung.com> Content-Language: en-US From: alan.adamson@oracle.com In-Reply-To: <20241216-nvme-queue-v1-0-4e42212b92f7@samsung.com> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MN2PR03CA0026.namprd03.prod.outlook.com (2603:10b6:208:23a::31) To SA1SPRMB0044.namprd10.prod.outlook.com (2603:10b6:806:33a::9) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA1SPRMB0044:EE_|SA1PR10MB5759:EE_ X-MS-Office365-Filtering-Correlation-Id: 2f7dcb74-9096-42ac-3a28-08dd73a1705e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|1800799024|376014; X-Microsoft-Antispam-Message-Info: =?utf-8?B?U0pUT0grTDJ2ek5rbXNKc1AzcmxBTVdYaElMb0syRXovam5ESFhLYmU3Nk5v?= =?utf-8?B?YkVyelc3Wm9BTmhMbG9Fa09FWmo0YUNVOHRZdDJnM3Z2dlFXaWZhY1Z1SjhZ?= =?utf-8?B?bUthb2dqeE5BRlkxOWc3S1l3OXBLWjFHRGEweVNoYllVeXIrOGhwZHZaWUJQ?= =?utf-8?B?OUFDUng1Q1FTeUhOUWNaT1pITXRnbnFaT1BiZ3Byck5hNFppS0Z5NnFNRHBS?= =?utf-8?B?OGJlOE94c1p4OTBkSUxkR2RCQUhTQUZCZ0ltYU5Hb1RGZkpxOU1ZWjMzYWZm?= =?utf-8?B?RHpHZUhuUTY4ODlwZDVoUUh5Z2FITHU1V3dQSnVmU0hOc2pqd1pRQU5vQng4?= =?utf-8?B?L0dzWVhBRnR1ZkxGZllwVEd6Q2ZpZ3crWFM2YWJLZFI3NkpTbE8yRHl2bE9G?= =?utf-8?B?UHllazBYVGxKaENtQUJPM2I4L21SeG81WGIxUVU0OWR3WGNTTlNkTGNVMnhr?= =?utf-8?B?NmE0MGNsajhkZVhLZkZXV1NuQ01VOHJZSWJvbTd1TTJDeFlnS0FvT2pzVUhm?= =?utf-8?B?ZDB3ZnlHcEs2bHhPcHVFbXVJajQ2L3RlUzY0eDNUWW5oNW5IUWwzdjRMUnRW?= =?utf-8?B?VkZyQjhyVmFvY3VRcyt0VjhHYXUzUWlvM1NKRVBQNnd0dHBoS25YVFJFc3Q1?= =?utf-8?B?cVhiSmRIbndpSE5EeTQ1NW5RSEYxUUhnR0FFbVNkSXdkdzRTRmN3dlB3elR6?= =?utf-8?B?SHpPenJwSDEzNUY4QzNWNHJPNVBHa2V1SWFVbEVHTHFsb1lnbmtMdEJ2clpm?= =?utf-8?B?OWpxQlVTLzh3TjVyTSttVkh0UU1ZbUhXamZuZFNDTUNxdENLcS9lYTlHU0Ux?= =?utf-8?B?c3FDczZxQ1FscTV0aEVjeGc2Z3pJU1F0bG9nazlsM2hFbVVhNWtJVTZMaFVH?= =?utf-8?B?RGJHK2NsRTJVbkdLTC9odDJiVnpOMHVjam9EUzZ4QXpGVWF0UnM4eExsR2pY?= =?utf-8?B?RThvYlBCN2pzUDI3WmdzS0N3MEFIakFqbi9VNEhPTTBHT2tsRkxKbWljNkhH?= =?utf-8?B?SWQ5N2hJbnVmSkU5RlNoUkhtUWJrVUt1bFdNTVVMMFVJVThoMFNZRjVHaHpI?= =?utf-8?B?QWlKRGxDLzMwSFNleVJUZUxuVXdmaDhxQkdlaDFzVXYyQTNNN0w2MWJJd0dF?= =?utf-8?B?NFBhWUJwY0I2Qyt0dy96TzlpM3ZQYnlEZ1pYS1lNa291SndSa1ZrSDNPNFdQ?= =?utf-8?B?NGZUd0xDa1dSRlBpZGhEWjVscXQ5V1BMZEM3TTBxSVJSd0lvVnlIWjJYZmJy?= =?utf-8?B?OXVjWlBkOTlScHNhdHJMK2lFeTkveGpkdFpiRE9lVDhqb1ExWmFvYUxyam44?= =?utf-8?B?cnpENGlvM1hDUmhqcmNBbjE0dGxIUnlFLys2QXdZMWZ1dnZqV1NDVkRDeFRV?= =?utf-8?B?OU9PRzBVb0VLdVlBWS82VGhUcU9RNXJNblVPdjVhRXE5ZXQ1R1hsTTYzd3M0?= =?utf-8?B?YWN1Zk93UlUxN2w5ek9PakdnS0ZyUjl5NE1ocmJhY25RSXVMREY4UzFTWmJ5?= =?utf-8?B?NmpUazVvRktmVnRoUmVVQm1GS2xjWUtNZWkvOUZDOXc3WDU3UmhmL1VucklM?= =?utf-8?B?YS92OFNjOCtQaE5NN2EvdzNrZWpPNlpNNmZtcEVRNUJtRk8yRHpjWHgxNXlK?= =?utf-8?B?YjU3Wnh5ZUpHOStzYzR5Zy9nNDVPdDJmU1FEdC9OdmkvUllranM0cW91NmhK?= =?utf-8?B?KzFSM0FzNUV1WHFzaTR4ZFZvaGw2NmF1MUhPek1kc3JrR2orRVMrcjdRZVBo?= =?utf-8?B?MkEyZkRMcmlaQWdQUVNhS2NlNmhDcy9yQVplRVRuR3hZeUpwUVgzNkh1UnRs?= =?utf-8?B?RHJRaUh6NnUvSDZiMkVSQXRFOWFEY1BJYzVVMTJ3NEhhZVZHa3B3TkZDZ0Qw?= =?utf-8?Q?TiWjH3uh4LjxK?= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SA1SPRMB0044.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(366016)(1800799024)(376014); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Y01XU1JsSFV5dU1JNXZoYll0alNFZ3pUTWZhTzF0LzBudXlrUWl5K1BYM2Rz?= =?utf-8?B?ZmJkVXR4anNDZEZhTnpuUmhoeDE1WnVEOXhDWVd0NGQvdFI4ZTYyeVNxRHRC?= =?utf-8?B?VWhQRm5BV2JPZng2SzI3V2l0Y2Y3MHZOSWF3UkFJWmhiVlpTRnFhVVpBNFVv?= =?utf-8?B?bXF4TXY3MFVWSFJRSmJUMVduYXQ4ZmxMdzN0VDlhOE1OMC9XWUFKei9RV0VS?= =?utf-8?B?ZFUzN0F1eVBjQXNrTFZBNnJCUFREK2YzeUUxUE5QUzY1eFdpSG00aVBTQ1pQ?= =?utf-8?B?WmVFMEJqRWhtcXNRMXd0L2ttZWE2Y3ZPR25PWlFiM0oxa2tVU0dWODdoNWpJ?= =?utf-8?B?Ty90eThnbkpWTHFneEpmWDZyemFicXZVZXhqbFIyYWh2ZmRiR2lvKytBR3pr?= =?utf-8?B?TnNuOUlBZnBvRXphTktkT09xTVJwTSt1TUg0QUJvT09TN1NRa0tCS0JJbUtU?= =?utf-8?B?MHZab3hGVmYyVDU5dFRhV2I5WFc4TWZVQlBCQXdvOTBZTTRUVTA0VEVxNnVZ?= =?utf-8?B?emJmUEF4SHF4UENURWFUSHI5NXRrYXhleUEwRHAyMHFhN21jUmJXTGNNWnJv?= =?utf-8?B?YUdUcEhjRzMvcDUzR0ZQUDBiaWs5WE5LOG1idDVMOE9EWkY1MjdlaWdwdmIz?= =?utf-8?B?WlQxSXI4Uzc5RDJXRm44a0dUTGppMG4xQkdNbGFQRDZ0cWFYQ0R2Skh6TGtj?= =?utf-8?B?ZVBad2I3bnR2eFR4eE85TTRlb05rWTFGS3FnZnBjbHo1M3hNRFdLdDV4VFVh?= =?utf-8?B?V2hsVGozN0xTellQMU95dkdDKzZjTkVHYW55THNVQ25NMi8va0k5c0FtVlJW?= =?utf-8?B?SmJuMGQ4TngrRHErZzlnd1Jlc2hTOUFQOUwwd2dLYTNRRGxXOGZuMmNWeVRi?= =?utf-8?B?dW5lZlhwZFpNM09GeVZFOXFtTGRqK2NBQkpQeXg0ZGo1aFdpdy9id3VOcWNz?= =?utf-8?B?Wk81UFBNQ2dKODl0ZGpmNFU4bXJySWhYc1NyenpjRTVoVXVFdk4xa3NEbE5D?= =?utf-8?B?UDcxQlU4ajVwc3NiUExqUGJqOXE1eUoyNnlJbDVyRWxYb2VYelBYU1ZTWXh1?= =?utf-8?B?cW11VmpZWlFBc2dBSnNOcFVDaGVRZDA3a1FmeTFuUTBDd1p1cTlNV2xCS1Jz?= =?utf-8?B?MEFsS2VhdytVSktHWmZ1WG8yQlJacmlOd3dySnBFaTFPL3hiSFVuVk9WOW9V?= =?utf-8?B?dEIzcCtoSFFPQ1Z1MmZJU1Q0WmZZcXZBTUJiSFdZZmNxUlN6bzRyVkxVVGRK?= =?utf-8?B?ZDNScXprNzdrYkJVbzVaRHRkTXAyVkdRZ04xbHhOZnd4T1M1Mk9JK2lKWUxS?= =?utf-8?B?bllrcUpya0ZQUVdTcEdjcEhWOVdhRC9VR29PMXFWRHpQckJvTzh4cUN3U256?= =?utf-8?B?QVZWWkNCVDFlRy9xa2FYVzNYQ01pcXJVcUwxN1lYSy9nekVTMFFJeTNUVFZm?= =?utf-8?B?TUUwQlZ0SVB4MURWWDBwVG55aVFzZUpwRnZKV00yY3BDTnArK1lNZkFJSE9O?= =?utf-8?B?Q2huNjduek5EY3JuU0ZpdnJPdlcvODFOL25zYUtzZlpLODlxV252dTJ1bks1?= =?utf-8?B?bTdZWUxWQW45M3JXSGxsM3E3VUpiZkxVaEROakpmN1BiNmlFd280aUpnUWE0?= =?utf-8?B?Q251STBMRmFhT3dldVNPWCs1emM5NG4zRW0xcWVQS2Z4WVZGVXd1d2doZ1dF?= =?utf-8?B?ZkFaelJqZDdUWndnQk8zRW5mdkt6TXQ0SUhLUitXOVJRMVQyVFdwdE5BUFU5?= =?utf-8?B?S0NjZjVJWDlod1JrYXdNQVlaU2paRVVSU2VXdHFvZnV3MHlpMGF3ZmdST3RO?= =?utf-8?B?RWxIdkVvUFhlRFAyYThIWlJtVGg4eWhHMFVhY1BTR25JS3dSd3lScjdHckJm?= =?utf-8?B?THlsQnJ6S3FuRkF2YkFyb28xbUxhK3FzQmFxbVM3eS9tR1JtUVFFTDQ5QnVx?= =?utf-8?B?SUZreCtDTFc5cXVBeXhjZkJjMUtLWkR6RUw4VFBWbVZ0SG5CVjRjMGttVkh2?= =?utf-8?B?MlcyZmsvK1VyRVdsSzBnRVNkSWJ6WE9QbFcxaHZKazFKcmFpdGd0ZXYrNW93?= =?utf-8?B?MkZyZ3l3R21iSUhFVUd6MytyN0JyRTZlc3RuV2NVWDVtcVNpbUhoVmhXZXNR?= =?utf-8?B?NGJ0YXNVRk56d290bFN3SVRNUUVLL0p2QW1WRXpXV2dCTHo0aHpnVG1yOTVp?= =?utf-8?B?c1E9PQ==?= X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: TgRt/v/ZTUxU/W+WSUuqravLVUlRoJKy+HGArFfaLwbRydRivUUiSCH7Dzk4T5SkrwWGhgpypFhc3z8v1L/GMn4rkeIDiSMzqIEgxVh0+OH0OCnABdyBWRGNjzJ5CebL7qttfoX0shVbMS1lStXG2MZ6BB0nW61MEoUaYHzGv5ryjACq4RdAJ64+v+sO5o+VvwH0HjylYsLmj8DUZNc9agK9CBCrRbpLYuCgHVF2nk+lwWz0Y7Qa8ZyHmfnLh0nrHn/Vew6lwtaHUtcY6jhZvWAGbrpys9SyAQc2KeFuFKxA5uoQX+LYMchbtOORtMih6MU8goCYPD2ATWjclJqoYL54bxHu3dLpKjD8pCULN5RKv7RjhIXcGqs+KT0yozVJb6E4xUiOHHE5F1bQkAH4L3Q6SZszI8sbe7FL4/KWG5hQexTjEGQ/7UxW+LSzZx8I/WfLAowHRViIo5tig7Bmy3XhI0qZYq/jxDN9zURTvsKqr9frz7mE3Q5UB4RNDAbS5Ggq2Wyus16AFMUXThKDIfELaTCzkYFcfNffhLydDe8P9TrJOuuMX4DVP5EeIA2i9mVaTCR+NGdi3STm42UZGP6GAz+AUsujGmkkjf9N3is= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2f7dcb74-9096-42ac-3a28-08dd73a1705e X-MS-Exchange-CrossTenant-AuthSource: SA1SPRMB0044.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Apr 2025 17:52:17.1515 (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: 96mUfe7YKpCANNy0LrCj2jtkIXo7avyiUapltFRlNH8AdcoLRuH0KKZJSd0fImbCZcppJIa40CwjwO9q6xgZzA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR10MB5759 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1095,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-04-04_07,2025-04-03_03,2024-11-22_01 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxlogscore=999 mlxscore=0 adultscore=0 suspectscore=0 spamscore=0 phishscore=0 bulkscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2502280000 definitions=main-2504040123 X-Proofpoint-ORIG-GUID: zt4DRkUarN5hnT-XXoTkmc7cyel8pE4- X-Proofpoint-GUID: zt4DRkUarN5hnT-XXoTkmc7cyel8pE4- Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=205.220.177.32; envelope-from=alan.adamson@oracle.com; helo=mx0b-00069f02.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: <qemu-devel.nongnu.org> List-Unsubscribe: <https://lists.nongnu.org/mailman/options/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe> List-Archive: <https://lists.nongnu.org/archive/html/qemu-devel> List-Post: <mailto:qemu-devel@nongnu.org> List-Help: <mailto:qemu-devel-request@nongnu.org?subject=help> List-Subscribe: <https://lists.nongnu.org/mailman/listinfo/qemu-devel>, <mailto:qemu-devel-request@nongnu.org?subject=subscribe> Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @oracle.onmicrosoft.com) X-ZM-MESSAGEID: 1743789234295019000 I'm running into a issue with the latest qemu-nvme with v10.0.0-rc2 with=20 regards to multiple controllers behind a subsystem.=C2=A0 When I setup a=20 subsystem with 2 controllers, each with a private/non-shared namespace,=20 the two private/non-shared namespaces all get attached to one of the=20 controllers. I'm sending out diffs that resolve the problem but would like to get=20 some feedback before sending a formal patch. See below. Thanks, Alan Adamson [root@localhost qemu-subsys]# git describe v10.0.0-rc2 [root@localhost qemu-subsys]# QEMU NVMe Config =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D -device nvme-subsys,id=3Dsubsys0 \ -device=20 nvme,serial=3Ddeadbeef,id=3Dnvme0,subsys=3Dsubsys0,atomic.dn=3Doff,atomic.a= wun=3D31,atomic.awupf=3D15=20 \ -device=20 nvme,serial=3Ddeadbeef,id=3Dnvme1,subsys=3Dsubsys0,atomic.dn=3Doff,atomic.a= wun=3D127,atomic.awupf=3D63=20 \ -drive id=3Dns1,file=3D/dev/nullb3,if=3Dnone \ -drive id=3Dns2,file=3D/dev/nullb2,if=3Dnone \ -drive id=3Dns3,file=3D/dev/nullb1,if=3Dnone \ -device nvme-ns,drive=3Dns1,bus=3Dnvme0,nsid=3D1,shared=3Dfalse \ -device nvme-ns,drive=3Dns2,bus=3Dnvme1,nsid=3D2,shared=3Dfalse \ -device nvme-ns,drive=3Dns3,bus=3Dnvme1,nsid=3D3,shared=3Dtrue=C2=A0 \ 1 Subsystem (subsys0) =C2=A0=C2=A0=C2=A0 2 Controllers (nvme0/nvme1) nvme0 =C2=A0=C2=A0=C2=A0 private namespace (nsid=3D1) =C2=A0=C2=A0=C2=A0 shared namespace (nsid=3D3) nvme1 =C2=A0=C2=A0=C2=A0 private namespace (nsid=3D2) =C2=A0=C2=A0=C2=A0 shared namespace (nsid=3D3) What Linux is seeing =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [root@localhost ~]# nvme list -v Subsystem Subsystem-NQN Controllers ----------------=20 ---------------------------------------------------------------------------= ---------------------=20 ---------------- nvme-subsys1 nqn.2019-08.org.qemu:subsys0 nvme0, nvme1 Device=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Cntlid S= N MN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=20 FR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 TxPort Address=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Slot=C2=A0=C2=A0 Subsystem=C2=A0=C2=A0=C2=A0 Namespac= es ---------------- ------ --------------------=20 ---------------------------------------- -------- ------ --------------=20 ------ ------------ ---------------- nvme0=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 deadbeef=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QEMU NVMe=20 Ctrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 9.2.92=C2=A0=C2=A0 pcie=C2=A0=C2=A0 0000:00:04.0=C2=A0=C2=A0 4=20 nvme-subsys1 nvme1n1, nvme1n2, nvme1n3 nvme1=C2=A0=C2=A0=C2=A0 1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 deadbeef=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QEMU NVMe=20 Ctrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 9.2.92=C2=A0=C2=A0 pcie=C2=A0=C2=A0 0000:00:05.0=C2=A0=C2=A0 5=20 nvme-subsys1 nvme1n1 Device=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Ge= neric=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NSID Usag= e=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20 Format=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Controll= ers ----------------- ----------------- ----------=20 -------------------------- ---------------- ---------------- /dev/nvme1n1 /dev/ng1n1=C2=A0=C2=A0 0x3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme0, nvme1 /dev/nvme1n2 /dev/ng1n2=C2=A0=C2=A0 0x2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme0 /dev/nvme1n3 /dev/ng1n3=C2=A0=C2=A0 0x1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme0 [root@localhost ~]# nvme id-ctrl /dev/nvme1n2 |=C2=A0 grep awupf awupf=C2=A0=C2=A0=C2=A0=C2=A0 : 15 [root@localhost ~]# nvme id-ctrl /dev/nvme1n3 |=C2=A0 grep awupf awupf=C2=A0=C2=A0=C2=A0=C2=A0 : 15 [root@localhost ~]# =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Both private namspaces are being attached to the same controller (nvme0) Fix =3D=3D=3D Need to keep track of the controller that registers a namespace with the=20 subsystem and only allow other controllers to attach to the namespace if it is shared. Non-shared namespaces can only be attached to a controller than=20 registers it. Proposal =3D=3D=3D=3D=3D=3D=3D=3D diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 518d02dc6670..883d8d4722fd 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -5063,7 +5063,8 @@ static uint16_t nvme_endgrp_info(NvmeCtrl *n,=20 uint8_t rae, uint32_t buf_len, =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 1; i <=3D NVME_MAX_NAMESPACES; i++) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D nvme_subs= ys_ns(n->subsys, i); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D nvme_subs= ys_ns(n, i); + =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 c= ontinue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5700,7 +5701,7 @@ static uint16_t nvme_identify_ns(NvmeCtrl *n,=20 NvmeRequest *req, bool active) =C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0 if (unlikely(!ns)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!active) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n->subsys, nsid); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!ns) { [root@localhost qemu-subsys]# git log -p=20 f4b9f10a80c30f1d6b9850d476eb8226bda3f553 > /tmp/p ^C [root@localhost qemu-subsys]# vi /tmp/p [root@localhost qemu-subsys]# cat /tmp/p commit f4b9f10a80c30f1d6b9850d476eb8226bda3f553 Author: Alan Adamson <alan.adamson@oracle.com> Date:=C2=A0=C2=A0 2025-04-03 14:10:30 -0400 =C2=A0=C2=A0=C2=A0 subsys multi controller shared fix diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 518d02dc6670..883d8d4722fd 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -5063,7 +5063,8 @@ static uint16_t nvme_endgrp_info(NvmeCtrl *n,=20 uint8_t rae, uint32_t buf_len, =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 1; i <=3D NVME_MAX_NAMESPACES; i++) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D nvme_subs= ys_ns(n->subsys, i); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D nvme_subs= ys_ns(n, i); + =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 c= ontinue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5700,7 +5701,7 @@ static uint16_t nvme_identify_ns(NvmeCtrl *n,=20 NvmeRequest *req, bool active) =C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0 if (unlikely(!ns)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!active) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n->subsys, nsid); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 return nvme_rpt_empty_id_struct(n, req); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5739,7 +5740,7 @@ static uint16_t nvme_identify_ctrl_list(NvmeCtrl=20 *n, NvmeRequest *req, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 r= eturn NVME_INVALID_FIELD | NVME_DNR; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n->subsys= , nsid); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 r= eturn NVME_INVALID_FIELD | NVME_DNR; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5809,7 +5810,7 @@ static uint16_t nvme_identify_ns_ind(NvmeCtrl *n,=20 NvmeRequest *req, bool alloc) =C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0 if (unlikely(!ns)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (alloc) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n->subsys, nsid); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 return nvme_rpt_empty_id_struct(n, req); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5837,7 +5838,7 @@ static uint16_t nvme_identify_ns_csi(NvmeCtrl *n,=20 NvmeRequest *req, =C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0 if (unlikely(!ns)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!active) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n->subsys, nsid); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D = nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 return nvme_rpt_empty_id_struct(n, req); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5884,7 +5885,7 @@ static uint16_t nvme_identify_nslist(NvmeCtrl *n,=20 NvmeRequest *req, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, i); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!active) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n->subsys, i); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n, i); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -5932,7 +5933,7 @@ static uint16_t nvme_identify_nslist_csi(NvmeCtrl=20 *n, NvmeRequest *req, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 ns =3D nvme_ns(n, i); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 i= f (!active) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n->subsys, i); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n, i); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -6793,7 +6794,7 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n,=20 NvmeRequest *req) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NVME_INVALID_NSID = | NVME_DNR; =C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n->subsys, nsid); +=C2=A0=C2=A0=C2=A0 ns =3D nvme_subsys_ns(n, nsid); =C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NVME_INVALID_FIELD= | NVME_DNR; =C2=A0=C2=A0=C2=A0=C2=A0 } @@ -7751,17 +7752,23 @@ static int nvme_start_ctrl(NvmeCtrl *n) =C2=A0=C2=A0=C2=A0=C2=A0 nvme_set_timestamp(n, 0ULL); -=C2=A0=C2=A0=C2=A0 /* verify that the command sets of attached namespaces = are supported */ -=C2=A0=C2=A0=C2=A0 for (int i =3D 1; i <=3D NVME_MAX_NAMESPACES; i++) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D nvme_subs= ys_ns(n->subsys, i); +=C2=A0=C2=A0=C2=A0 if (n->subsys) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (int i =3D 1; i <=3D NVME_M= AX_NAMESPACES; i++) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D n->subsys= ->namespaces[i].namespace; -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (ns && nvme_csi_supported(n,= ns->csi) && !ns->params.detached) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns= ->attached || ns->params.shared) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 nvme_attach_ns(n, ns); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!ns) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 continue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!(n->subsys->namespaces[i].= ctrl =3D=3D n) && !ns->params.shared) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 continue; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (nvme_csi_supported(n, ns->c= si) && !ns->params.detached) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 if (!ns->attached || ns->params.shared) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nvme_at= tach_ns(n, ns); +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 } - =C2=A0=C2=A0=C2=A0=C2=A0 nvme_update_dsm_limits(n, NULL); =C2=A0=C2=A0=C2=A0=C2=A0 return 0; @@ -8993,7 +9000,8 @@ static void nvme_realize(PCIDevice *pci_dev, Error=20 **errp) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 r= eturn; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n->subsys->namespaces[ns->param= s.nsid] =3D ns; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n->subsys->namespaces[ns->param= s.nsid].namespace =3D ns; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 n->subsys->namespaces[ns->param= s.nsid].ctrl =3D n; =C2=A0=C2=A0=C2=A0=C2=A0 } =C2=A0} diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 98c1e75a5d29..9cca699b354f 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -742,7 +742,7 @@ static void nvme_ns_realize(DeviceState *dev, Error=20 **errp) =C2=A0=C2=A0=C2=A0=C2=A0 if (!nsid) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 for (i =3D 1; i <=3D NVME= _MAX_NAMESPACES; i++) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (nvm= e_subsys_ns(subsys, i)) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (nvm= e_subsys_ns(n, i)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 continue; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } @@ -754,12 +754,13 @@ static void nvme_ns_realize(DeviceState *dev,=20 Error **errp) =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 e= rror_setg(errp, "no free namespace id"); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 r= eturn; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 } else if (nvme_subsys_ns(subsys, nsid)) { +=C2=A0=C2=A0=C2=A0 } else if (nvme_subsys_ns(n, nsid)) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 error_setg(errp, "namespa= ce id '%d' already allocated", nsid); =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return; =C2=A0=C2=A0=C2=A0=C2=A0 } -=C2=A0=C2=A0=C2=A0 subsys->namespaces[nsid] =3D ns; +=C2=A0=C2=A0=C2=A0 subsys->namespaces[nsid].namespace =3D ns; +=C2=A0=C2=A0=C2=A0 subsys->namespaces[nsid].ctrl =3D n; =C2=A0=C2=A0=C2=A0=C2=A0 ns->id_ns.endgid =3D cpu_to_le16(0x1); =C2=A0=C2=A0=C2=A0=C2=A0 ns->id_ns_ind.endgrpid =3D cpu_to_le16(0x1); diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 6f782ba18826..bea3b96a6dfa 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -97,6 +97,11 @@ typedef struct NvmeEnduranceGroup { =C2=A0=C2=A0=C2=A0=C2=A0 } fdp; =C2=A0} NvmeEnduranceGroup; +typedef struct Namespaces { +=C2=A0=C2=A0=C2=A0 NvmeCtrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 *ctrl; +=C2=A0=C2=A0=C2=A0 NvmeNamespace=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *namespace; +} Namespaces; + =C2=A0typedef struct NvmeSubsystem { =C2=A0=C2=A0=C2=A0=C2=A0 DeviceState parent_obj; =C2=A0=C2=A0=C2=A0=C2=A0 NvmeBus=C2=A0=C2=A0=C2=A0=C2=A0 bus; @@ -104,7 +109,7 @@ typedef struct NvmeSubsystem { =C2=A0=C2=A0=C2=A0=C2=A0 char=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *s= erial; =C2=A0=C2=A0=C2=A0=C2=A0 NvmeCtrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 *ctrls[NVME_MAX_CONTROLLERS]; -=C2=A0=C2=A0=C2=A0 NvmeNamespace=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 *namespaces= [NVME_MAX_NAMESPACES + 1]; +=C2=A0=C2=A0=C2=A0 Namespaces=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 namespaces[NVME_MAX_NAMESPACES + 1]; =C2=A0=C2=A0=C2=A0=C2=A0 NvmeEnduranceGroup endgrp; =C2=A0=C2=A0=C2=A0=C2=A0 struct { @@ -136,16 +141,6 @@ static inline NvmeCtrl=20 *nvme_subsys_ctrl(NvmeSubsystem *subsys, =C2=A0=C2=A0=C2=A0=C2=A0 return subsys->ctrls[cntlid]; =C2=A0} -static inline NvmeNamespace *nvme_subsys_ns(NvmeSubsystem *subsys, -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 uint32_t nsid) -{ -=C2=A0=C2=A0=C2=A0 if (!subsys || !nsid || nsid > NVME_MAX_NAMESPACES) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NULL; -=C2=A0=C2=A0=C2=A0 } - -=C2=A0=C2=A0=C2=A0 return subsys->namespaces[nsid]; -} - =C2=A0#define TYPE_NVME_NS "nvme-ns" =C2=A0#define NVME_NS(obj) \ =C2=A0=C2=A0=C2=A0=C2=A0 OBJECT_CHECK(NvmeNamespace, (obj), TYPE_NVME_NS) @@ -711,6 +706,14 @@ static inline NvmeSecCtrlEntry=20 *nvme_sctrl_for_cntlid(NvmeCtrl *n, =C2=A0=C2=A0=C2=A0=C2=A0 return NULL; =C2=A0} +static inline NvmeNamespace *nvme_subsys_ns(NvmeCtrl *n, uint32_t nsid) +{ +=C2=A0=C2=A0=C2=A0 if (!n->subsys || !nsid || nsid > NVME_MAX_NAMESPACES) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return NULL; +=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0 return n->subsys->namespaces[nsid].namespace; +} + =C2=A0void nvme_attach_ns(NvmeCtrl *n, NvmeNamespace *ns); =C2=A0uint16_t nvme_bounce_data(NvmeCtrl *n, void *ptr, uint32_t len, =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 NvmeTxDirection dir, NvmeRequest *req); diff --git a/hw/nvme/subsys.c b/hw/nvme/subsys.c index 2ae56f12a596..d5751564c05c 100644 --- a/hw/nvme/subsys.c +++ b/hw/nvme/subsys.c @@ -92,13 +92,19 @@ int nvme_subsys_register_ctrl(NvmeCtrl *n, Error **errp) =C2=A0=C2=A0=C2=A0=C2=A0 subsys->ctrls[cntlid] =3D n; -=C2=A0=C2=A0=C2=A0 for (nsid =3D 1; nsid < ARRAY_SIZE(subsys->namespaces);= nsid++) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D subsys->n= amespaces[nsid]; -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (ns && ns->params.shared && = !ns->params.detached) { -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nvme_at= tach_ns(n, ns); +=C2=A0=C2=A0=C2=A0 for (nsid =3D 1; nsid <=3D NVME_MAX_NAMESPACES; nsid++)= { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NvmeNamespace *ns =3D subsys->n= amespaces[nsid].namespace; + +=C2=A0=C2=A0=C2=A0 if (!ns) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continu= e; +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (!(subsys->namespaces[nsid].= ctrl =3D=3D n) && !ns->params.shared) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 continu= e; =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } +=C2=A0=C2=A0=C2=A0 if (ns->params.shared && !ns->params.detached) { +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 nvme_at= tach_ns(n, ns); +=C2=A0=C2=A0=C2=A0 } =C2=A0=C2=A0=C2=A0=C2=A0 } - =C2=A0=C2=A0=C2=A0=C2=A0 return cntlid; =C2=A0} With this fix: =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [root@localhost ~]# nvme list -v Subsystem Subsystem-NQN Controllers ----------------=20 ---------------------------------------------------------------------------= ---------------------=20 ---------------- nvme-subsys1 nqn.2019-08.org.qemu:subsys0 nvme0, nvme1 Device=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Cntlid S= N MN=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=20 FR=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 TxPort Address=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 Slot=C2=A0=C2=A0 Subsystem=C2=A0=C2=A0=C2=A0 Namespac= es ---------------- ------ --------------------=20 ---------------------------------------- -------- ------ --------------=20 ------ ------------ ---------------- nvme0=C2=A0=C2=A0=C2=A0 0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 deadbeef=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QEMU NVMe=20 Ctrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 9.2.92=C2=A0=C2=A0 pcie=C2=A0=C2=A0 0000:00:04.0=C2=A0=C2=A0 4=20 nvme-subsys1 nvme1n2, nvme1n3 nvme1=C2=A0=C2=A0=C2=A0 1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 deadbeef=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 QEMU NVMe=20 Ctrl=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 9.2.92=C2=A0=C2=A0 pcie=C2=A0=C2=A0 0000:00:05.0=C2=A0=C2=A0 5=20 nvme-subsys1 nvme1n1, nvme1n3 Device=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Ge= neric=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 NSID Usag= e=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=20 Format=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Controll= ers ----------------- ----------------- ----------=20 -------------------------- ---------------- ---------------- /dev/nvme1n1 /dev/ng1n1=C2=A0=C2=A0 0x2=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme1 /dev/nvme1n2 /dev/ng1n2=C2=A0=C2=A0 0x1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme0 /dev/nvme1n3 /dev/ng1n3=C2=A0=C2=A0 0x3=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 268.44=C2=A0 GB / 268.44=C2=A0 GB 512=C2=A0=C2=A0 B +=C2=A0=20 0 B=C2=A0=C2=A0 nvme0, nvme1 [root@localhost ~]# nvme id-ctrl /dev/nvme1n1 |=C2=A0 grep awupf awupf=C2=A0=C2=A0=C2=A0=C2=A0 : 63 [root@localhost ~]# nvme id-ctrl /dev/nvme1n2 |=C2=A0 grep awupf awupf=C2=A0=C2=A0=C2=A0=C2=A0 : 15 [root@localhost ~]# Each private namespace is attached to its own controller and that is=20 verified with the AWUPF values.