[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 03/20] xen/arm: smmuv3: Alloc io_domain for each device


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Milan Djokic <milan_djokic@xxxxxxxx>
  • Date: Thu, 7 Aug 2025 16:59:16 +0000
  • Accept-language: en-US
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=epam.com; dmarc=pass action=none header.from=epam.com; dkim=pass header.d=epam.com; arc=none
  • 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=xL00tNSF5yd9RoAGLx4Uq/x2+XNJeFpfg252zO6C4CE=; b=kXPM8uYcF8eKZNmUIOP2ub02mP5Sk1RDCRg/EmRjcdmhgrw76OfDIjl/VsI2QVBVvCwPAqre8LWLFqZOXAAYnQJp340cfjUa2mngJ3PIHD7SByTHB/GCEA7xaerE+BmiJlHDzpuDC+dcJ2ESwtFkE3cBZJhTJalSBN0vfnBwPU9aCgE6YDOk2Otbh7IvLsQF/FISksfCO83Vq11k7BEyKYAcqOjRXXZnszt4jGA0w7Fr1sMXSbJ3SqxL3vNk7f52XsPVVuJyg3esxfvClS3egdETmRDOKxUPcLvtzFq3WLZo2372SakMPLZ3CMalxvDu8RSJ0jrzsWxdQyPVzMSrBQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=mjccd5ex3iHvEOrOc83veBjvKOmxBGUITWDSvCTHbQqMOyt5fgaNNaBo6nhTf8bRYrVXL5Qi6tgQeoPzt4dv/MZf8J1R2Y9lfiv0IpsSTvmIc+RCE38IPo0rDdkw+s4QtPNFJEdcCMu7fssFFLynNXUUX7gclXTY08+fDvFpeazdUMezk7ucvKhqlFWoxEg2wXgHQzz04GOjqra+5YJusLkZiaMooAlp6T0+8BYx/Uztc3cqt6rorgmV08rAu7UOZUQp0H+sJljk6sR/OsVFWT69a/2b6hMaq9Ag+yHF9b9XgqdWPl8XUhOJHSS4617bjwHK4lJCqm1CVhBgUG98zQ==
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=epam.com;
  • Cc: Rahul Singh <rahul.singh@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Milan Djokic <milan_djokic@xxxxxxxx>
  • Delivery-date: Thu, 07 Aug 2025 18:31:50 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Thread-index: AQHcB7ycdMk0c92iU0qjOO1oC+LJsw==
  • Thread-topic: [PATCH 03/20] xen/arm: smmuv3: Alloc io_domain for each device

From: Rahul Singh <rahul.singh@xxxxxxx>

In current implementation io_domain is allocated once for each xen
domain as Stage2 translation is common for all devices in same xen
domain.

Nested stage supports S1 and S2 configuration at the same time. Stage1
translation will be different for each device as linux kernel will
allocate page-table for each device.

Alloc io_domain for each device so that each device can have different
Stage-1 and Stage-2 configuration structure.

Signed-off-by: Rahul Singh <rahul.singh@xxxxxxx>
Signed-off-by: Milan Djokic <milan_djokic@xxxxxxxx>
---
 xen/drivers/passthrough/arm/smmu-v3.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/xen/drivers/passthrough/arm/smmu-v3.c 
b/xen/drivers/passthrough/arm/smmu-v3.c
index 5c96e8ec7c..15ff703458 100644
--- a/xen/drivers/passthrough/arm/smmu-v3.c
+++ b/xen/drivers/passthrough/arm/smmu-v3.c
@@ -2790,11 +2790,13 @@ static struct arm_smmu_device 
*arm_smmu_get_by_dev(const struct device *dev)
 static struct iommu_domain *arm_smmu_get_domain(struct domain *d,
                                struct device *dev)
 {
+       unsigned long flags;
        struct iommu_domain *io_domain;
        struct arm_smmu_domain *smmu_domain;
        struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
        struct arm_smmu_xen_domain *xen_domain = dom_iommu(d)->arch.priv;
        struct arm_smmu_device *smmu = arm_smmu_get_by_dev(fwspec->iommu_dev);
+       struct arm_smmu_master *master;
 
        if (!smmu)
                return NULL;
@@ -2805,8 +2807,15 @@ static struct iommu_domain *arm_smmu_get_domain(struct 
domain *d,
         */
        list_for_each_entry(io_domain, &xen_domain->contexts, list) {
                smmu_domain = to_smmu_domain(io_domain);
-               if (smmu_domain->smmu == smmu)
-                       return io_domain;
+
+               spin_lock_irqsave(&smmu_domain->devices_lock, flags);
+               list_for_each_entry(master, &smmu_domain->devices, domain_head) 
{
+                       if (master->dev == dev) {
+                               
spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
+                               return io_domain;
+                       }
+               }
+               spin_unlock_irqrestore(&smmu_domain->devices_lock, flags);
        }
        return NULL;
 }
-- 
2.43.0



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.