aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu/intel/nested.c
diff options
context:
space:
mode:
authorThomas Zimmermann <[email protected]>2024-03-13 08:43:21 +0000
committerThomas Zimmermann <[email protected]>2024-03-13 08:43:21 +0000
commita2e7496b453eaa577425858d6f8b854800ed7343 (patch)
tree35d05023d51161a28768a29115c8e03e65599fe5 /drivers/iommu/intel/nested.c
parentnouveau/dmem: handle kcalloc() allocation failure (diff)
parentnouveau: lock the client object tree. (diff)
downloadkernel-a2e7496b453eaa577425858d6f8b854800ed7343.tar.gz
kernel-a2e7496b453eaa577425858d6f8b854800ed7343.zip
Merge drm/drm-fixes into drm-misc-fixes
Backmerging to sync before merging the patchset at [1]. [1] https://lore.kernel.org/all/[email protected]/ Signed-off-by: Thomas Zimmermann <[email protected]>
Diffstat (limited to 'drivers/iommu/intel/nested.c')
-rw-r--r--drivers/iommu/intel/nested.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/iommu/intel/nested.c b/drivers/iommu/intel/nested.c
index f26c7f1c46cc..a7d68f3d518a 100644
--- a/drivers/iommu/intel/nested.c
+++ b/drivers/iommu/intel/nested.c
@@ -65,12 +65,20 @@ static int intel_nested_attach_dev(struct iommu_domain *domain,
list_add(&info->link, &dmar_domain->devices);
spin_unlock_irqrestore(&dmar_domain->lock, flags);
+ domain_update_iotlb(dmar_domain);
+
return 0;
}
static void intel_nested_domain_free(struct iommu_domain *domain)
{
- kfree(to_dmar_domain(domain));
+ struct dmar_domain *dmar_domain = to_dmar_domain(domain);
+ struct dmar_domain *s2_domain = dmar_domain->s2_domain;
+
+ spin_lock(&s2_domain->s1_lock);
+ list_del(&dmar_domain->s2_link);
+ spin_unlock(&s2_domain->s1_lock);
+ kfree(dmar_domain);
}
static void nested_flush_dev_iotlb(struct dmar_domain *domain, u64 addr,
@@ -95,7 +103,7 @@ static void nested_flush_dev_iotlb(struct dmar_domain *domain, u64 addr,
}
static void intel_nested_flush_cache(struct dmar_domain *domain, u64 addr,
- unsigned long npages, bool ih)
+ u64 npages, bool ih)
{
struct iommu_domain_info *info;
unsigned int mask;
@@ -201,5 +209,9 @@ struct iommu_domain *intel_nested_domain_alloc(struct iommu_domain *parent,
spin_lock_init(&domain->lock);
xa_init(&domain->iommu_array);
+ spin_lock(&s2_domain->s1_lock);
+ list_add(&domain->s2_link, &s2_domain->s1_domains);
+ spin_unlock(&s2_domain->s1_lock);
+
return &domain->domain;
}