From nobody Fri Apr 3 18:48:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass(p=quarantine dis=none) header.from=amd.com ARC-Seal: i=2; a=rsa-sha256; t=1774321568; cv=pass; d=zohomail.com; s=zohoarc; b=oEo50H+0V14MNBTAZPARFbrq466A1Dxi+4Xr0ItaYDAYQKes8im1tpMNLX4+JKF9JmyjlUqeSO0XHzXraWOoZM6Jf+lll+OtLitasT+QPd7MndpyodAcZmbS0044o9ue8nrK4IPrl0Jw8AL88Rki9FHqMnqEnJu18xXmzd2TybM= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774321568; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WV4egNB9TZnwYaKXYh+Rx+h6myhXgHRBXuqY5UHC8lA=; b=ch7mlsMqQWcY7LJfEfH/R4cO4TzBaXcY3kwZ90gmske90OYeHb6luaBzp9JV8y8puZZA8Eylr+pGoV6GT4zO53V6bAdcXCw7WuxqIfst+JdgOPfONla454XKMx+TlHTM86zvQfOshscf9uGjbnZ9S/Ltakq/hXjbBuqxArSZgco= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1774321568638939.0801082546192; Mon, 23 Mar 2026 20:06:08 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1259994.1553321 (Exim 4.92) (envelope-from ) id 1w4s5J-00050E-S3; Tue, 24 Mar 2026 03:05:37 +0000 Received: by outflank-mailman (output) from mailman id 1259994.1553321; Tue, 24 Mar 2026 03:05:37 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5J-000507-Od; Tue, 24 Mar 2026 03:05:37 +0000 Received: by outflank-mailman (input) for mailman id 1259994; Tue, 24 Mar 2026 03:05:36 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5I-0004zb-HS for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 03:05:36 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1w4s5H-000PZN-0F for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 04:05:35 +0100 Received: from [10.42.69.12] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69c1ff71-2eae-0a2a0a5409dd-0a2a450cb740-8 for ; Tue, 24 Mar 2026 04:05:34 +0100 Received: from [52.101.57.65] (helo=BN8PR05CU002.outbound.protection.outlook.com) by tlsNG-d25034.mxtls.expurgate.net with ESMTPS (eXpurgate 4.55.2) (envelope-from ) id 69c1ff7d-f93d-0a2a450c0019-346539417bf2-3 for ; Tue, 24 Mar 2026 04:05:34 +0100 Received: from CH0PR04CA0037.namprd04.prod.outlook.com (2603:10b6:610:77::12) by DS0PR12MB8245.namprd12.prod.outlook.com (2603:10b6:8:f2::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Tue, 24 Mar 2026 03:05:26 +0000 Received: from CH1PEPF0000A34C.namprd04.prod.outlook.com (2603:10b6:610:77:cafe::5a) by CH0PR04CA0037.outlook.office365.com (2603:10b6:610:77::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9723.31 via Frontend Transport; Tue, 24 Mar 2026 03:05:22 +0000 Received: from satlexmb08.amd.com (165.204.84.17) by CH1PEPF0000A34C.mail.protection.outlook.com (10.167.244.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Tue, 24 Mar 2026 03:05:25 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 22:05:25 -0500 Received: from satlexmb08.amd.com (10.181.42.217) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 20:05:24 -0700 Received: from ubuntu (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 23 Mar 2026 22:05:18 -0500 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=iUzKH7dVbODvzzcf9wFX+mMB+ls0fwpjSwfY/spix55aZYpf9zsk+zRtUXa0tI2U34oF8fL6gO3sFdLBLQRJRkGGpX73JB74t3mVBRRqZBABdU9M6oaUGXwER423l54RQHxtowoi/orlbRiDXS1qU9DygjhoD6QPFz78GXRm5m0fZYr8xD8nwYvX9ay2G1MM8KTMy+N6KaoncPFlWWBPODnt9YZoWrUE+sS5KmfDqIGvN1rXjGgq5u7dapydAljQicfinCixC4tnPylD6RB8ebXYLji3j8ej/YC4+XcCkkfgSj+DJD5uspGQPFBTKQGcq7qSn7T3fxVcrz6o0SljsQ== 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=WV4egNB9TZnwYaKXYh+Rx+h6myhXgHRBXuqY5UHC8lA=; b=niYTQ7D1YGB2rwz6GVUeOKz6OyzOjsef29exO8kSGI3wdH+Ulx9rFukNeQRf2YA8m2FrSfez/BfLUOPZeEHpOfQmgqybJ2spyB/s3/pJenayoUlzzZXVxS+eNU36t8t6Qo1NuNOsupLcgO1WpicR3KSD2cjULp7sGYtAQPS89zjE5H3cG2jMEAGxBY5EJaR9SN7eLO7JK/lfAeip4t5KizT+9vkIYDUY2RaXp0+MfZ/L1cXljkwwU6aQ34psoSKwvN1n6gNKy58S4FPjq+RnqpzXWksGVQP188dL1ObWvD72AQdQCjBZosadGQucpS7BcR4Anxx5duDRNuYy31yXHw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=WV4egNB9TZnwYaKXYh+Rx+h6myhXgHRBXuqY5UHC8lA=; b=jWZ9uBJ2PNbzelkMorHyvrlNP0RLQX3OW8LxShu8eJaHcjl9nBmHHx1jWeFyydMGmOCBObAzrAXoQsOT2qk1mKj/OqjibVXlFTle1CxH72vfjOhrYVoNnSKJAXbuCgezRdb76xNx9RuxrT9XXcz6dZZch6WbdbFpNxVMIjKejbc= X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C From: Stewart Hildebrand To: CC: Mykyta Poturai , Andrew Cooper , Anthony PERARD , Michal Orzel , Jan Beulich , "Julien Grall" , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= , Stefano Stabellini , "Stewart Hildebrand" , Mykyta Poturai Subject: [PATCH v3 1/4] vpci: Use pervcpu ranges for BAR mapping Date: Mon, 23 Mar 2026 23:04:58 -0400 Message-ID: <20260324030513.700217-2-stewart.hildebrand@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324030513.700217-1-stewart.hildebrand@amd.com> References: <20260324030513.700217-1-stewart.hildebrand@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A34C:EE_|DS0PR12MB8245:EE_ X-MS-Office365-Filtering-Correlation-Id: 4654589d-1a34-48cf-4706-08de89523216 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700016|376014|13003099007|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: iFiBXUIUwtUnq4rUul6RIHRH7AzoRojO4DT4HZU4fziWJqGKjQESnI50ZcAZu5u5YjW4rFnqQzIhglGa2kLwzY1O2pSsH0kq7x4KGvNG5OhgImZGHu6LY5UIWrN2G12Pcy2Mx6GzuxB2nAIGpBEVFEsbkI2sJkcI3fuzJEJhrmNz6gymko9IvTgf9Xxy9hB1Zd2ElQocFfaV0NPA2gti3XVQmmalXRmUurCyp8EF9DruArRELQ66vDlLFDPBFc6m77dfTKG5C5/gSZ8QJeZyy6RjAL9ndfwd9kIX0+ptLE8aJmE7qySgkEjHwguQahW8uRZzzFhGtfStpT1yZeWOpt2Pfzm1kT9buaNFltKkXflNcKF05MevLFp+iLXgqziq3IB1om68qV+18xsADTnIQWdJzZ2BLh8qszSD8dv/0gLt8nMbXY9avUlkGO6e6o/qGO8jFPb0cgYJjg7NfMqgJbVw05Bq4ZZFUDTGrEji1/KJS3IxpHsCHTHho//Ui/t3Ctxys9ITWrz1R/3J2D9I+aYfaVSYNRIldwdmU9Ki73FGT704NMZpDp9YDbRzaLAB33DlTayF1v9C56knJb5tyDiii4vUAADZylu+DUrBwBpjA+PPSjCkP6Y0uTyaWdQ0l/heNEbT0aRCrV9VRpU45J8TK4g1EvgpwwIdVXpZAEfdqcVViOdDoAs1SAo6LJ1NxbGnjLfsFR+G4ALp2gqJ7i/X5JRsYGswm9PgFi+PCH0cuS++Xsu9sKgyYkD10xOT3lA8gsqJgjAoZ6z7Wq76akbW6bg3uNgFTx7w1Vm5wTQ= X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700016)(376014)(13003099007)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: fvS2nnfS2Cw9Xx6KrESkgkNJ4G6xN60Gb5csxTQiVlcaSvW/KkZIqL2hs5Qk3HSK2ODm1bRo6awg2tyAKN+7pVM3RSEUTk9+XpW7d1sOfF4f5COaYP1D1R576lQtTaqY3nCnjUleWQ5J6NzKLXZFttGSeoHg79BrbXvAJ0lQWkCctKhE1lHnx0Bpk2w4B7Khz0h876oY5WVwu8KPQhw3fN42SusYzC3ADjtXVYrYKysU5CPuynrFMMiRkp+Q8O78O84RHknnYqrwhTGZUor6qFmpeaQtO9S84y6CeQdbt/FVmfPXfO5+nlvm5u/NGsvrerIRC2zvO7wYDaZ8NdzxnuWOG/H44Xfin0PuIF3wMLRQXqSKmLeYvWb61RTZId4V8A2i5rizQ7RtgJ+Bl0pZRt65kJT16ybwgmPKsINawadhnbOZJ551h3nVKL5XeGqc X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:05:25.3303 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4654589d-1a34-48cf-4706-08de89523216 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH1PEPF0000A34C.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8245 X-purgate-ID: tlsNG-d25034/1774321534-FC82D734-862E4D03/0/0 X-purgate-type: clean X-purgate-size: 13670 X-ZohoMail-DKIM: pass (identity @amd.com) X-ZM-MESSAGEID: 1774321572002154100 Content-Type: text/plain; charset="utf-8" From: Mykyta Poturai There is no need to store ranges for each PCI device, as they are only used during the mapping/unmapping process and can be reused for each device. This also allows to avoid the need to allocate and destroy rangesets for each device. Move the rangesets from struct vpci_bar to struct vpci_vcpu and perform (de-)allocation with vcpu (de-)allocation. Introduce RANGESET_DESTROY() macro to free a rangeset and set the pointer to NULL. Amends: 622bdd962822 ("vpci/header: handle p2m range sets per BAR") Signed-off-by: Mykyta Poturai Signed-off-by: Stewart Hildebrand --- v2->v3: * new patch in this series, borrowed from [1] * add Amends tag * remove unused variable i due to rebasing over 998060dd9101 ("vPCI: move vpci_init_capabilities() to a separate file") * enclose entire struct vpci_vcpu inside #ifdef __XEN__ * s/bar_mem/mem/ * use ARRAY_SIZE * put init/destroy in functions * only allocate for domains with vPCI and idle domain * replace 'if ( !mem ) continue;' with ASSERT v1->v2 (in SR-IOV series [1]): * new patch [1] https://lore.kernel.org/xen-devel/cover.1772806036.git.mykyta_poturai@e= pam.com/T/#t --- xen/common/domain.c | 5 +++ xen/drivers/vpci/header.c | 67 ++++++++++++++------------------------ xen/drivers/vpci/vpci.c | 36 +++++++++++++++++--- xen/include/xen/rangeset.h | 7 ++++ xen/include/xen/vpci.h | 10 ++++-- 5 files changed, 75 insertions(+), 50 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index ab910fcf9306..498357fd0f11 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -454,6 +454,8 @@ static int vcpu_teardown(struct vcpu *v) */ static void vcpu_destroy(struct vcpu *v) { + vpci_vcpu_destroy(v); + free_vcpu_struct(v); } =20 @@ -511,6 +513,9 @@ struct vcpu *vcpu_create(struct domain *d, unsigned int= vcpu_id) if ( arch_vcpu_create(v) !=3D 0 ) goto fail_sched; =20 + if ( vpci_vcpu_init(v) ) + goto fail_sched; + d->vcpu[vcpu_id] =3D v; if ( vcpu_id !=3D 0 ) { diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index a760d8c32fd6..89dce932f3b1 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -196,6 +196,7 @@ bool vpci_process_pending(struct vcpu *v) for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) { struct vpci_bar *bar =3D &header->bars[i]; + struct rangeset *mem =3D v->vpci.mem[i]; struct map_data data =3D { .d =3D v->domain, .map =3D v->vpci.cmd & PCI_COMMAND_MEMORY, @@ -203,10 +204,10 @@ bool vpci_process_pending(struct vcpu *v) }; int rc; =20 - if ( rangeset_is_empty(bar->mem) ) + if ( rangeset_is_empty(mem) ) continue; =20 - rc =3D rangeset_consume_ranges(bar->mem, map_range, &data); + rc =3D rangeset_consume_ranges(mem, map_range, &data); =20 if ( rc =3D=3D -ERESTART ) { @@ -224,8 +225,8 @@ bool vpci_process_pending(struct vcpu *v) =20 /* Clean all the rangesets */ for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) - if ( !rangeset_is_empty(header->bars[i].mem) ) - rangeset_purge(header->bars[i].mem); + if ( !rangeset_is_empty(v->vpci.mem[i]) ) + rangeset_purge(v->vpci.mem[i]); =20 v->vpci.pdev =3D NULL; =20 @@ -260,13 +261,14 @@ static int __init apply_map(struct domain *d, const s= truct pci_dev *pdev, for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) { struct vpci_bar *bar =3D &header->bars[i]; + struct rangeset *mem =3D current->vpci.mem[i]; struct map_data data =3D { .d =3D d, .map =3D true, .bar =3D bar }; =20 - if ( rangeset_is_empty(bar->mem) ) + if ( rangeset_is_empty(mem) ) continue; =20 - while ( (rc =3D rangeset_consume_ranges(bar->mem, map_range, - &data)) =3D=3D -ERESTART ) + while ( (rc =3D rangeset_consume_ranges(mem, map_range, &data)) = =3D=3D + -ERESTART ) { /* * It's safe to drop and reacquire the lock in this context @@ -331,13 +333,13 @@ static int modify_bars(const struct pci_dev *pdev, ui= nt16_t cmd, bool rom_only) for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) { struct vpci_bar *bar =3D &header->bars[i]; + struct rangeset *mem =3D current->vpci.mem[i]; unsigned long start =3D PFN_DOWN(bar->addr); unsigned long end =3D PFN_DOWN(bar->addr + bar->size - 1); unsigned long start_guest =3D PFN_DOWN(bar->guest_addr); unsigned long end_guest =3D PFN_DOWN(bar->guest_addr + bar->size -= 1); =20 - if ( !bar->mem ) - continue; + ASSERT(mem); =20 if ( !MAPPABLE_BAR(bar) || (rom_only ? bar->type !=3D VPCI_BAR_ROM @@ -354,7 +356,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) continue; } =20 - ASSERT(rangeset_is_empty(bar->mem)); + ASSERT(rangeset_is_empty(mem)); =20 /* * Make sure that the guest set address has the same page offset @@ -369,7 +371,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) return -EINVAL; } =20 - rc =3D rangeset_add_range(bar->mem, start_guest, end_guest); + rc =3D rangeset_add_range(mem, start_guest, end_guest); if ( rc ) { printk(XENLOG_G_WARNING "Failed to add [%lx, %lx]: %d\n", @@ -380,12 +382,12 @@ static int modify_bars(const struct pci_dev *pdev, ui= nt16_t cmd, bool rom_only) /* Check for overlap with the already setup BAR ranges. */ for ( j =3D 0; j < i; j++ ) { - struct vpci_bar *prev_bar =3D &header->bars[j]; + struct rangeset *prev_mem =3D current->vpci.mem[j]; =20 - if ( rangeset_is_empty(prev_bar->mem) ) + if ( rangeset_is_empty(prev_mem) ) continue; =20 - rc =3D rangeset_remove_range(prev_bar->mem, start_guest, end_g= uest); + rc =3D rangeset_remove_range(prev_mem, start_guest, end_guest); if ( rc ) { gprintk(XENLOG_WARNING, @@ -395,7 +397,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) } } =20 - rc =3D pci_sanitize_bar_memory(bar->mem); + rc =3D pci_sanitize_bar_memory(mem); if ( rc ) { gprintk(XENLOG_WARNING, @@ -412,14 +414,14 @@ static int modify_bars(const struct pci_dev *pdev, ui= nt16_t cmd, bool rom_only) unsigned long end =3D PFN_DOWN(vmsix_table_addr(pdev->vpci, i) + vmsix_table_size(pdev->vpci, i) - 1); =20 - for ( j =3D 0; j < ARRAY_SIZE(header->bars); j++ ) + for ( j =3D 0; j < ARRAY_SIZE(current->vpci.mem); j++ ) { - const struct vpci_bar *bar =3D &header->bars[j]; + struct rangeset *mem =3D current->vpci.mem[j]; =20 - if ( rangeset_is_empty(bar->mem) ) + if ( rangeset_is_empty(mem) ) continue; =20 - rc =3D rangeset_remove_range(bar->mem, start, end); + rc =3D rangeset_remove_range(mem, start, end); if ( rc ) { gprintk(XENLOG_WARNING, @@ -469,8 +471,9 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) for ( j =3D 0; j < ARRAY_SIZE(header->bars); j++) { const struct vpci_bar *bar =3D &header->bars[j]; + struct rangeset *mem =3D current->vpci.mem[j]; =20 - if ( !rangeset_overlaps_range(bar->mem, start, end) || + if ( !rangeset_overlaps_range(mem, start, end) || /* * If only the ROM enable bit is toggled check ag= ainst * other BARs in the same device for overlaps, bu= t not @@ -481,7 +484,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) bar->type =3D=3D VPCI_BAR_ROM) ) continue; =20 - rc =3D rangeset_remove_range(bar->mem, start, end); + rc =3D rangeset_remove_range(mem, start, end); if ( rc ) { gprintk(XENLOG_WARNING, @@ -732,18 +735,6 @@ static void cf_check rom_write( } } =20 -static int bar_add_rangeset(const struct pci_dev *pdev, struct vpci_bar *b= ar, - unsigned int i) -{ - char str[32]; - - snprintf(str, sizeof(str), "%pp:BAR%u", &pdev->sbdf, i); - - bar->mem =3D rangeset_new(pdev->domain, str, RANGESETF_no_print); - - return !bar->mem ? -ENOMEM : 0; -} - int vpci_init_header(struct pci_dev *pdev) { uint16_t cmd; @@ -853,10 +844,6 @@ int vpci_init_header(struct pci_dev *pdev) else bars[i].type =3D VPCI_BAR_MEM32; =20 - rc =3D bar_add_rangeset(pdev, &bars[i], i); - if ( rc ) - goto fail; - rc =3D pci_size_mem_bar(pdev->sbdf, reg, &addr, &size, (i =3D=3D num_bars - 1) ? PCI_BAR_LAST : 0); if ( rc < 0 ) @@ -909,12 +896,6 @@ int vpci_init_header(struct pci_dev *pdev) 4, rom); if ( rc ) rom->type =3D VPCI_BAR_EMPTY; - else - { - rc =3D bar_add_rangeset(pdev, rom, num_bars); - if ( rc ) - goto fail; - } } else if ( !is_hwdom ) { diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 0ac9ec8b0475..8e6343653078 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -24,6 +24,37 @@ =20 #ifdef __XEN__ =20 +void vpci_vcpu_destroy(struct vcpu *v) +{ + unsigned int i; + + if ( !has_vpci(v->domain) && !is_idle_domain(v->domain) ) + return; + + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.mem); i++ ) + RANGESET_DESTROY(v->vpci.mem[i]); +} + +int vpci_vcpu_init(struct vcpu *v) +{ + unsigned int i; + + if ( !has_vpci(v->domain) && !is_idle_domain(v->domain) ) + return 0; + + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.mem); i++ ) + { + char str[32]; + + snprintf(str, sizeof(str), "%pv:BAR%u", v, i); + v->vpci.mem[i] =3D rangeset_new(v->domain, str, RANGESETF_no_print= ); + if ( !v->vpci.mem[i] ) + return -ENOMEM; + } + + return 0; +} + #ifdef CONFIG_HAS_VPCI_GUEST_SUPPORT static int assign_virtual_sbdf(struct pci_dev *pdev) { @@ -89,8 +120,6 @@ struct vpci_register *vpci_get_register(const struct vpc= i *vpci, =20 void vpci_deassign_device(struct pci_dev *pdev) { - unsigned int i; - ASSERT(rw_is_write_locked(&pdev->domain->pci_lock)); =20 if ( !has_vpci(pdev->domain) || !pdev->vpci ) @@ -116,9 +145,6 @@ void vpci_deassign_device(struct pci_dev *pdev) } spin_unlock(&pdev->vpci->lock); =20 - for ( i =3D 0; i < ARRAY_SIZE(pdev->vpci->header.bars); i++ ) - rangeset_destroy(pdev->vpci->header.bars[i].mem); - xfree(pdev->vpci); pdev->vpci =3D NULL; } diff --git a/xen/include/xen/rangeset.h b/xen/include/xen/rangeset.h index 817505badf6f..f01e00ec9234 100644 --- a/xen/include/xen/rangeset.h +++ b/xen/include/xen/rangeset.h @@ -40,6 +40,13 @@ struct rangeset *rangeset_new( void rangeset_destroy( struct rangeset *r); =20 +/* Destroy a rangeset, and zero the pointer to it. */ +#define RANGESET_DESTROY(r) \ + ({ \ + rangeset_destroy(r); \ + (r) =3D NULL; \ + }) + /* * Set a limit on the number of ranges that may exist in set @r. * NOTE: This must be called while @r is empty. diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index 877aa391d178..b55bacbe6e01 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -19,6 +19,9 @@ */ #define VPCI_MAX_VIRT_DEV (PCI_SLOT(~0) + 1) =20 +void vpci_vcpu_destroy(struct vcpu *v); +int vpci_vcpu_init(struct vcpu *v); + /* Assign vPCI to device by adding handlers. */ int __must_check vpci_assign_device(struct pci_dev *pdev); =20 @@ -54,7 +57,6 @@ struct vpci { uint64_t guest_addr; uint64_t size; uint64_t resizable_sizes; - struct rangeset *mem; enum { VPCI_BAR_EMPTY, VPCI_BAR_IO, @@ -152,14 +154,15 @@ struct vpci { #endif }; =20 +#ifdef __XEN__ struct vpci_vcpu { /* Per-vcpu structure to store state while {un}mapping of PCI BARs. */ const struct pci_dev *pdev; + struct rangeset *mem[ARRAY_SIZE(((struct vpci_header *)NULL)->bars)]; uint16_t cmd; bool rom_only : 1; }; =20 -#ifdef __XEN__ void vpci_dump_msi(void); =20 /* Arch-specific vPCI MSI helpers. */ @@ -204,6 +207,9 @@ bool vpci_ecam_read(pci_sbdf_t sbdf, unsigned int reg, = unsigned int len, #else /* !CONFIG_HAS_VPCI */ struct vpci_vcpu {}; =20 +static inline void vpci_vcpu_destroy(struct vcpu *v) { } +static inline int vpci_vcpu_init(struct vcpu *v) { return 0; } + static inline int vpci_reinit_ext_capabilities(struct pci_dev *pdev) { return 0; --=20 2.53.0 From nobody Fri Apr 3 18:48:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass(p=quarantine dis=none) header.from=amd.com ARC-Seal: i=2; a=rsa-sha256; t=1774321563; cv=pass; d=zohomail.com; s=zohoarc; b=CahhjN1kpVcMzIe3DcYgOCGvVxu22Mp+W78+YypRMGq9BPyuqgsLUbnVONYOKlHiITEjAGTGf3KyL7O7TQLP9tGkyawpk27sgID3RI2DaET6a73jaJsFFT485SSWh+tYuuYZTwZBRoRGUOwnVTr4dTTLC/lElQhSLmZjTrwKowY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774321563; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=JHZJW9WDn0STWGtdXipUHQXXnVAbQYDfOvCtR2vCnXQ=; b=CnE0VaBksO1j0M9EqrZ6YB9QQrxib1fBiZrQoYq3VFK1KkPoL7pC9pnuTg8TiKB6cyy4xN7/uC1eMg4XGMB0iY78rtVnscwvBmed6aRR2FbghFbgOqNuDpjk/63h7RtRzKcaCiO6ARZcV47lhj0PQTRyiijrgsYj6a7xgbJSGY8= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1774321563870744.3063147314342; Mon, 23 Mar 2026 20:06:03 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1259998.1553331 (Exim 4.92) (envelope-from ) id 1w4s5S-0005J0-8w; Tue, 24 Mar 2026 03:05:46 +0000 Received: by outflank-mailman (output) from mailman id 1259998.1553331; Tue, 24 Mar 2026 03:05:46 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5S-0005Ir-6D; Tue, 24 Mar 2026 03:05:46 +0000 Received: by outflank-mailman (input) for mailman id 1259998; Tue, 24 Mar 2026 03:05:44 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5Q-0005H3-QC for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 03:05:44 +0000 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012016.outbound.protection.outlook.com [52.101.48.16]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id 56dae6a3-272e-11f1-b166-2bf370ae4941; Tue, 24 Mar 2026 04:05:41 +0100 (CET) Received: from SJ0PR05CA0099.namprd05.prod.outlook.com (2603:10b6:a03:334::14) by SA3PR12MB7999.namprd12.prod.outlook.com (2603:10b6:806:312::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Tue, 24 Mar 2026 03:05:33 +0000 Received: from MW1PEPF0001615F.namprd21.prod.outlook.com (2603:10b6:a03:334:cafe::78) by SJ0PR05CA0099.outlook.office365.com (2603:10b6:a03:334::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9723.25 via Frontend Transport; Tue, 24 Mar 2026 03:05:30 +0000 Received: from satlexmb07.amd.com (165.204.84.17) by MW1PEPF0001615F.mail.protection.outlook.com (10.167.249.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.0 via Frontend Transport; Tue, 24 Mar 2026 03:05:31 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb07.amd.com (10.181.42.216) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 22:05:31 -0500 Received: from satlexmb08.amd.com (10.181.42.217) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 20:05:31 -0700 Received: from ubuntu (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 23 Mar 2026 22:05:30 -0500 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 56dae6a3-272e-11f1-b166-2bf370ae4941 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Iw+eMHjusyykH3qKhLlwGm4+rgdoAqyS89199VRhViKj52DshH1vUAii0Du6l5eJK1nviaLyjNRkMZ7NDNIlJHHP86v0cKU+fdBvCwFbvva2YxejaH+44RB2cgOhtfcwtpp4X0ZcH9o+4JYFKfmQP1JqHV/75KPA299+0uCvUpY5/KO6le6loqy2orRD6433OXtkgXhhzJTtavkXxUM41lhEBclTTBg3ZdiVKjOlrqe0pWPV4Y7nxrookoWjpteh8PJwyA9tFKHACeNWWzNHs2F3iPVCJuxGOVVUS2iMweiqcGUGHu4rVEDWgcCGyJiZ4C7nOg88qwbNchp4eVlbcQ== 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=JHZJW9WDn0STWGtdXipUHQXXnVAbQYDfOvCtR2vCnXQ=; b=QPLJh9qG20QEM6bx+mUuwm0h8KqwhzQm0iLJyMIefOxjBwUKn9Hc9F9uj0TqThgMlddFn967r7ucML+Tjo4PKTnwc+Fi1ILOvTSOLHsZa9aKntMn+duTjl9n/6LwjVwlFRRpgmqiesI6ISNUDeCiJgbEmaLGnG/AsmVcB2XC6SXGKbZ5F6pFX/Eeb/7yH1PDVPG1ks091xZEjUFtRt/Lm48v/zcWVYPRbDyyisCn8iRACEEhoUtjZPhVkaQTswLAqJdc9gdHjPeFn/HgjFVgVuTKohH/R9oPnD6hUx6nnmjQoMgk/wuHdEvMF6c6r7xz3CzdJ0bGsflCZqQz2RucTQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JHZJW9WDn0STWGtdXipUHQXXnVAbQYDfOvCtR2vCnXQ=; b=KpkDWrYAJaH0iTBukXjZv5x3AArTmKQFxcZ9jOeaVZiOeH5KFtLNk6D2NlexCQvABT9ERXbgQSv+EUPLtejbMmsm2mXPUJww2dsDGBWGNR+LaGwdE45ZzQK+q5phwNI968Sncvbw6mLJsX6Li3vJ4IddskIM+TPEXR/JIwviu+8= X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb07.amd.com; pr=C From: Stewart Hildebrand To: CC: Stewart Hildebrand , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v3 2/4] vpci: allow queueing of mapping operations Date: Mon, 23 Mar 2026 23:04:59 -0400 Message-ID: <20260324030513.700217-3-stewart.hildebrand@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324030513.700217-1-stewart.hildebrand@amd.com> References: <20260324030513.700217-1-stewart.hildebrand@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MW1PEPF0001615F:EE_|SA3PR12MB7999:EE_ X-MS-Office365-Filtering-Correlation-Id: dec31223-e36b-49b2-df63-08de89523605 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|1800799024|376014|13003099007|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: +TWipBCn7SZUG3jPfdBoE7SsJlU7fJwUrp192eKG8Q923tQTUWKYDk8PyB0Az00p4Aa7e1oK7CxnZI9H6BjLYD0/CxRXDPFmTrOhcbdMlFiJopYf7B/qk/oPZYJ9II1tnWyMnHWHgFlCNxtAU65m+BXcmqlAWZ0E+Y5qjORu6Y0UJlyJZ9UrxtA6Q/irxEMqsit+9O4j44SslG+iFtAaBcNSs/keIlxvagkcFS5VyRpbtTECfqPFI0LeLNkrfSi5emgJ3bVxlRuLSSmXaaY+eWfbysv3R6zngqzeeNNJ6mdxfHbFh0GLplC82R2gmlGGYX4IUtDzEi9CveahKboQ5sil3QriTxaNeb9fNgXyyk9tM+L3Abwfn4HZuT1qSrTwqBVpjQKDThHv02hvRJPEMtKC4baAWPmTJLG9i72k1L2Z4d1kVzT5IWZKRZIMwwJPXOk2Jv1gzaJUG43IY6J9O/j3mf8jj1iK9LKQ2YfflWUgsOL1MhpGCki2FPe5meEC/BMnL8mt16gqJx6Boas2uuhphAUB8DmtLXHL1Aj1At56Jgp89D7Zvv/cq4qlUqhenfV+nEkU0GTdCRHaRWOUDnfMkeY0Kdkp2WbQIeTJoV9a8n/oY+EkLcqjSgKGGZ74rgJ2beG1DVV4ZhvEmflZaQJa0Yodw3pciBKNJdxbX4XRO1nZflvbE8KO7jLwNoR65zQGm/iE7fCiQDX6pqU00nPT9YUhFjZ6khBeijzt9EkCzF/ATSVMqU/o6POGi4w3mioo9Wr3OU/djrOUmxwWBA== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb07.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(1800799024)(376014)(13003099007)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: g2+sCOUQXqUSIlww1tBrzZ0+kHo//9AMThDhxh00jQe+81ndrbP+9U6g81da0OX/4npu2/yGNQ/l0BIZv2eE+BciauNF2P04BNr6Vfmcl/PFbufJNHsPEH5u1xe2A0irlt9FQ8rSbENUDBX4ZKjD8rM/rSKoYjiNPY3Fg1NWYglRLMcmZKQS344joqT34g4pVV+r9vvWa3qdEyu5l+wHz5CBxmdITVcqKy7A2ELrAX0cB/o3GsjKlVlkoYkMGaXUooaCG2cvFRhgEgxNdi6CS+5a6ji2BpkrUj3P5AtmUVbE46IRiJsD6fpCSP0OEgsghbQOUe0WSbsmBaf7O76FgroUJpiNePsOeRMv7knBI1jaIK7L0m1SVeNSB2Y7hr4w4pvdyPRzPNFG3o5H0OHbmnqOHL0geZ0RNdgHCFeYb4kgouAIS9I1CTow3A/XtkcZ X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:05:31.8512 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dec31223-e36b-49b2-df63-08de89523605 X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb07.amd.com] X-MS-Exchange-CrossTenant-AuthSource: MW1PEPF0001615F.namprd21.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB7999 X-ZohoMail-DKIM: pass (identity @amd.com) X-ZM-MESSAGEID: 1774321565448154100 Content-Type: text/plain; charset="utf-8" Introduce vPCI BAR mapping task queue. Store information necessary in an array in struct vpci_vcpu to perform multiple p2m operations associated with single device. This is preparatory work for further changes that need to perform multiple unmap/map operations before returning to guest. At the moment, only a single slot is needed in the array. However, when multiple operations are queued and pending, there is a check in modify_bars() to skip BARs already in the requested state that is not accurate. Remove this check. Signed-off-by: Stewart Hildebrand --- apply_map() and vpci_process_map_task() are very similar. Should we try to combine them into a single function? v2->v3: * base on ("vpci: Use pervcpu ranges for BAR mapping") from [1] * rework with fixed array of map/unmap slots [1] https://lore.kernel.org/xen-devel/cover.1772806036.git.mykyta_poturai@e= pam.com/T/#t v1->v2: * new patch --- xen/drivers/vpci/header.c | 154 +++++++++++++++++++++++--------------- xen/drivers/vpci/vpci.c | 27 ++++--- xen/include/xen/vpci.h | 15 +++- 3 files changed, 122 insertions(+), 74 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 89dce932f3b1..e57c00839841 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -35,7 +35,7 @@ =20 struct map_data { struct domain *d; - const struct vpci_bar *bar; + const struct vpci_bar_map *bar; bool map; }; =20 @@ -174,32 +174,23 @@ static void modify_decoding(const struct pci_dev *pde= v, uint16_t cmd, ASSERT_UNREACHABLE(); } =20 -bool vpci_process_pending(struct vcpu *v) +static int vpci_process_map_task(const struct pci_dev *pdev, + struct vpci_map_task *task) { - const struct pci_dev *pdev =3D v->vpci.pdev; - struct vpci_header *header =3D NULL; unsigned int i; =20 - if ( !pdev ) - return false; + ASSERT(rw_is_locked(&pdev->domain->pci_lock)); =20 - read_lock(&v->domain->pci_lock); - - if ( !pdev->vpci || (v->domain !=3D pdev->domain) ) - { - v->vpci.pdev =3D NULL; - read_unlock(&v->domain->pci_lock); - return false; - } + if ( !task->pending ) + return 0; =20 - header =3D &pdev->vpci->header; - for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) + for ( i =3D 0; i < ARRAY_SIZE(task->bars); i++ ) { - struct vpci_bar *bar =3D &header->bars[i]; - struct rangeset *mem =3D v->vpci.mem[i]; + struct vpci_bar_map *bar =3D &task->bars[i]; + struct rangeset *mem =3D bar->mem; struct map_data data =3D { - .d =3D v->domain, - .map =3D v->vpci.cmd & PCI_COMMAND_MEMORY, + .d =3D pdev->domain, + .map =3D task->cmd & PCI_COMMAND_MEMORY, .bar =3D bar, }; int rc; @@ -210,58 +201,91 @@ bool vpci_process_pending(struct vcpu *v) rc =3D rangeset_consume_ranges(mem, map_range, &data); =20 if ( rc =3D=3D -ERESTART ) - { - read_unlock(&v->domain->pci_lock); - return true; - } + return rc; =20 if ( rc ) { spin_lock(&pdev->vpci->lock); /* Disable memory decoding unconditionally on failure. */ - modify_decoding(pdev, v->vpci.cmd & ~PCI_COMMAND_MEMORY, - false); + modify_decoding(pdev, task->cmd & ~PCI_COMMAND_MEMORY, false); spin_unlock(&pdev->vpci->lock); =20 /* Clean all the rangesets */ - for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) - if ( !rangeset_is_empty(v->vpci.mem[i]) ) - rangeset_purge(v->vpci.mem[i]); - - v->vpci.pdev =3D NULL; + for ( i =3D 0; i < ARRAY_SIZE(task->bars); i++ ) + if ( !rangeset_is_empty(mem) ) + rangeset_purge(mem); =20 - read_unlock(&v->domain->pci_lock); + if ( !is_hardware_domain(pdev->domain) ) + domain_crash(pdev->domain); =20 - if ( !is_hardware_domain(v->domain) ) - domain_crash(v->domain); + task->pending =3D false; =20 - return false; + return rc; } } - v->vpci.pdev =3D NULL; =20 spin_lock(&pdev->vpci->lock); - modify_decoding(pdev, v->vpci.cmd, v->vpci.rom_only); + modify_decoding(pdev, task->cmd, task->rom_only); spin_unlock(&pdev->vpci->lock); =20 + task->pending =3D false; + + return 0; +} + +bool vpci_process_pending(struct vcpu *v) +{ + const struct pci_dev *pdev =3D v->vpci.pdev; + unsigned int i; + + if ( !pdev ) + return false; + + read_lock(&v->domain->pci_lock); + + if ( !pdev->vpci || (v->domain !=3D pdev->domain) ) + { + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.task); i++ ) + v->vpci.task[i].pending =3D false; + + v->vpci.pdev =3D NULL; + read_unlock(&v->domain->pci_lock); + return false; + } + + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.task); i++ ) + { + struct vpci_map_task *task =3D &(v->vpci.task[i]); + int rc =3D vpci_process_map_task(pdev, task); + + if ( rc =3D=3D -ERESTART ) + { + read_unlock(&v->domain->pci_lock); + return true; + } + + if ( rc ) + break; + } + v->vpci.pdev =3D NULL; + read_unlock(&v->domain->pci_lock); =20 return false; } =20 static int __init apply_map(struct domain *d, const struct pci_dev *pdev, - uint16_t cmd) + struct vpci_map_task *task) { - struct vpci_header *header =3D &pdev->vpci->header; int rc =3D 0; unsigned int i; =20 ASSERT(rw_is_write_locked(&d->pci_lock)); =20 - for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) + for ( i =3D 0; i < ARRAY_SIZE(task->bars); i++ ) { - struct vpci_bar *bar =3D &header->bars[i]; - struct rangeset *mem =3D current->vpci.mem[i]; + struct vpci_bar_map *bar =3D &task->bars[i]; + struct rangeset *mem =3D bar->mem; struct map_data data =3D { .d =3D d, .map =3D true, .bar =3D bar }; =20 if ( rangeset_is_empty(mem) ) @@ -281,12 +305,14 @@ static int __init apply_map(struct domain *d, const s= truct pci_dev *pdev, } } if ( !rc ) - modify_decoding(pdev, cmd, false); + modify_decoding(pdev, task->cmd, false); + + task->pending =3D false; =20 return rc; } =20 -static void defer_map(const struct pci_dev *pdev, uint16_t cmd, bool rom_o= nly) +static void defer_map(const struct pci_dev *pdev) { struct vcpu *curr =3D current; =20 @@ -297,8 +323,7 @@ static void defer_map(const struct pci_dev *pdev, uint1= 6_t cmd, bool rom_only) * started for the same device if the domain is not well-behaved. */ curr->vpci.pdev =3D pdev; - curr->vpci.cmd =3D cmd; - curr->vpci.rom_only =3D rom_only; + /* * Raise a scheduler softirq in order to prevent the guest from resumi= ng * execution with pending mapping operations, to trigger the invocation @@ -307,16 +332,20 @@ static void defer_map(const struct pci_dev *pdev, uin= t16_t cmd, bool rom_only) raise_softirq(SCHEDULE_SOFTIRQ); } =20 -static int modify_bars(const struct pci_dev *pdev, uint16_t cmd, bool rom_= only) +static int modify_bars(const struct pci_dev *pdev, uint16_t cmd, bool rom_= only, + unsigned int map_slot) { struct vpci_header *header =3D &pdev->vpci->header; struct pci_dev *tmp; const struct domain *d; const struct vpci_msix *msix =3D pdev->vpci->msix; + struct vpci_map_task *task =3D ¤t->vpci.task[map_slot]; unsigned int i, j; int rc; =20 ASSERT(rw_is_write_locked(&pdev->domain->pci_lock)); + ASSERT(map_slot < ARRAY_SIZE(current->vpci.task)); + ASSERT(!task->pending); =20 /* * Create a rangeset per BAR that represents the current device memory @@ -333,7 +362,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) { struct vpci_bar *bar =3D &header->bars[i]; - struct rangeset *mem =3D current->vpci.mem[i]; + struct rangeset *mem =3D task->bars[i].mem; unsigned long start =3D PFN_DOWN(bar->addr); unsigned long end =3D PFN_DOWN(bar->addr + bar->size - 1); unsigned long start_guest =3D PFN_DOWN(bar->guest_addr); @@ -343,9 +372,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) =20 if ( !MAPPABLE_BAR(bar) || (rom_only ? bar->type !=3D VPCI_BAR_ROM - : (bar->type =3D=3D VPCI_BAR_ROM && !header->rom_en= abled)) || - /* Skip BARs already in the requested state. */ - bar->enabled =3D=3D !!(cmd & PCI_COMMAND_MEMORY) ) + : (bar->type =3D=3D VPCI_BAR_ROM && !header->rom_en= abled)) ) continue; =20 if ( !pci_check_bar(pdev, _mfn(start), _mfn(end)) ) @@ -382,7 +409,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) /* Check for overlap with the already setup BAR ranges. */ for ( j =3D 0; j < i; j++ ) { - struct rangeset *prev_mem =3D current->vpci.mem[j]; + struct rangeset *prev_mem =3D task->bars[j].mem; =20 if ( rangeset_is_empty(prev_mem) ) continue; @@ -405,6 +432,9 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) &pdev->sbdf, i, rc); return rc; } + + task->bars[i].addr =3D bar->addr; + task->bars[i].guest_addr =3D bar->guest_addr; } =20 /* Remove any MSIX regions if present. */ @@ -414,9 +444,9 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) unsigned long end =3D PFN_DOWN(vmsix_table_addr(pdev->vpci, i) + vmsix_table_size(pdev->vpci, i) - 1); =20 - for ( j =3D 0; j < ARRAY_SIZE(current->vpci.mem); j++ ) + for ( j =3D 0; j < ARRAY_SIZE(task->bars); j++ ) { - struct rangeset *mem =3D current->vpci.mem[j]; + struct rangeset *mem =3D task->bars[j].mem; =20 if ( rangeset_is_empty(mem) ) continue; @@ -471,7 +501,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only) for ( j =3D 0; j < ARRAY_SIZE(header->bars); j++) { const struct vpci_bar *bar =3D &header->bars[j]; - struct rangeset *mem =3D current->vpci.mem[j]; + struct rangeset *mem =3D task->bars[j].mem; =20 if ( !rangeset_overlaps_range(mem, start, end) || /* @@ -502,6 +532,10 @@ static int modify_bars(const struct pci_dev *pdev, uin= t16_t cmd, bool rom_only) d =3D dom_xen; } =20 + task->cmd =3D cmd; + task->rom_only =3D rom_only; + task->pending =3D true; + if ( system_state < SYS_STATE_active ) { /* @@ -513,10 +547,10 @@ static int modify_bars(const struct pci_dev *pdev, ui= nt16_t cmd, bool rom_only) * will always be to establish mappings and process all the BARs. */ ASSERT((cmd & PCI_COMMAND_MEMORY) && !rom_only); - return apply_map(pdev->domain, pdev, cmd); + return apply_map(pdev->domain, pdev, task); } =20 - defer_map(pdev, cmd, rom_only); + defer_map(pdev); =20 return 0; } @@ -549,7 +583,7 @@ static void cf_check cmd_write( * memory decoding bit has not been changed, so leave everything a= s-is, * hoping the guest will realize and try again. */ - modify_bars(pdev, cmd, false); + modify_bars(pdev, cmd, false, 0); else pci_conf_write16(pdev->sbdf, reg, cmd); } @@ -717,7 +751,7 @@ static void cf_check rom_write( * Pass PCI_COMMAND_MEMORY or 0 to signal a map/unmap request, note th= at * this fabricated command is never going to be written to the registe= r. */ - else if ( modify_bars(pdev, new_enabled ? PCI_COMMAND_MEMORY : 0, true= ) ) + else if ( modify_bars(pdev, new_enabled ? PCI_COMMAND_MEMORY : 0, true= , 0) ) /* * No memory has been added or removed from the p2m (because the a= ctual * p2m changes are deferred in defer_map) and the ROM enable bit h= as @@ -907,7 +941,7 @@ int vpci_init_header(struct pci_dev *pdev) goto fail; } =20 - return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, cmd, false) : 0; + return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, cmd, false, 0) := 0; =20 fail: pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c index 8e6343653078..54a4ed46387c 100644 --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -26,30 +26,37 @@ =20 void vpci_vcpu_destroy(struct vcpu *v) { - unsigned int i; + unsigned int i, j; =20 if ( !has_vpci(v->domain) && !is_idle_domain(v->domain) ) return; =20 - for ( i =3D 0; i < ARRAY_SIZE(v->vpci.mem); i++ ) - RANGESET_DESTROY(v->vpci.mem[i]); + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.task); i++ ) + { + for ( j =3D 0; j < ARRAY_SIZE(v->vpci.task[i].bars); j++ ) + RANGESET_DESTROY(v->vpci.task[i].bars[j].mem); + } } =20 int vpci_vcpu_init(struct vcpu *v) { - unsigned int i; + unsigned int i, j; =20 if ( !has_vpci(v->domain) && !is_idle_domain(v->domain) ) return 0; =20 - for ( i =3D 0; i < ARRAY_SIZE(v->vpci.mem); i++ ) + for ( i =3D 0; i < ARRAY_SIZE(v->vpci.task); i++ ) { - char str[32]; + for ( j =3D 0; j < ARRAY_SIZE(v->vpci.task[i].bars); j++ ) + { + char str[32]; =20 - snprintf(str, sizeof(str), "%pv:BAR%u", v, i); - v->vpci.mem[i] =3D rangeset_new(v->domain, str, RANGESETF_no_print= ); - if ( !v->vpci.mem[i] ) - return -ENOMEM; + snprintf(str, sizeof(str), "%pv:BAR[%u][%u]", v, i, j); + v->vpci.task[i].bars[j].mem =3D rangeset_new(v->domain, str, + RANGESETF_no_print); + if ( !v->vpci.task[i].bars[j].mem ) + return -ENOMEM; + } } =20 return 0; diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index b55bacbe6e01..e4fbf7b702d6 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -156,11 +156,18 @@ struct vpci { =20 #ifdef __XEN__ struct vpci_vcpu { - /* Per-vcpu structure to store state while {un}mapping of PCI BARs. */ const struct pci_dev *pdev; - struct rangeset *mem[ARRAY_SIZE(((struct vpci_header *)NULL)->bars)]; - uint16_t cmd; - bool rom_only : 1; + /* Per-vcpu structure to store state while {un}mapping of PCI BARs. */ + struct vpci_map_task { + struct vpci_bar_map { + uint64_t addr; + uint64_t guest_addr; + struct rangeset *mem; + } bars[ARRAY_SIZE(((struct vpci_header *)NULL)->bars)]; + uint16_t cmd; + bool rom_only : 1; + bool pending : 1; + } task[1]; }; =20 void vpci_dump_msi(void); --=20 2.53.0 From nobody Fri Apr 3 18:48:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass(p=quarantine dis=none) header.from=amd.com ARC-Seal: i=2; a=rsa-sha256; t=1774321569; cv=pass; d=zohomail.com; s=zohoarc; b=An6aTtrsrdjHQG+vjlpeOCFlS+p7qaAhlgUwgAD/AjL+umVER6plxcqzAzOaVNK+Ia7dmwEzRYmDSlA/i2wk5V0FJwNWdcten9Yh8fN20zptvmHUABGnQZj480/juXOsqbHF5FY9KSxKcpoeLzPqepeu9QN5e+xZBWXaIMuzk/g= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774321569; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ej96FSNwLfsqOcUf6P4qAFaoiP/qDKeFikSYtl3VuBk=; b=K3EwcUyUrY6qscT3q5Q56VTTqGJrgckJrI2ABzpMflYgpcS7N7J64xboqhlfSs9XRNoZKHR2XCyUOILq3y8K9Kq+rzh/RjgaUvby9Sd0PgpMEUllGa/kgkeXRjuBaifuHqJ9LBQwP8yMqDUQNtkl0Q6H/xBX4WvD1z+9OqXNDec= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1774321569263831.380277339067; Mon, 23 Mar 2026 20:06:09 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1260000.1553340 (Exim 4.92) (envelope-from ) id 1w4s5V-0005ab-Gk; Tue, 24 Mar 2026 03:05:49 +0000 Received: by outflank-mailman (output) from mailman id 1260000.1553340; Tue, 24 Mar 2026 03:05:49 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5V-0005aU-Dm; Tue, 24 Mar 2026 03:05:49 +0000 Received: by outflank-mailman (input) for mailman id 1260000; Tue, 24 Mar 2026 03:05:48 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5U-0005YF-IT for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 03:05:48 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1w4s5T-00Cb6d-UQ for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 04:05:47 +0100 Received: from [10.42.69.6] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69c1ff63-e002-0a2a0a5209dd-0a2a4506e1a8-24 for ; Tue, 24 Mar 2026 04:05:47 +0100 Received: from [40.93.195.12] (helo=SN4PR2101CU001.outbound.protection.outlook.com) by tlsNG-16d1c6.mxtls.expurgate.net with ESMTPS (eXpurgate 4.55.2) (envelope-from ) id 69c1ff8a-3034-0a2a45060019-285dc30cc0db-4 for ; Tue, 24 Mar 2026 04:05:47 +0100 Received: from CH5P220CA0022.NAMP220.PROD.OUTLOOK.COM (2603:10b6:610:1ef::28) by SA5PPF06C91DA0C.namprd12.prod.outlook.com (2603:10b6:80f:fc04::8c4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Tue, 24 Mar 2026 03:05:41 +0000 Received: from CH1PEPF0000A348.namprd04.prod.outlook.com (2603:10b6:610:1ef:cafe::c6) by CH5P220CA0022.outlook.office365.com (2603:10b6:610:1ef::28) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.31 via Frontend Transport; Tue, 24 Mar 2026 03:05:39 +0000 Received: from satlexmb08.amd.com (165.204.84.17) by CH1PEPF0000A348.mail.protection.outlook.com (10.167.244.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Tue, 24 Mar 2026 03:05:40 +0000 Received: from Satlexmb09.amd.com (10.181.42.218) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 22:05:38 -0500 Received: from satlexmb08.amd.com (10.181.42.217) by satlexmb09.amd.com (10.181.42.218) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.17; Mon, 23 Mar 2026 20:05:38 -0700 Received: from ubuntu (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 23 Mar 2026 22:05:37 -0500 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=t5FgPdj1RCZ31jrBXunHvWq+IsX6FE8POSDNlmpQoMSLK+rBsFLTmPpp8AHc50Dc1sl0bnLhEH3JIJJpQwLUh22F1HhNTQhD83e+FPWyJq+tAUacTHKmY2UbSS3dxcPlOwcQYZS9AMFsG2gsXPCwoxPlSi/sEOF4/Qj2dlBzf66+r0GnZOezb/t8fANQWymoWfPWHg+F0yQlcCArzIPN36NJdMhBYOlacHbk0lHq9gM41Ud0+jWMMsOqCDsV+1tDw7kje/1MuQvXdNnF1GJ4lFYcvAnXeIsZ65CUpMF8rJ961FQMechYjP6tOZ2+vKDZXQj6sz5u7PMJm7zVWMd8Bw== 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=ej96FSNwLfsqOcUf6P4qAFaoiP/qDKeFikSYtl3VuBk=; b=u8rL0qDuomB1wvvABsbZgpXkp8/UAmXLL0kEnH/JM0cTkwOuaDGdutIiU/VO1GwpwYpBvgKJ4MuewIpCv5/Yh8rMvv13atsYgfQzw2VgrXyd0KG7VavBu0xcacXC8jSYKRvTdRlO1iF8mZvu3L5zqA4kUMHWC4lKmM7mb0vf1XiStiitr9vdCkzQtiPUyhE/JUX3zc5u2EtHTACyW3k9myRAuxtx80AURvtNqp8/Hphuq/jVBhbT7R1c5OGYKpo4lihTDv1sBAP6jjJ8JlLn3hZQyZD+0On/WG8sUFaCmJoEfHkYq3D8b/nApuda3m6R12+FPkSZUAVZb6ILCSIm2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ej96FSNwLfsqOcUf6P4qAFaoiP/qDKeFikSYtl3VuBk=; b=eFkjgUuTkjkTvsfGfzjVt5cYEMSAyADaltllvmBym0o6okTfUhEo3VRZchwfWzm3b1F8Xx43ebBEy/S+Oo2c/qSuDAFsS+hERHk+SAutt0xzdy5Ep2yFpUV7ExCcHGvDdAiy6ms4XsrxHSyG88WR8q7LI64PHXzWz/EhOq/OFAo= X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C From: Stewart Hildebrand To: CC: Stewart Hildebrand , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v3 3/4] vpci: allow BAR map/unmap without affecting memory decoding bit Date: Mon, 23 Mar 2026 23:05:00 -0400 Message-ID: <20260324030513.700217-4-stewart.hildebrand@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324030513.700217-1-stewart.hildebrand@amd.com> References: <20260324030513.700217-1-stewart.hildebrand@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A348:EE_|SA5PPF06C91DA0C:EE_ X-MS-Office365-Filtering-Correlation-Id: db9fd6d2-defe-412a-5cf2-08de89523aef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|1800799024|376014|13003099007|22082099003|56012099003|18002099003; X-Microsoft-Antispam-Message-Info: yKpfiNJHlSCYobLhZn2wKSsmqk23qMUsex/MCUc7+nrS4pYRMlXbXIzK10u1Webv/9N4N78plKtz6fWxL1lmNNY7O0rQgwUKtE7txM050kV3CNDVRV9Ey4S6m9NZz/jKTgELF7nO8COzqE3+NGwM7f76WwS9vzfsjqHMZ2/zFt+s6iZtir8WRGFFSLletg8lUylaOtjPxdCSR+n+dSf85alREKdLV7/UsDdEDyJ6db92arFpSQ3V33K6ALWM/HmhnTkrPfcGzbQNiGCoFZbgHIZXv0ZBlQWDQo5D28Lr60hmvch4puLeNlPSO2kTSdTuyEig2D1+po7OWNZH3wRU0lTRjAyn8W2PNTgEoC52xyheg79BCqZeF0AVLVgQm5qf1sESPUEkv+eAsi4Q+24lhrDQNEclItNEE7MFSntJdyqyrHGoO35hh9kllv/DNNVCrwMEnXcBHB7QW7BwHZrQY0JORZ2FNFm/6LVQEG9acyn6gZBohY2pMMKkvEgsIljQwMiWcJc4MCzTWfUFkYSQEGb1A6PbnBPfgijoY+HBkVYC+aoT7YHd3HWmwQn2mmcJ0tjZYGlAlGyys7huZCPjwuYHmw/xucLGlAIwzyw0oetDa5o2r9Capshngta7eOq72UYyrFGSf5bgMSVA5UjpMTBoFi83Ie9iZrq0PDFcZzfNxs3moBuXzKZx1YQBNxvOtYL1G4EfXbiA5IKp58L6V35AxmANJHiM/INYHAPkQ5HcitUj452rtnnOCgynEsMDZf+OcMsgeLG/X4GDyyls7Q== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(1800799024)(376014)(13003099007)(22082099003)(56012099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: k4DizxoBtvDgA23IZZy/k4IiEhNpUOJXdsWsM7uHXUh3QGY1ofFaRc4qqNaThT6FjUZRC0cXwN5K8A6tfYzFAJAb5RkpX3DM0mJh9OiTU+ozOY2I6h2BeUs09HKLB4RAK7QhxhJMJqyNKeDodytoV8GNYdVHy4h30xKjoNbIb+1pkQ2DHDJTux+XP5TZV9B42cKFj92UW7b31t75srqeiQXE3XgRlJbA+iuhCFyd8aiu9/InaQZS+xMDCSeFBHin4DD12TGIElxtREURJ/WSmbTioGlYKIRjSvN8utWnquDEzY0C+bHcITZmYiLzXoiI9zPMTTf/IOJjVtfnEvjOP7MYX5suWwnJZLDiq2Qb17ZDLqIu9y/Dkcwi/EKDUNxyqrcLphg8hKYtEsRl6q/mcQKCSJ7byFhBj8LF3aFecVx/WLSEpbsVNVrzKL7UGf5W X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:05:40.1959 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: db9fd6d2-defe-412a-5cf2-08de89523aef X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH1PEPF0000A348.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA5PPF06C91DA0C X-purgate-ID: tlsNG-16d1c6/1774321547-7A5911C2-FFC5F53C/0/0 X-purgate-type: clean X-purgate-size: 6322 X-ZohoMail-DKIM: pass (identity @amd.com) X-ZM-MESSAGEID: 1774321571137158500 Content-Type: text/plain; charset="utf-8" Introduce 'bool map' and allow invoking modify_bars() without changing the memory decoding bit. This will allow hardware domain to reposition BARs without affecting the memory decoding bit. Signed-off-by: Stewart Hildebrand --- This also lays some groundwork to allow domUs to toggle the guest view without affecting hardware, a step toward addressing the FIXME in [1]. [1] https://lore.kernel.org/xen-devel/20250814160358.95543-4-roger.pau@citr= ix.com/ v2->v3: * use bool * switch to task->map in more places v1->v2: * new patch --- xen/drivers/vpci/header.c | 38 ++++++++++++++++++++------------------ xen/include/xen/vpci.h | 1 + 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index e57c00839841..9856840c3c87 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -116,11 +116,12 @@ static int cf_check map_range( * BAR's enable bit has changed with the memory decoding bit already enabl= ed. * If rom_only is not set then it's the memory decoding bit that changed. */ -static void modify_decoding(const struct pci_dev *pdev, uint16_t cmd, - bool rom_only) +static void modify_decoding(const struct pci_dev *pdev, + struct vpci_map_task *task) { struct vpci_header *header =3D &pdev->vpci->header; - bool map =3D cmd & PCI_COMMAND_MEMORY; + bool rom_only =3D task->rom_only; + bool map =3D task->map; unsigned int i; =20 for ( i =3D 0; i < ARRAY_SIZE(header->bars); i++ ) @@ -167,7 +168,7 @@ static void modify_decoding(const struct pci_dev *pdev,= uint16_t cmd, =20 if ( !rom_only ) { - pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); + pci_conf_write16(pdev->sbdf, PCI_COMMAND, task->cmd); header->bars_mapped =3D map; } else @@ -190,7 +191,7 @@ static int vpci_process_map_task(const struct pci_dev *= pdev, struct rangeset *mem =3D bar->mem; struct map_data data =3D { .d =3D pdev->domain, - .map =3D task->cmd & PCI_COMMAND_MEMORY, + .map =3D task->map, .bar =3D bar, }; int rc; @@ -205,9 +206,11 @@ static int vpci_process_map_task(const struct pci_dev = *pdev, =20 if ( rc ) { - spin_lock(&pdev->vpci->lock); /* Disable memory decoding unconditionally on failure. */ - modify_decoding(pdev, task->cmd & ~PCI_COMMAND_MEMORY, false); + task->cmd &=3D ~PCI_COMMAND_MEMORY; + task->map =3D false; + spin_lock(&pdev->vpci->lock); + modify_decoding(pdev, task); spin_unlock(&pdev->vpci->lock); =20 /* Clean all the rangesets */ @@ -225,7 +228,7 @@ static int vpci_process_map_task(const struct pci_dev *= pdev, } =20 spin_lock(&pdev->vpci->lock); - modify_decoding(pdev, task->cmd, task->rom_only); + modify_decoding(pdev, task); spin_unlock(&pdev->vpci->lock); =20 task->pending =3D false; @@ -305,7 +308,7 @@ static int __init apply_map(struct domain *d, const str= uct pci_dev *pdev, } } if ( !rc ) - modify_decoding(pdev, task->cmd, false); + modify_decoding(pdev, task); =20 task->pending =3D false; =20 @@ -333,7 +336,7 @@ static void defer_map(const struct pci_dev *pdev) } =20 static int modify_bars(const struct pci_dev *pdev, uint16_t cmd, bool rom_= only, - unsigned int map_slot) + bool map, unsigned int map_slot) { struct vpci_header *header =3D &pdev->vpci->header; struct pci_dev *tmp; @@ -534,6 +537,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only, =20 task->cmd =3D cmd; task->rom_only =3D rom_only; + task->map =3D map; task->pending =3D true; =20 if ( system_state < SYS_STATE_active ) @@ -546,7 +550,7 @@ static int modify_bars(const struct pci_dev *pdev, uint= 16_t cmd, bool rom_only, * be called iff the memory decoding bit is enabled, thus the oper= ation * will always be to establish mappings and process all the BARs. */ - ASSERT((cmd & PCI_COMMAND_MEMORY) && !rom_only); + ASSERT(map && !rom_only); return apply_map(pdev->domain, pdev, task); } =20 @@ -583,7 +587,7 @@ static void cf_check cmd_write( * memory decoding bit has not been changed, so leave everything a= s-is, * hoping the guest will realize and try again. */ - modify_bars(pdev, cmd, false, 0); + modify_bars(pdev, cmd, false, cmd & PCI_COMMAND_MEMORY, 0); else pci_conf_write16(pdev->sbdf, reg, cmd); } @@ -747,11 +751,8 @@ static void cf_check rom_write( header->rom_enabled =3D new_enabled; pci_conf_write32(pdev->sbdf, reg, val); } - /* - * Pass PCI_COMMAND_MEMORY or 0 to signal a map/unmap request, note th= at - * this fabricated command is never going to be written to the registe= r. - */ - else if ( modify_bars(pdev, new_enabled ? PCI_COMMAND_MEMORY : 0, true= , 0) ) + /* Note that the command value 0 will never be written to the register= */ + else if ( modify_bars(pdev, 0, true, new_enabled, 0) ) /* * No memory has been added or removed from the p2m (because the a= ctual * p2m changes are deferred in defer_map) and the ROM enable bit h= as @@ -941,7 +942,8 @@ int vpci_init_header(struct pci_dev *pdev) goto fail; } =20 - return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, cmd, false, 0) := 0; + return (cmd & PCI_COMMAND_MEMORY) ? modify_bars(pdev, cmd, false, true= , 0) + : 0; =20 fail: pci_conf_write16(pdev->sbdf, PCI_COMMAND, cmd); diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index e4fbf7b702d6..a6f8cb67dcac 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -166,6 +166,7 @@ struct vpci_vcpu { } bars[ARRAY_SIZE(((struct vpci_header *)NULL)->bars)]; uint16_t cmd; bool rom_only : 1; + bool map : 1; bool pending : 1; } task[1]; }; --=20 2.53.0 From nobody Fri Apr 3 18:48:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass(p=quarantine dis=none) header.from=amd.com ARC-Seal: i=2; a=rsa-sha256; t=1774321572; cv=pass; d=zohomail.com; s=zohoarc; b=PN+umCAVCK16FUmjB1iakBwNrIFb9XMF/nltzhif+Dnfb6ez9ae73FWuhDffBsoDBzziw7bAF8MCgUHKIwAMum8XNqzIElCOy55AUP9bhrOBAL7ewOcY+18BbNJYErzQrV7BoBDGol4AIHnPQRByQnCg+qM39XKddHBlgsNnQQY= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1774321572; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=QSf/Y6hBGzyirIB8wL+Tv2JZc0KdiMNKBUOutJwXS6A=; b=D2/E8G9WnBhxV4umydmp5aRsPgb5x/PQwF7GDvb54ael9wPbRS0FblK4l+nilowDxP70k3Xo+Ua8zWbfqR//c2fQTMOicUFyYbkWN62iHl65OhuN2B0D1/PbetSyYYaE3vXa9HVDw+Sd+LxXDXfM+4OdE3dqxugxKFXRJ2/NuVw= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; arc=pass (i=1 dmarc=pass fromdomain=amd.com); dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1774321572964336.0229054129542; Mon, 23 Mar 2026 20:06:12 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1260003.1553349 (Exim 4.92) (envelope-from ) id 1w4s5a-0005xP-WA; Tue, 24 Mar 2026 03:05:54 +0000 Received: by outflank-mailman (output) from mailman id 1260003.1553349; Tue, 24 Mar 2026 03:05:54 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5a-0005xI-TS; Tue, 24 Mar 2026 03:05:54 +0000 Received: by outflank-mailman (input) for mailman id 1260003; Tue, 24 Mar 2026 03:05:53 +0000 Received: from mx.expurgate.net ([195.190.135.10]) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w4s5Y-0005rx-Tj for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 03:05:53 +0000 Received: from mx.expurgate.net (helo=localhost) by mx.expurgate.net with esmtp id 1w4s5W-0073ow-O2 for xen-devel@lists.xenproject.org; Tue, 24 Mar 2026 04:05:52 +0100 Received: from [10.42.69.4] (helo=localhost) by localhost with ESMTP (eXpurgate MTA 0.9.1) (envelope-from ) id 69c1ff6b-bab6-0a2a0a5309dd-0a2a4504edec-36 for ; Tue, 24 Mar 2026 04:05:51 +0100 Received: from [52.101.53.48] (helo=BL0PR03CU003.outbound.protection.outlook.com) by tlsNG-ebf023.mxtls.expurgate.net with ESMTPS (eXpurgate 4.55.2) (envelope-from ) id 69c1ff8e-c823-0a2a45040019-346535307b5b-3 for ; Tue, 24 Mar 2026 04:05:51 +0100 Received: from CH5P223CA0021.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:1f3::22) by LV2PR12MB5989.namprd12.prod.outlook.com (2603:10b6:408:171::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Tue, 24 Mar 2026 03:05:47 +0000 Received: from CH1PEPF0000A34B.namprd04.prod.outlook.com (2603:10b6:610:1f3:cafe::5c) by CH5P223CA0021.outlook.office365.com (2603:10b6:610:1f3::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9723.31 via Frontend Transport; Tue, 24 Mar 2026 03:05:42 +0000 Received: from satlexmb08.amd.com (165.204.84.17) by CH1PEPF0000A34B.mail.protection.outlook.com (10.167.244.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.19 via Frontend Transport; Tue, 24 Mar 2026 03:05:45 +0000 Received: from SATLEXMB03.amd.com (10.181.40.144) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.17; Mon, 23 Mar 2026 22:05:45 -0500 Received: from satlexmb08.amd.com (10.181.42.217) by SATLEXMB03.amd.com (10.181.40.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.39; Mon, 23 Mar 2026 22:05:45 -0500 Received: from ubuntu (10.180.168.240) by satlexmb08.amd.com (10.181.42.217) with Microsoft SMTP Server id 15.2.2562.17 via Frontend Transport; Mon, 23 Mar 2026 22:05:44 -0500 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" Authentication-Results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=amd.com header.i="@amd.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fBWYCrztVbacYgALLFzAoFrtSd7diFq16O9xyAjjysgqj3aGwVvSVI1OuCp/V7bmcl1QTXYtuWnbuO1AGP44jQi4WZwnstimzC070LB7C8H4Cohe/62lURpKQdNvuLl77335JIjVWCk6/hRrl2T/LiSxRXVl+/PjeVlYqKVaEHoXZqunfa/r5qMH7IEdRO89MtvGZgOYynOvArtLGxZQCr0eo1x1EKDAU5DqKRDyAuBa8vcHufzjYSYlBeprntvtzHHChNQjhpyWnB4yWzvtAXU9FXeUTYbwW6mtsP3rm8ZW/lVVLGEVjFNBxzIFbCU/3L81bz8LIW2QYmhjAxLP+g== 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=QSf/Y6hBGzyirIB8wL+Tv2JZc0KdiMNKBUOutJwXS6A=; b=JrbzySqIyWd1xL0qglXI3FD9FJJMq8FsYBequF9FzfUzCmQ7hgHByw4PaMftxNpwn66qFZPh2LTPj7N9wCfLXTSlZlHbsBekY5JDDavuurb/jQDbX2BfTwNanUii3MI90AYgAE6TuiFFdqHpFAa+5Utc7+Dk6PZaQUiJDaalqwN3aiTenhCuWqfhtj7VZcZBASTQOFEZPyEnN1Bh93a2JU/tiiR7KSZ1K7LENXeq2PUk0+OG1SvubEJLXoaTsCWsYdKUwxHma8EL6o3KQFA7PK4gvBZskrkbFjKUG19a5ffHniQ/gG7cmq//BrAYLKSJ0/NAypMtddo0SDPFrKahdw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QSf/Y6hBGzyirIB8wL+Tv2JZc0KdiMNKBUOutJwXS6A=; b=17MujKDVT6B7UfYc/w/K4pMI4uKWwZsYOoXbEcqfzEfyEjMd8CR06zGZCf8FZzX6hAZ8io/QUTCFtKCCMSr3PgDCWiQVHCyX0arleqeGpaB6vttzmm2vYqc6xz4W8unmZh6rQ2lpRk5spt4jMoFQY70Ou42IwbyMkQF6o/LPZDg= X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=amd.com; Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Received-SPF: Pass (protection.outlook.com: domain of amd.com designates 165.204.84.17 as permitted sender) receiver=protection.outlook.com; client-ip=165.204.84.17; helo=satlexmb08.amd.com; pr=C From: Stewart Hildebrand To: CC: Stewart Hildebrand , =?UTF-8?q?Roger=20Pau=20Monn=C3=A9?= Subject: [PATCH v3 4/4] vpci: allow 32-bit BAR writes with memory decoding enabled Date: Mon, 23 Mar 2026 23:05:01 -0400 Message-ID: <20260324030513.700217-5-stewart.hildebrand@amd.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260324030513.700217-1-stewart.hildebrand@amd.com> References: <20260324030513.700217-1-stewart.hildebrand@amd.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: None (SATLEXMB03.amd.com: stewart.hildebrand@amd.com does not designate permitted sender hosts) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CH1PEPF0000A34B:EE_|LV2PR12MB5989:EE_ X-MS-Office365-Filtering-Correlation-Id: 1c3906ae-c441-4881-a403-08de89523e5b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|36860700016|376014|13003099007|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: 3lnNFZnNczC6zi1wJttteuNOPSdKpTuSe6flfxYZMeVDb+5oVVZfkg9KkWO84TW83H56gXFkVS2PPYAlMDfF7KpVvhHhDMYO4edlmTqYpPgvOrzCLl+d/wQwF/7ivHXquIXiz5nUmnjeHY3SIHjwXpTtT/3KljQmdg7R2VfeeEm0SZpda2CzsFb8kZNAj2M7CspnMchSeUPbaA9kUmkEZD42O+o9Gn7oYvq0sw+DCdwE7OBzg+qZxI2CM9y6fTEHSwLn/1jA+dwFAmUTgY7xIYy4tbTchW+xtwB/letkap+3jWdUnpL+P0BX62sjEA9/L7ab0HZMzHMCFgCWWlcMg5RPYdVRMCUluZBSsqaPLCtGMnpRkuuj6ZuBqfcheMb4BfNkSduBAH7JuXzIM9KBAI6hSvwwb8Nf+Kp5KDd4MZHYWoTPQMUbI7jtahQt0jFzJGHdZ1OtCyEFU7YHX9Tdmm6eCWkUdOlvwQZ1d915yXbRXdPgbvb1mG/T05GdfcUrbrfblezO0ELG1YHf4SzPgh/NL6jyJqKgKehDxNSfKavu0a8LN+/IkytTXv6JdldlU79hT+ONjofpCGJAiGscNz7VmC7iFNyrkf3XHkLryXvD90JTbqT6rIL1KaWS+Lo2qbtKP4h3HIX6F4HDQpJJHSCSI94Y72fX/YcpaqdcSwmbyi0A1I0cYlCytjWIEhaLxpgoj5DIktZh5lJK0mcfIVQmp86ZDcSUyjlnmdVF2MusFwVYztmlVeatkRiOIxgLd2B0kZN8KV+DH60dj8bfAw== X-Forefront-Antispam-Report: CIP:165.204.84.17;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:satlexmb08.amd.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(36860700016)(376014)(13003099007)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1622F/nCeCDomiFjtGhBVgyHtrx1HBTfXQBEVyW/doLbGMNv/hwpGpOHJGgwGOcAOK6qOSvQlczNvuHTh7NZzgwNvIqsvGFBJm/CaJ4zfIQMg2d986w4TthFkgEY6cxTT2AAUSxDqcB57O8P/FBRdAd/ceCnE95g0RHNds/iTW6l8eH4XocyXUQNIyT7M0yCn56HbxIvi1zDEzFnxMjrTX533Km/MroOSeVUcN+yhhyUJomRMHudRQ+3CUpkJsQnAnh43Y6Luxy2cJ03ylM8aMzZF/cfaiiHcWOWVA6nV+HERsJ58jZN5V4udF8aitEeu2PDVxWnS56g4CqKdz8U99OoHrLBwH7zT85zSKQW2bXmA7w6CeCrxOtFZLPdhhu7FPBwtuI+Dm7cdQYX8YJ2uRkbUDQ7uH6y3nLQF8PMzXhA2yrYMbtauJqLWpAMp+LS X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Mar 2026 03:05:45.9169 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1c3906ae-c441-4881-a403-08de89523e5b X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d;Ip=[165.204.84.17];Helo=[satlexmb08.amd.com] X-MS-Exchange-CrossTenant-AuthSource: CH1PEPF0000A34B.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV2PR12MB5989 X-purgate-ID: tlsNG-ebf023/1774321551-B249D9D1-6C2F1D6C/0/0 X-purgate-type: clean X-purgate-size: 3882 X-ZohoMail-DKIM: pass (identity @amd.com) X-ZM-MESSAGEID: 1774321575203154100 Content-Type: text/plain; charset="utf-8" Currently, Xen vPCI refuses BAR writes if the BAR is mapped in p2m. If firmware initializes a 32-bit BAR to a bad address, Linux may try to write a new address to the 32-bit BAR without disabling memory decoding. Since Xen refuses such writes, the BAR (and thus PCI device) will be non-functional. Allow the hardware domain to issue 32-bit BAR writes with memory decoding enabled. This increases the compatibility of PVH dom0 with more hardware. Note that Linux aims at disabling memory decoding before writing 64-bit BARs. Continue to refuse 64-bit BAR writes in Xen while those BARs are mapped for now to avoid mapping half-updated BARs in p2m. Increase number of unmap/map slots to 2. Resolves: https://gitlab.com/xen-project/xen/-/issues/197 Signed-off-by: Stewart Hildebrand --- v2->v3: * minor tweaks for fixed number of map/unmap slots v1->v2: * rework on top of queued BAR map/unmap operation machinery RFC->v1: * keep memory decoding enabled in hardware * allow write while memory decoding is enabled for 32-bit BARs only * rework BAR mapping machinery to support unmap-then-map operation --- xen/drivers/vpci/header.c | 33 ++++++++++++++++++++++++--------- xen/include/xen/vpci.h | 2 +- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/xen/drivers/vpci/header.c b/xen/drivers/vpci/header.c index 9856840c3c87..2df992468383 100644 --- a/xen/drivers/vpci/header.c +++ b/xen/drivers/vpci/header.c @@ -605,6 +605,8 @@ static void cf_check bar_write( { struct vpci_bar *bar =3D data; bool hi =3D false; + uint16_t cmd =3D 0; + unsigned int map_slot =3D 0; =20 ASSERT(is_hardware_domain(pdev->domain)); =20 @@ -618,19 +620,29 @@ static void cf_check bar_write( val &=3D PCI_BASE_ADDRESS_MEM_MASK; =20 /* - * Xen only cares whether the BAR is mapped into the p2m, so allow BAR - * writes as long as the BAR is not mapped into the p2m. + * Allow 64-bit BAR writes only when the BAR is not mapped in p2m. Alw= ays + * allow 32-bit BAR writes. */ if ( bar->enabled ) { - /* If the value written is the current one avoid printing a warnin= g. */ - if ( val !=3D (uint32_t)(bar->addr >> (hi ? 32 : 0)) ) - gprintk(XENLOG_WARNING, - "%pp: ignored BAR %zu write while mapped\n", - &pdev->sbdf, bar - pdev->vpci->header.bars + hi); - return; - } + if ( bar->type =3D=3D VPCI_BAR_MEM32 ) + { + if ( val =3D=3D bar->addr ) + return; =20 + cmd =3D pci_conf_read16(pdev->sbdf, PCI_COMMAND); + modify_bars(pdev, cmd, false, false, map_slot++); + } + else + { + /* If the value written is the same avoid printing a warning. = */ + if ( val !=3D (uint32_t)(bar->addr >> (hi ? 32 : 0)) ) + gprintk(XENLOG_WARNING, + "%pp: ignored BAR %zu write while mapped\n", + &pdev->sbdf, bar - pdev->vpci->header.bars + hi); + return; + } + } =20 /* * Update the cached address, so that when memory decoding is enabled @@ -650,6 +662,9 @@ static void cf_check bar_write( } =20 pci_conf_write32(pdev->sbdf, reg, val); + + if ( bar->enabled ) + modify_bars(pdev, cmd, false, true, map_slot++); } =20 static void cf_check guest_mem_bar_write(const struct pci_dev *pdev, diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h index a6f8cb67dcac..a458b722cea6 100644 --- a/xen/include/xen/vpci.h +++ b/xen/include/xen/vpci.h @@ -168,7 +168,7 @@ struct vpci_vcpu { bool rom_only : 1; bool map : 1; bool pending : 1; - } task[1]; + } task[2]; }; =20 void vpci_dump_msi(void); --=20 2.53.0