* [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path
@ 2024-10-28 11:31 Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB Vasant Hegde
` (12 more replies)
0 siblings, 13 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde
This series aims to improve domain allocator and attach device code path.
- Replace custom domain ID allocator with IDA allocator.
- Improve protection domain data structure
- Improve attach device code path and replace dev_data spinlock with mutex
- Add ops->release_domain() support
This series is on top of v6.12-rc3.
This is also available at github :
https://github.com/AMDESE/linux-iommu/tree/iommu_rework_attach_dev_v4
Changes from v3 - v4:
- Added release domain support
- Added new patch to fix missign lock in pgtbl_v2 code path
- Reworked protection domain ID allocation code
- Fixed missing lock in TLB flush code path
- Improved amd_iommu_release_device()
V3 : https://lore.kernel.org/linux-iommu/20241016053501.97497-1-vasant.hegde@amd.com/T/#u
Changes from v2 -> v3:
- Rebased on top of v6.12-rc3
- Added Reviewed-by tags
- Updated patch description
V2 : https://lore.kernel.org/linux-iommu/20240910065812.6091-1-vasant.hegde@amd.com/T/#t
Changes from v1 -> v2:
- Rebased on top of iommu/next
- Minor fixes.
V1 : https://lore.kernel.org/linux-iommu/20240828134317.6239-1-vasant.hegde@amd.com/T/#t
-Vasant
Vasant Hegde (12):
iommu/amd/pgtbl_v2: Take protection domain lock before invalidating
TLB
iommu/amd: Use ida interface to manage protection domain ID
iommu/amd: Remove protection_domain.dev_cnt variable
iommu/amd: xarray to track protection_domain->iommu list
iommu/amd: Remove unused amd_iommus variable
iommu/amd: Do not detach devices in domain free path
iommu/amd: Reduce domain lock scope in attach device path
iommu/amd: Rearrange attach device code
iommu/amd: Convert dev_data lock from spinlock to mutex
iommu/amd: Reorder attach device code
iommu/amd: Add opa->release_domain
iommu/amd: Improve amd_iommu_release_device()
drivers/iommu/amd/amd_iommu_types.h | 23 +-
drivers/iommu/amd/init.c | 37 +--
drivers/iommu/amd/io_pgtable_v2.c | 3 +
drivers/iommu/amd/iommu.c | 359 +++++++++++++---------------
4 files changed, 193 insertions(+), 229 deletions(-)
--
2.31.1
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 15:26 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID Vasant Hegde
` (11 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde
Commit c7fc12354be0 ("iommu/amd/pgtbl_v2: Invalidate updated page ranges
only") missed to take domain lock before calling
amd_iommu_domain_flush_pages(). Fix this by taking protection domain
lock before calling TLB invalidation function.
Fixes: c7fc12354be0 ("iommu/amd/pgtbl_v2: Invalidate updated page ranges only")
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/io_pgtable_v2.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/iommu/amd/io_pgtable_v2.c b/drivers/iommu/amd/io_pgtable_v2.c
index 25b9042fa453..c616de2c5926 100644
--- a/drivers/iommu/amd/io_pgtable_v2.c
+++ b/drivers/iommu/amd/io_pgtable_v2.c
@@ -268,8 +268,11 @@ static int iommu_v2_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
out:
if (updated) {
struct protection_domain *pdom = io_pgtable_ops_to_domain(ops);
+ unsigned long flags;
+ spin_lock_irqsave(&pdom->lock, flags);
amd_iommu_domain_flush_pages(pdom, o_iova, size);
+ spin_unlock_irqrestore(&pdom->lock, flags);
}
if (mapped)
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 15:27 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 03/12] iommu/amd: Remove protection_domain.dev_cnt variable Vasant Hegde
` (10 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde
Replace custom domain ID allocator with IDA interface.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/amd_iommu_types.h | 6 ++--
drivers/iommu/amd/init.c | 31 ++++------------
drivers/iommu/amd/iommu.c | 55 +++++++++++++----------------
3 files changed, 34 insertions(+), 58 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 601fb4ee6900..e70f6299f765 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -912,14 +912,14 @@ struct unity_map_entry {
/* size of the dma_ops aperture as power of 2 */
extern unsigned amd_iommu_aperture_order;
-/* allocation bitmap for domain ids */
-extern unsigned long *amd_iommu_pd_alloc_bitmap;
-
extern bool amd_iommu_force_isolation;
/* Max levels of glxval supported */
extern int amd_iommu_max_glx_val;
+/* IDA to track protection domain IDs */
+extern struct ida pdom_ids;
+
/* Global EFR and EFR2 registers */
extern u64 amd_iommu_efr;
extern u64 amd_iommu_efr2;
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 43131c3a2172..8922c0b63316 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -194,12 +194,6 @@ bool amd_iommu_force_isolation __read_mostly;
unsigned long amd_iommu_pgsize_bitmap __ro_after_init = AMD_IOMMU_PGSIZES;
-/*
- * AMD IOMMU allows up to 2^16 different protection domains. This is a bitmap
- * to know which ones are already in use.
- */
-unsigned long *amd_iommu_pd_alloc_bitmap;
-
enum iommu_init_state {
IOMMU_START_STATE,
IOMMU_IVRS_DETECTED,
@@ -1082,7 +1076,12 @@ static bool __copy_device_table(struct amd_iommu *iommu)
if (dte_v && dom_id) {
pci_seg->old_dev_tbl_cpy[devid].data[0] = old_devtb[devid].data[0];
pci_seg->old_dev_tbl_cpy[devid].data[1] = old_devtb[devid].data[1];
- __set_bit(dom_id, amd_iommu_pd_alloc_bitmap);
+ /* Reserve the Domain IDs used by previous kernel */
+ if (ida_alloc_range(&pdom_ids, dom_id, dom_id, GFP_ATOMIC) != dom_id) {
+ pr_err("Failed to reserve domain ID 0x%x\n", dom_id);
+ memunmap(old_devtb);
+ return false;
+ }
/* If gcr3 table existed, mask it out */
if (old_devtb[devid].data[0] & DTE_FLAG_GV) {
tmp = DTE_GCR3_VAL_B(~0ULL) << DTE_GCR3_SHIFT_B;
@@ -2994,9 +2993,7 @@ static bool __init check_ioapic_information(void)
static void __init free_dma_resources(void)
{
- iommu_free_pages(amd_iommu_pd_alloc_bitmap,
- get_order(MAX_DOMAIN_ID / 8));
- amd_iommu_pd_alloc_bitmap = NULL;
+ ida_destroy(&pdom_ids);
free_unity_maps();
}
@@ -3064,20 +3061,6 @@ static int __init early_amd_iommu_init(void)
amd_iommu_target_ivhd_type = get_highest_supported_ivhd_type(ivrs_base);
DUMP_printk("Using IVHD type %#x\n", amd_iommu_target_ivhd_type);
- /* Device table - directly used by all IOMMUs */
- ret = -ENOMEM;
-
- amd_iommu_pd_alloc_bitmap = iommu_alloc_pages(GFP_KERNEL,
- get_order(MAX_DOMAIN_ID / 8));
- if (amd_iommu_pd_alloc_bitmap == NULL)
- goto out;
-
- /*
- * never allocate domain 0 because its used as the non-allocated and
- * error value placeholder
- */
- __set_bit(0, amd_iommu_pd_alloc_bitmap);
-
/*
* now the data structures are allocated and basically initialized
* start the real acpi table scan
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 8364cd6fa47d..1b2175fb3877 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -18,6 +18,7 @@
#include <linux/scatterlist.h>
#include <linux/dma-map-ops.h>
#include <linux/dma-direct.h>
+#include <linux/idr.h>
#include <linux/iommu-helper.h>
#include <linux/delay.h>
#include <linux/amd-iommu.h>
@@ -52,8 +53,6 @@
#define HT_RANGE_START (0xfd00000000ULL)
#define HT_RANGE_END (0xffffffffffULL)
-static DEFINE_SPINLOCK(pd_bitmap_lock);
-
LIST_HEAD(ioapic_map);
LIST_HEAD(hpet_map);
LIST_HEAD(acpihid_map);
@@ -70,6 +69,12 @@ struct iommu_cmd {
u32 data[4];
};
+/*
+ * AMD IOMMU allows up to 2^16 different protection domains. This is a bitmap
+ * to know which ones are already in use.
+ */
+DEFINE_IDA(pdom_ids);
+
struct kmem_cache *amd_iommu_irq_cache;
static void detach_device(struct device *dev);
@@ -1640,31 +1645,14 @@ int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
*
****************************************************************************/
-static u16 domain_id_alloc(void)
+static int amd_iommu_pdom_id_alloc(void)
{
- unsigned long flags;
- int id;
-
- spin_lock_irqsave(&pd_bitmap_lock, flags);
- id = find_first_zero_bit(amd_iommu_pd_alloc_bitmap, MAX_DOMAIN_ID);
- BUG_ON(id == 0);
- if (id > 0 && id < MAX_DOMAIN_ID)
- __set_bit(id, amd_iommu_pd_alloc_bitmap);
- else
- id = 0;
- spin_unlock_irqrestore(&pd_bitmap_lock, flags);
-
- return id;
+ return ida_alloc_range(&pdom_ids, 1, MAX_DOMAIN_ID - 1, GFP_ATOMIC);
}
-static void domain_id_free(int id)
+static void pdom_id_free(int id)
{
- unsigned long flags;
-
- spin_lock_irqsave(&pd_bitmap_lock, flags);
- if (id > 0 && id < MAX_DOMAIN_ID)
- __clear_bit(id, amd_iommu_pd_alloc_bitmap);
- spin_unlock_irqrestore(&pd_bitmap_lock, flags);
+ ida_free(&pdom_ids, id);
}
static void free_gcr3_tbl_level1(u64 *tbl)
@@ -1709,7 +1697,7 @@ static void free_gcr3_table(struct gcr3_tbl_info *gcr3_info)
gcr3_info->glx = 0;
/* Free per device domain ID */
- domain_id_free(gcr3_info->domid);
+ pdom_id_free(gcr3_info->domid);
iommu_free_page(gcr3_info->gcr3_tbl);
gcr3_info->gcr3_tbl = NULL;
@@ -1736,6 +1724,7 @@ static int setup_gcr3_table(struct gcr3_tbl_info *gcr3_info,
{
int levels = get_gcr3_levels(pasids);
int nid = iommu ? dev_to_node(&iommu->dev->dev) : NUMA_NO_NODE;
+ int domid;
if (levels > amd_iommu_max_glx_val)
return -EINVAL;
@@ -1744,11 +1733,14 @@ static int setup_gcr3_table(struct gcr3_tbl_info *gcr3_info,
return -EBUSY;
/* Allocate per device domain ID */
- gcr3_info->domid = domain_id_alloc();
+ domid = amd_iommu_pdom_id_alloc();
+ if (domid <= 0)
+ return -ENOSPC;
+ gcr3_info->domid = domid;
gcr3_info->gcr3_tbl = iommu_alloc_page_node(nid, GFP_ATOMIC);
if (gcr3_info->gcr3_tbl == NULL) {
- domain_id_free(gcr3_info->domid);
+ pdom_id_free(domid);
return -ENOMEM;
}
@@ -2259,7 +2251,7 @@ void protection_domain_free(struct protection_domain *domain)
WARN_ON(!list_empty(&domain->dev_list));
if (domain->domain.type & __IOMMU_DOMAIN_PAGING)
free_io_pgtable_ops(&domain->iop.pgtbl.ops);
- domain_id_free(domain->id);
+ pdom_id_free(domain->id);
kfree(domain);
}
@@ -2267,15 +2259,16 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
{
struct io_pgtable_ops *pgtbl_ops;
struct protection_domain *domain;
- int pgtable;
+ int pgtable, domid;
domain = kzalloc(sizeof(*domain), GFP_KERNEL);
if (!domain)
return NULL;
- domain->id = domain_id_alloc();
- if (!domain->id)
+ domid = amd_iommu_pdom_id_alloc();
+ if (domid <= 0)
goto err_free;
+ domain->id = domid;
spin_lock_init(&domain->lock);
INIT_LIST_HEAD(&domain->dev_list);
@@ -2319,7 +2312,7 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
return domain;
err_id:
- domain_id_free(domain->id);
+ pdom_id_free(domain->id);
err_free:
kfree(domain);
return NULL;
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 03/12] iommu/amd: Remove protection_domain.dev_cnt variable
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 04/12] iommu/amd: xarray to track protection_domain->iommu list Vasant Hegde
` (9 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
protection_domain->dev_list tracks list of attached devices to
domain. We can use list_* functions on dev_list to get device count.
Hence remove 'dev_cnt' variable.
No functional change intended.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/amd_iommu_types.h | 1 -
drivers/iommu/amd/iommu.c | 7 +------
2 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index e70f6299f765..90a752f57463 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -578,7 +578,6 @@ struct protection_domain {
u16 id; /* the domain id written to the device table */
enum protection_domain_mode pd_mode; /* Track page table type */
bool dirty_tracking; /* dirty tracking is enabled in the domain */
- unsigned dev_cnt; /* devices assigned to this domain */
unsigned dev_iommu[MAX_IOMMUS]; /* per-IOMMU reference count */
struct mmu_notifier mn; /* mmu notifier for the SVA domain */
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 1b2175fb3877..2411b79cbba7 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2028,7 +2028,6 @@ static int do_attach(struct iommu_dev_data *dev_data,
/* Do reference counting */
domain->dev_iommu[iommu->index] += 1;
- domain->dev_cnt += 1;
/* Setup GCR3 table */
if (pdom_is_sva_capable(domain)) {
@@ -2061,7 +2060,6 @@ static void do_detach(struct iommu_dev_data *dev_data)
/* decrease reference counters - needs to happen after the flushes */
domain->dev_iommu[iommu->index] -= 1;
- domain->dev_cnt -= 1;
}
/*
@@ -2234,16 +2232,13 @@ static void cleanup_domain(struct protection_domain *domain)
lockdep_assert_held(&domain->lock);
- if (!domain->dev_cnt)
- return;
-
while (!list_empty(&domain->dev_list)) {
entry = list_first_entry(&domain->dev_list,
struct iommu_dev_data, list);
BUG_ON(!entry->domain);
do_detach(entry);
}
- WARN_ON(domain->dev_cnt != 0);
+ WARN_ON(!list_empty(&domain->dev_list));
}
void protection_domain_free(struct protection_domain *domain)
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 04/12] iommu/amd: xarray to track protection_domain->iommu list
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (2 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 03/12] iommu/amd: Remove protection_domain.dev_cnt variable Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 05/12] iommu/amd: Remove unused amd_iommus variable Vasant Hegde
` (8 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
Use xarray to track IOMMU attached to protection domain instead of
static array of MAX_IOMMUS. Also add lockdep assertion.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/amd_iommu_types.h | 8 ++-
drivers/iommu/amd/iommu.c | 89 +++++++++++++++++++++++------
2 files changed, 77 insertions(+), 20 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 90a752f57463..f88f6e4e910f 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -565,6 +565,12 @@ struct pdom_dev_data {
struct list_head list;
};
+/* Keeps track of the IOMMUs attached to protection domain */
+struct pdom_iommu_info {
+ struct amd_iommu *iommu; /* IOMMUs attach to protection domain */
+ u32 refcnt; /* Count of attached dev/pasid per domain/IOMMU */
+};
+
/*
* This structure contains generic data for IOMMU protection domains
* independent of their use.
@@ -578,7 +584,7 @@ struct protection_domain {
u16 id; /* the domain id written to the device table */
enum protection_domain_mode pd_mode; /* Track page table type */
bool dirty_tracking; /* dirty tracking is enabled in the domain */
- unsigned dev_iommu[MAX_IOMMUS]; /* per-IOMMU reference count */
+ struct xarray iommu_array; /* per-IOMMU reference count */
struct mmu_notifier mn; /* mmu notifier for the SVA domain */
struct list_head dev_data_list; /* List of pdom_dev_data */
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 2411b79cbba7..12389ba1e542 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -1254,18 +1254,17 @@ static int iommu_completion_wait(struct amd_iommu *iommu)
static void domain_flush_complete(struct protection_domain *domain)
{
- int i;
+ struct pdom_iommu_info *pdom_iommu_info;
+ unsigned long i;
- for (i = 0; i < amd_iommu_get_num_iommus(); ++i) {
- if (domain && !domain->dev_iommu[i])
- continue;
+ lockdep_assert_held(&domain->lock);
- /*
- * Devices of this domain are behind this IOMMU
- * We need to wait for completion of all commands.
- */
- iommu_completion_wait(amd_iommus[i]);
- }
+ /*
+ * Devices of this domain are behind this IOMMU
+ * We need to wait for completion of all commands.
+ */
+ xa_for_each(&domain->iommu_array, i, pdom_iommu_info)
+ iommu_completion_wait(pdom_iommu_info->iommu);
}
static int iommu_flush_dte(struct amd_iommu *iommu, u16 devid)
@@ -1447,21 +1446,22 @@ static int domain_flush_pages_v2(struct protection_domain *pdom,
static int domain_flush_pages_v1(struct protection_domain *pdom,
u64 address, size_t size)
{
+ struct pdom_iommu_info *pdom_iommu_info;
struct iommu_cmd cmd;
- int ret = 0, i;
+ int ret = 0;
+ unsigned long i;
+
+ lockdep_assert_held(&pdom->lock);
build_inv_iommu_pages(&cmd, address, size,
pdom->id, IOMMU_NO_PASID, false);
- for (i = 0; i < amd_iommu_get_num_iommus(); ++i) {
- if (!pdom->dev_iommu[i])
- continue;
-
+ xa_for_each(&pdom->iommu_array, i, pdom_iommu_info) {
/*
* Devices of this domain are behind this IOMMU
* We need a TLB flush
*/
- ret |= iommu_queue_command(amd_iommus[i], &cmd);
+ ret |= iommu_queue_command(pdom_iommu_info->iommu, &cmd);
}
return ret;
@@ -1500,6 +1500,8 @@ static void __domain_flush_pages(struct protection_domain *domain,
void amd_iommu_domain_flush_pages(struct protection_domain *domain,
u64 address, size_t size)
{
+ lockdep_assert_held(&domain->lock);
+
if (likely(!amd_iommu_np_cache)) {
__domain_flush_pages(domain, address, size);
@@ -2011,6 +2013,50 @@ static void destroy_gcr3_table(struct iommu_dev_data *dev_data,
free_gcr3_table(gcr3_info);
}
+static int pdom_attach_iommu(struct amd_iommu *iommu,
+ struct protection_domain *pdom)
+{
+ struct pdom_iommu_info *pdom_iommu_info, *curr;
+
+ pdom_iommu_info = xa_load(&pdom->iommu_array, iommu->index);
+ if (pdom_iommu_info) {
+ pdom_iommu_info->refcnt++;
+ return 0;
+ }
+
+ pdom_iommu_info = kzalloc(sizeof(*pdom_iommu_info), GFP_ATOMIC);
+ if (!pdom_iommu_info)
+ return -ENOMEM;
+
+ pdom_iommu_info->iommu = iommu;
+ pdom_iommu_info->refcnt = 1;
+
+ curr = xa_cmpxchg(&pdom->iommu_array, iommu->index,
+ NULL, pdom_iommu_info, GFP_ATOMIC);
+ if (curr) {
+ kfree(pdom_iommu_info);
+ return -ENOSPC;
+ }
+
+ return 0;
+}
+
+static void pdom_detach_iommu(struct amd_iommu *iommu,
+ struct protection_domain *pdom)
+{
+ struct pdom_iommu_info *pdom_iommu_info;
+
+ pdom_iommu_info = xa_load(&pdom->iommu_array, iommu->index);
+ if (!pdom_iommu_info)
+ return;
+
+ pdom_iommu_info->refcnt--;
+ if (pdom_iommu_info->refcnt == 0) {
+ xa_erase(&pdom->iommu_array, iommu->index);
+ kfree(pdom_iommu_info);
+ }
+}
+
static int do_attach(struct iommu_dev_data *dev_data,
struct protection_domain *domain)
{
@@ -2027,13 +2073,17 @@ static int do_attach(struct iommu_dev_data *dev_data,
cfg->amd.nid = dev_to_node(dev_data->dev);
/* Do reference counting */
- domain->dev_iommu[iommu->index] += 1;
+ ret = pdom_attach_iommu(iommu, domain);
+ if (ret)
+ return ret;
/* Setup GCR3 table */
if (pdom_is_sva_capable(domain)) {
ret = init_gcr3_table(dev_data, domain);
- if (ret)
+ if (ret) {
+ pdom_detach_iommu(iommu, domain);
return ret;
+ }
}
return ret;
@@ -2059,7 +2109,7 @@ static void do_detach(struct iommu_dev_data *dev_data)
list_del(&dev_data->list);
/* decrease reference counters - needs to happen after the flushes */
- domain->dev_iommu[iommu->index] -= 1;
+ pdom_detach_iommu(iommu, domain);
}
/*
@@ -2268,6 +2318,7 @@ struct protection_domain *protection_domain_alloc(unsigned int type, int nid)
spin_lock_init(&domain->lock);
INIT_LIST_HEAD(&domain->dev_list);
INIT_LIST_HEAD(&domain->dev_data_list);
+ xa_init(&domain->iommu_array);
domain->iop.pgtbl.cfg.amd.nid = nid;
switch (type) {
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 05/12] iommu/amd: Remove unused amd_iommus variable
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (3 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 04/12] iommu/amd: xarray to track protection_domain->iommu list Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 06/12] iommu/amd: Do not detach devices in domain free path Vasant Hegde
` (7 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
protection_domain structure is updated to use xarray to track the IOMMUs
attached to the domain. Now domain flush code is not using amd_iommus.
Hence remove this unused variable.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/amd_iommu_types.h | 6 ------
drivers/iommu/amd/init.c | 6 ------
2 files changed, 12 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index f88f6e4e910f..f44de5f31625 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -877,12 +877,6 @@ extern struct list_head amd_iommu_pci_seg_list;
*/
extern struct list_head amd_iommu_list;
-/*
- * Array with pointers to each IOMMU struct
- * The indices are referenced in the protection domains
- */
-extern struct amd_iommu *amd_iommus[MAX_IOMMUS];
-
/*
* Structure defining one entry in the device table
*/
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 8922c0b63316..ad593908513b 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -177,9 +177,6 @@ LIST_HEAD(amd_iommu_pci_seg_list); /* list of all PCI segments */
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
system */
-/* Array to assign indices to IOMMUs*/
-struct amd_iommu *amd_iommus[MAX_IOMMUS];
-
/* Number of IOMMUs present in the system */
static int amd_iommus_present;
@@ -1743,9 +1740,6 @@ static int __init init_iommu_one(struct amd_iommu *iommu, struct ivhd_header *h,
return -ENOSYS;
}
- /* Index is fine - add IOMMU to the array */
- amd_iommus[iommu->index] = iommu;
-
/*
* Copy data from ACPI table entry to the iommu struct
*/
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 06/12] iommu/amd: Do not detach devices in domain free path
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (4 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 05/12] iommu/amd: Remove unused amd_iommus variable Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path Vasant Hegde
` (6 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
All devices attached to a protection domain must be freed before
calling domain free. Hence do not try to free devices in domain
free path. Continue to throw warning if pdom->dev_list is not empty
so that any potential issues can be fixed.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/iommu.c | 26 +-------------------------
1 file changed, 1 insertion(+), 25 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 12389ba1e542..8919642a5bd9 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2276,21 +2276,6 @@ static struct iommu_group *amd_iommu_device_group(struct device *dev)
*
*****************************************************************************/
-static void cleanup_domain(struct protection_domain *domain)
-{
- struct iommu_dev_data *entry;
-
- lockdep_assert_held(&domain->lock);
-
- while (!list_empty(&domain->dev_list)) {
- entry = list_first_entry(&domain->dev_list,
- struct iommu_dev_data, list);
- BUG_ON(!entry->domain);
- do_detach(entry);
- }
- WARN_ON(!list_empty(&domain->dev_list));
-}
-
void protection_domain_free(struct protection_domain *domain)
{
WARN_ON(!list_empty(&domain->dev_list));
@@ -2446,16 +2431,7 @@ amd_iommu_domain_alloc_user(struct device *dev, u32 flags,
void amd_iommu_domain_free(struct iommu_domain *dom)
{
- struct protection_domain *domain;
- unsigned long flags;
-
- domain = to_pdomain(dom);
-
- spin_lock_irqsave(&domain->lock, flags);
-
- cleanup_domain(domain);
-
- spin_unlock_irqrestore(&domain->lock, flags);
+ struct protection_domain *domain = to_pdomain(dom);
protection_domain_free(domain);
}
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (5 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 06/12] iommu/amd: Do not detach devices in domain free path Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 15:34 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 08/12] iommu/amd: Rearrange attach device code Vasant Hegde
` (5 subsequent siblings)
12 siblings, 1 reply; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde
Currently attach device path takes protection domain lock followed by
dev_data lock. Most of the operations in this function is specific to
device data except pdom_attach_iommu() where it updates protection
domain structure. Hence reduce the scope of protection domain lock.
Note that this changes the locking order. Now it takes device lock
before taking doamin lock (group->mutex -> dev_data->lock ->
pdom->lock). dev_data->lock is used only in device attachment path.
So changing order is fine. It will not create any issue.
Finally move numa node assignment to pdom_attach_iommu().
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/iommu.c | 52 ++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 22 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 8919642a5bd9..cc819d3b1198 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2017,16 +2017,23 @@ static int pdom_attach_iommu(struct amd_iommu *iommu,
struct protection_domain *pdom)
{
struct pdom_iommu_info *pdom_iommu_info, *curr;
+ struct io_pgtable_cfg *cfg = &pdom->iop.pgtbl.cfg;
+ unsigned long flags;
+ int ret = 0;
+
+ spin_lock_irqsave(&pdom->lock, flags);
pdom_iommu_info = xa_load(&pdom->iommu_array, iommu->index);
if (pdom_iommu_info) {
pdom_iommu_info->refcnt++;
- return 0;
+ goto out_unlock;
}
pdom_iommu_info = kzalloc(sizeof(*pdom_iommu_info), GFP_ATOMIC);
- if (!pdom_iommu_info)
- return -ENOMEM;
+ if (!pdom_iommu_info) {
+ ret = -ENOMEM;
+ goto out_unlock;
+ }
pdom_iommu_info->iommu = iommu;
pdom_iommu_info->refcnt = 1;
@@ -2035,43 +2042,52 @@ static int pdom_attach_iommu(struct amd_iommu *iommu,
NULL, pdom_iommu_info, GFP_ATOMIC);
if (curr) {
kfree(pdom_iommu_info);
- return -ENOSPC;
+ ret = -ENOSPC;
+ goto out_unlock;
}
- return 0;
+ /* Update NUMA Node ID */
+ if (cfg->amd.nid == NUMA_NO_NODE)
+ cfg->amd.nid = dev_to_node(&iommu->dev->dev);
+
+out_unlock:
+ spin_unlock_irqrestore(&pdom->lock, flags);
+ return ret;
}
static void pdom_detach_iommu(struct amd_iommu *iommu,
struct protection_domain *pdom)
{
struct pdom_iommu_info *pdom_iommu_info;
+ unsigned long flags;
+
+ spin_lock_irqsave(&pdom->lock, flags);
pdom_iommu_info = xa_load(&pdom->iommu_array, iommu->index);
- if (!pdom_iommu_info)
+ if (!pdom_iommu_info) {
+ spin_unlock_irqrestore(&pdom->lock, flags);
return;
+ }
pdom_iommu_info->refcnt--;
if (pdom_iommu_info->refcnt == 0) {
xa_erase(&pdom->iommu_array, iommu->index);
kfree(pdom_iommu_info);
}
+
+ spin_unlock_irqrestore(&pdom->lock, flags);
}
static int do_attach(struct iommu_dev_data *dev_data,
struct protection_domain *domain)
{
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
- struct io_pgtable_cfg *cfg = &domain->iop.pgtbl.cfg;
int ret = 0;
/* Update data structures */
dev_data->domain = domain;
list_add(&dev_data->list, &domain->dev_list);
- /* Update NUMA Node ID */
- if (cfg->amd.nid == NUMA_NO_NODE)
- cfg->amd.nid = dev_to_node(dev_data->dev);
-
/* Do reference counting */
ret = pdom_attach_iommu(iommu, domain);
if (ret)
@@ -2093,12 +2109,15 @@ static void do_detach(struct iommu_dev_data *dev_data)
{
struct protection_domain *domain = dev_data->domain;
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
+ unsigned long flags;
/* Clear DTE and flush the entry */
dev_update_dte(dev_data, false);
/* Flush IOTLB and wait for the flushes to finish */
+ spin_lock_irqsave(&domain->lock, flags);
amd_iommu_domain_flush_all(domain);
+ spin_unlock_irqrestore(&domain->lock, flags);
/* Clear GCR3 table */
if (pdom_is_sva_capable(domain))
@@ -2120,11 +2139,8 @@ static int attach_device(struct device *dev,
struct protection_domain *domain)
{
struct iommu_dev_data *dev_data;
- unsigned long flags;
int ret = 0;
- spin_lock_irqsave(&domain->lock, flags);
-
dev_data = dev_iommu_priv_get(dev);
spin_lock(&dev_data->lock);
@@ -2139,8 +2155,6 @@ static int attach_device(struct device *dev,
out:
spin_unlock(&dev_data->lock);
- spin_unlock_irqrestore(&domain->lock, flags);
-
return ret;
}
@@ -2150,13 +2164,9 @@ static int attach_device(struct device *dev,
static void detach_device(struct device *dev)
{
struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
- struct protection_domain *domain = dev_data->domain;
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
- unsigned long flags;
bool ppr = dev_data->ppr;
- spin_lock_irqsave(&domain->lock, flags);
-
spin_lock(&dev_data->lock);
/*
@@ -2180,8 +2190,6 @@ static void detach_device(struct device *dev)
out:
spin_unlock(&dev_data->lock);
- spin_unlock_irqrestore(&domain->lock, flags);
-
/* Remove IOPF handler */
if (ppr)
amd_iommu_iopf_remove_device(iommu, dev_data);
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 08/12] iommu/amd: Rearrange attach device code
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (6 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 09/12] iommu/amd: Convert dev_data lock from spinlock to mutex Vasant Hegde
` (4 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
attach_device() is just holding lock and calling do_attach(). There is
not need to have another function. Just move do_attach() code to
attach_device(). Similary move do_detach() code to detach_device().
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/iommu.c | 91 ++++++++++++++++-----------------------
1 file changed, 36 insertions(+), 55 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index cc819d3b1198..a7257d9e6388 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2078,12 +2078,24 @@ static void pdom_detach_iommu(struct amd_iommu *iommu,
spin_unlock_irqrestore(&pdom->lock, flags);
}
-static int do_attach(struct iommu_dev_data *dev_data,
- struct protection_domain *domain)
+/*
+ * If a device is not yet associated with a domain, this function makes the
+ * device visible in the domain
+ */
+static int attach_device(struct device *dev,
+ struct protection_domain *domain)
{
+ struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
int ret = 0;
+ spin_lock(&dev_data->lock);
+
+ if (dev_data->domain != NULL) {
+ ret = -EBUSY;
+ goto out;
+ }
+
/* Update data structures */
dev_data->domain = domain;
list_add(&dev_data->list, &domain->dev_list);
@@ -2091,67 +2103,17 @@ static int do_attach(struct iommu_dev_data *dev_data,
/* Do reference counting */
ret = pdom_attach_iommu(iommu, domain);
if (ret)
- return ret;
+ goto out;
/* Setup GCR3 table */
if (pdom_is_sva_capable(domain)) {
ret = init_gcr3_table(dev_data, domain);
if (ret) {
pdom_detach_iommu(iommu, domain);
- return ret;
+ goto out;
}
}
- return ret;
-}
-
-static void do_detach(struct iommu_dev_data *dev_data)
-{
- struct protection_domain *domain = dev_data->domain;
- struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
- unsigned long flags;
-
- /* Clear DTE and flush the entry */
- dev_update_dte(dev_data, false);
-
- /* Flush IOTLB and wait for the flushes to finish */
- spin_lock_irqsave(&domain->lock, flags);
- amd_iommu_domain_flush_all(domain);
- spin_unlock_irqrestore(&domain->lock, flags);
-
- /* Clear GCR3 table */
- if (pdom_is_sva_capable(domain))
- destroy_gcr3_table(dev_data, domain);
-
- /* Update data structures */
- dev_data->domain = NULL;
- list_del(&dev_data->list);
-
- /* decrease reference counters - needs to happen after the flushes */
- pdom_detach_iommu(iommu, domain);
-}
-
-/*
- * If a device is not yet associated with a domain, this function makes the
- * device visible in the domain
- */
-static int attach_device(struct device *dev,
- struct protection_domain *domain)
-{
- struct iommu_dev_data *dev_data;
- int ret = 0;
-
- dev_data = dev_iommu_priv_get(dev);
-
- spin_lock(&dev_data->lock);
-
- if (dev_data->domain != NULL) {
- ret = -EBUSY;
- goto out;
- }
-
- ret = do_attach(dev_data, domain);
-
out:
spin_unlock(&dev_data->lock);
@@ -2165,7 +2127,9 @@ static void detach_device(struct device *dev)
{
struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
+ struct protection_domain *domain = dev_data->domain;
bool ppr = dev_data->ppr;
+ unsigned long flags;
spin_lock(&dev_data->lock);
@@ -2185,7 +2149,24 @@ static void detach_device(struct device *dev)
dev_data->ppr = false;
}
- do_detach(dev_data);
+ /* Clear DTE and flush the entry */
+ dev_update_dte(dev_data, false);
+
+ /* Flush IOTLB and wait for the flushes to finish */
+ spin_lock_irqsave(&domain->lock, flags);
+ amd_iommu_domain_flush_all(domain);
+ spin_unlock_irqrestore(&domain->lock, flags);
+
+ /* Clear GCR3 table */
+ if (pdom_is_sva_capable(domain))
+ destroy_gcr3_table(dev_data, domain);
+
+ /* Update data structures */
+ dev_data->domain = NULL;
+ list_del(&dev_data->list);
+
+ /* decrease reference counters - needs to happen after the flushes */
+ pdom_detach_iommu(iommu, domain);
out:
spin_unlock(&dev_data->lock);
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 09/12] iommu/amd: Convert dev_data lock from spinlock to mutex
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (7 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 08/12] iommu/amd: Rearrange attach device code Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 10/12] iommu/amd: Reorder attach device code Vasant Hegde
` (3 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Joerg Roedel, Jason Gunthorpe
Currently in attach device path it takes dev_data->spinlock. But as per
design attach device path can sleep. Also if device is PRI capable then
it adds device to IOMMU fault handler queue which takes mutex. Hence
currently PRI enablement is done outside dev_data lock.
Covert dev_data lock from spinlock to mutex so that it follows the
design and also PRI enablement can be done properly.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Joerg Roedel <jroedel@suse.de>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/amd_iommu_types.h | 2 +-
drivers/iommu/amd/iommu.c | 14 +++++++-------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index f44de5f31625..fdb0357e0bb9 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -836,7 +836,7 @@ struct devid_map {
*/
struct iommu_dev_data {
/*Protect against attach/detach races */
- spinlock_t lock;
+ struct mutex mutex;
struct list_head list; /* For domain->dev_list */
struct llist_node dev_data_list; /* For global dev_data_list */
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index a7257d9e6388..fac634b24c72 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -207,7 +207,7 @@ static struct iommu_dev_data *alloc_dev_data(struct amd_iommu *iommu, u16 devid)
if (!dev_data)
return NULL;
- spin_lock_init(&dev_data->lock);
+ mutex_init(&dev_data->mutex);
dev_data->devid = devid;
ratelimit_default_init(&dev_data->rs);
@@ -2089,7 +2089,7 @@ static int attach_device(struct device *dev,
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
int ret = 0;
- spin_lock(&dev_data->lock);
+ mutex_lock(&dev_data->mutex);
if (dev_data->domain != NULL) {
ret = -EBUSY;
@@ -2115,7 +2115,7 @@ static int attach_device(struct device *dev,
}
out:
- spin_unlock(&dev_data->lock);
+ mutex_unlock(&dev_data->mutex);
return ret;
}
@@ -2131,7 +2131,7 @@ static void detach_device(struct device *dev)
bool ppr = dev_data->ppr;
unsigned long flags;
- spin_lock(&dev_data->lock);
+ mutex_lock(&dev_data->mutex);
/*
* First check if the device is still attached. It might already
@@ -2169,7 +2169,7 @@ static void detach_device(struct device *dev)
pdom_detach_iommu(iommu, domain);
out:
- spin_unlock(&dev_data->lock);
+ mutex_unlock(&dev_data->mutex);
/* Remove IOPF handler */
if (ppr)
@@ -2434,9 +2434,9 @@ static int blocked_domain_attach_device(struct iommu_domain *domain,
detach_device(dev);
/* Clear DTE and flush the entry */
- spin_lock(&dev_data->lock);
+ mutex_lock(&dev_data->mutex);
dev_update_dte(dev_data, false);
- spin_unlock(&dev_data->lock);
+ mutex_unlock(&dev_data->mutex);
return 0;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 10/12] iommu/amd: Reorder attach device code
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (8 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 09/12] iommu/amd: Convert dev_data lock from spinlock to mutex Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 11/12] iommu/amd: Add opa->release_domain Vasant Hegde
` (2 subsequent siblings)
12 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Jason Gunthorpe
Ideally in attach device path, it should take dev_data lock before
making changes to device data including IOPF enablement. So far dev_data
was using spinlock and it was hitting lock order issue when it tries to
enable IOPF. Hence Commit 526606b0a199 ("iommu/amd: Fix Invalid wait
context issue") moved IOPF enablement outside dev_data->lock.
Previous patch converted dev_data lock to mutex. Now its safe to call
amd_iommu_iopf_add_device() with dev_data->mutex. Hence move back PCI
device capability enablement (ATS, PRI, PASID) and IOPF enablement code
inside the lock. Also in attach_device(), update 'dev_data->domain' at
the end so that error handling becomes simple.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
---
drivers/iommu/amd/iommu.c | 65 +++++++++++++++++----------------------
1 file changed, 29 insertions(+), 36 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index fac634b24c72..c2e1d87891e5 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2087,6 +2087,7 @@ static int attach_device(struct device *dev,
{
struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
+ struct pci_dev *pdev;
int ret = 0;
mutex_lock(&dev_data->mutex);
@@ -2096,10 +2097,6 @@ static int attach_device(struct device *dev,
goto out;
}
- /* Update data structures */
- dev_data->domain = domain;
- list_add(&dev_data->list, &domain->dev_list);
-
/* Do reference counting */
ret = pdom_attach_iommu(iommu, domain);
if (ret)
@@ -2114,6 +2111,28 @@ static int attach_device(struct device *dev,
}
}
+ pdev = dev_is_pci(dev_data->dev) ? to_pci_dev(dev_data->dev) : NULL;
+ if (pdev && pdom_is_sva_capable(domain)) {
+ pdev_enable_caps(pdev);
+
+ /*
+ * Device can continue to function even if IOPF
+ * enablement failed. Hence in error path just
+ * disable device PRI support.
+ */
+ if (amd_iommu_iopf_add_device(iommu, dev_data))
+ pdev_disable_cap_pri(pdev);
+ } else if (pdev) {
+ pdev_enable_cap_ats(pdev);
+ }
+
+ /* Update data structures */
+ dev_data->domain = domain;
+ list_add(&dev_data->list, &domain->dev_list);
+
+ /* Update device table */
+ dev_update_dte(dev_data, true);
+
out:
mutex_unlock(&dev_data->mutex);
@@ -2128,7 +2147,6 @@ static void detach_device(struct device *dev)
struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
struct amd_iommu *iommu = get_amd_iommu_from_dev_data(dev_data);
struct protection_domain *domain = dev_data->domain;
- bool ppr = dev_data->ppr;
unsigned long flags;
mutex_lock(&dev_data->mutex);
@@ -2142,13 +2160,15 @@ static void detach_device(struct device *dev)
if (WARN_ON(!dev_data->domain))
goto out;
- if (ppr) {
+ /* Remove IOPF handler */
+ if (dev_data->ppr) {
iopf_queue_flush_dev(dev);
-
- /* Updated here so that it gets reflected in DTE */
- dev_data->ppr = false;
+ amd_iommu_iopf_remove_device(iommu, dev_data);
}
+ if (dev_is_pci(dev))
+ pdev_disable_caps(to_pci_dev(dev));
+
/* Clear DTE and flush the entry */
dev_update_dte(dev_data, false);
@@ -2170,14 +2190,6 @@ static void detach_device(struct device *dev)
out:
mutex_unlock(&dev_data->mutex);
-
- /* Remove IOPF handler */
- if (ppr)
- amd_iommu_iopf_remove_device(iommu, dev_data);
-
- if (dev_is_pci(dev))
- pdev_disable_caps(to_pci_dev(dev));
-
}
static struct iommu_device *amd_iommu_probe_device(struct device *dev)
@@ -2454,7 +2466,6 @@ static int amd_iommu_attach_device(struct iommu_domain *dom,
struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
struct protection_domain *domain = to_pdomain(dom);
struct amd_iommu *iommu = get_amd_iommu_from_dev(dev);
- struct pci_dev *pdev;
int ret;
/*
@@ -2487,24 +2498,6 @@ static int amd_iommu_attach_device(struct iommu_domain *dom,
}
#endif
- pdev = dev_is_pci(dev_data->dev) ? to_pci_dev(dev_data->dev) : NULL;
- if (pdev && pdom_is_sva_capable(domain)) {
- pdev_enable_caps(pdev);
-
- /*
- * Device can continue to function even if IOPF
- * enablement failed. Hence in error path just
- * disable device PRI support.
- */
- if (amd_iommu_iopf_add_device(iommu, dev_data))
- pdev_disable_cap_pri(pdev);
- } else if (pdev) {
- pdev_enable_cap_ats(pdev);
- }
-
- /* Update device table */
- dev_update_dte(dev_data, true);
-
return ret;
}
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 11/12] iommu/amd: Add opa->release_domain
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (9 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 10/12] iommu/amd: Reorder attach device code Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 15:35 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device() Vasant Hegde
2024-10-29 9:14 ` [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Joerg Roedel
12 siblings, 1 reply; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde
In release path, remove device from existing domain and attach it to
blocked domain. So that all DMAs from device is blocked.
Note that soon blocked_domain will support other ops like
set_dev_pasid() but release_domain supports only attach_dev ops.
Hence added separate 'release_domain' variable.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/iommu.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index c2e1d87891e5..b613636286c1 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2460,6 +2460,14 @@ static struct iommu_domain blocked_domain = {
}
};
+/* Same as blocked domain except it supports only ops->attach_dev() */
+static struct iommu_domain release_domain = {
+ .type = IOMMU_DOMAIN_BLOCKED,
+ .ops = &(const struct iommu_domain_ops) {
+ .attach_dev = blocked_domain_attach_device,
+ }
+};
+
static int amd_iommu_attach_device(struct iommu_domain *dom,
struct device *dev)
{
@@ -2839,6 +2847,7 @@ static int amd_iommu_dev_disable_feature(struct device *dev,
const struct iommu_ops amd_iommu_ops = {
.capable = amd_iommu_capable,
.blocked_domain = &blocked_domain,
+ .release_domain = &release_domain,
.domain_alloc = amd_iommu_domain_alloc,
.domain_alloc_user = amd_iommu_domain_alloc_user,
.domain_alloc_sva = amd_iommu_domain_alloc_sva,
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device()
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (10 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 11/12] iommu/amd: Add opa->release_domain Vasant Hegde
@ 2024-10-28 11:31 ` Vasant Hegde
2024-10-28 15:40 ` Jason Gunthorpe
2024-10-29 9:14 ` [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Joerg Roedel
12 siblings, 1 reply; 21+ messages in thread
From: Vasant Hegde @ 2024-10-28 11:31 UTC (permalink / raw)
To: iommu, joro
Cc: will, robin.murphy, suravee.suthikulpanit, jgg, Vasant Hegde,
Jason Gunthorpe
Previous patch added ops->release_domain support. Core will attach
devices to release_domain->attach_dev() before calling this function.
Devices are already detached their current domain and attached to
blocked domain.
This is mostly dummy function now. Just throw warning if device is still
attached to domain.
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
drivers/iommu/amd/iommu.c | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index b613636286c1..fc408340dca2 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -77,8 +77,6 @@ DEFINE_IDA(pdom_ids);
struct kmem_cache *amd_iommu_irq_cache;
-static void detach_device(struct device *dev);
-
static void set_dte_entry(struct amd_iommu *iommu,
struct iommu_dev_data *dev_data);
@@ -560,22 +558,6 @@ static void iommu_ignore_device(struct amd_iommu *iommu, struct device *dev)
setup_aliases(iommu, dev);
}
-static void amd_iommu_uninit_device(struct device *dev)
-{
- struct iommu_dev_data *dev_data;
-
- dev_data = dev_iommu_priv_get(dev);
- if (!dev_data)
- return;
-
- if (dev_data->domain)
- detach_device(dev);
-
- /*
- * We keep dev_data around for unplugged devices and reuse it when the
- * device is re-plugged - not doing so would introduce a ton of races.
- */
-}
/****************************************************************************
*
@@ -2246,17 +2228,14 @@ static struct iommu_device *amd_iommu_probe_device(struct device *dev)
static void amd_iommu_release_device(struct device *dev)
{
- struct amd_iommu *iommu;
-
- if (!check_device(dev))
- return;
+ struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
- iommu = rlookup_amd_iommu(dev);
- if (!iommu)
- return;
+ WARN_ON(dev_data->domain);
- amd_iommu_uninit_device(dev);
- iommu_completion_wait(iommu);
+ /*
+ * We keep dev_data around for unplugged devices and reuse it when the
+ * device is re-plugged - not doing so would introduce a ton of races.
+ */
}
static struct iommu_group *amd_iommu_device_group(struct device *dev)
--
2.31.1
^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB
2024-10-28 11:31 ` [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB Vasant Hegde
@ 2024-10-28 15:26 ` Jason Gunthorpe
0 siblings, 0 replies; 21+ messages in thread
From: Jason Gunthorpe @ 2024-10-28 15:26 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit
On Mon, Oct 28, 2024 at 11:31:37AM +0000, Vasant Hegde wrote:
> Commit c7fc12354be0 ("iommu/amd/pgtbl_v2: Invalidate updated page ranges
> only") missed to take domain lock before calling
> amd_iommu_domain_flush_pages(). Fix this by taking protection domain
> lock before calling TLB invalidation function.
>
> Fixes: c7fc12354be0 ("iommu/amd/pgtbl_v2: Invalidate updated page ranges only")
> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
> ---
> drivers/iommu/amd/io_pgtable_v2.c | 3 +++
> 1 file changed, 3 insertions(+)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID
2024-10-28 11:31 ` [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID Vasant Hegde
@ 2024-10-28 15:27 ` Jason Gunthorpe
0 siblings, 0 replies; 21+ messages in thread
From: Jason Gunthorpe @ 2024-10-28 15:27 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit
On Mon, Oct 28, 2024 at 11:31:38AM +0000, Vasant Hegde wrote:
> Replace custom domain ID allocator with IDA interface.
>
> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
> ---
> drivers/iommu/amd/amd_iommu_types.h | 6 ++--
> drivers/iommu/amd/init.c | 31 ++++------------
> drivers/iommu/amd/iommu.c | 55 +++++++++++++----------------
> 3 files changed, 34 insertions(+), 58 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path
2024-10-28 11:31 ` [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path Vasant Hegde
@ 2024-10-28 15:34 ` Jason Gunthorpe
0 siblings, 0 replies; 21+ messages in thread
From: Jason Gunthorpe @ 2024-10-28 15:34 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit
On Mon, Oct 28, 2024 at 11:31:43AM +0000, Vasant Hegde wrote:
> Currently attach device path takes protection domain lock followed by
> dev_data lock. Most of the operations in this function is specific to
> device data except pdom_attach_iommu() where it updates protection
> domain structure. Hence reduce the scope of protection domain lock.
>
> Note that this changes the locking order. Now it takes device lock
> before taking doamin lock (group->mutex -> dev_data->lock ->
> pdom->lock). dev_data->lock is used only in device attachment path.
> So changing order is fine. It will not create any issue.
>
> Finally move numa node assignment to pdom_attach_iommu().
>
> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
> ---
> drivers/iommu/amd/iommu.c | 52 ++++++++++++++++++++++-----------------
> 1 file changed, 30 insertions(+), 22 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 11/12] iommu/amd: Add opa->release_domain
2024-10-28 11:31 ` [PATCH v4 11/12] iommu/amd: Add opa->release_domain Vasant Hegde
@ 2024-10-28 15:35 ` Jason Gunthorpe
0 siblings, 0 replies; 21+ messages in thread
From: Jason Gunthorpe @ 2024-10-28 15:35 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit
On Mon, Oct 28, 2024 at 11:31:47AM +0000, Vasant Hegde wrote:
> In release path, remove device from existing domain and attach it to
> blocked domain. So that all DMAs from device is blocked.
>
> Note that soon blocked_domain will support other ops like
> set_dev_pasid() but release_domain supports only attach_dev ops.
> Hence added separate 'release_domain' variable.
You don't need two domains, so long as attach_dev does the right thing
the other ops can be set too.
Otherwise
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device()
2024-10-28 11:31 ` [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device() Vasant Hegde
@ 2024-10-28 15:40 ` Jason Gunthorpe
0 siblings, 0 replies; 21+ messages in thread
From: Jason Gunthorpe @ 2024-10-28 15:40 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit
On Mon, Oct 28, 2024 at 11:31:48AM +0000, Vasant Hegde wrote:
> Previous patch added ops->release_domain support. Core will attach
> devices to release_domain->attach_dev() before calling this function.
> Devices are already detached their current domain and attached to
> blocked domain.
>
> This is mostly dummy function now. Just throw warning if device is still
> attached to domain.
>
> Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
> ---
> drivers/iommu/amd/iommu.c | 33 ++++++---------------------------
> 1 file changed, 6 insertions(+), 27 deletions(-)
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Jason
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
` (11 preceding siblings ...)
2024-10-28 11:31 ` [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device() Vasant Hegde
@ 2024-10-29 9:14 ` Joerg Roedel
2024-10-29 10:15 ` Joerg Roedel
12 siblings, 1 reply; 21+ messages in thread
From: Joerg Roedel @ 2024-10-29 9:14 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, will, robin.murphy, suravee.suthikulpanit, jgg
On Mon, Oct 28, 2024 at 11:31:36AM +0000, Vasant Hegde wrote:
> Vasant Hegde (12):
> iommu/amd/pgtbl_v2: Take protection domain lock before invalidating
> TLB
> iommu/amd: Use ida interface to manage protection domain ID
> iommu/amd: Remove protection_domain.dev_cnt variable
> iommu/amd: xarray to track protection_domain->iommu list
> iommu/amd: Remove unused amd_iommus variable
> iommu/amd: Do not detach devices in domain free path
> iommu/amd: Reduce domain lock scope in attach device path
> iommu/amd: Rearrange attach device code
> iommu/amd: Convert dev_data lock from spinlock to mutex
> iommu/amd: Reorder attach device code
> iommu/amd: Add opa->release_domain
> iommu/amd: Improve amd_iommu_release_device()
>
> drivers/iommu/amd/amd_iommu_types.h | 23 +-
> drivers/iommu/amd/init.c | 37 +--
> drivers/iommu/amd/io_pgtable_v2.c | 3 +
> drivers/iommu/amd/iommu.c | 359 +++++++++++++---------------
> 4 files changed, 193 insertions(+), 229 deletions(-)
Applied, thanks.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path
2024-10-29 9:14 ` [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Joerg Roedel
@ 2024-10-29 10:15 ` Joerg Roedel
2024-10-29 16:36 ` Vasant Hegde
0 siblings, 1 reply; 21+ messages in thread
From: Joerg Roedel @ 2024-10-29 10:15 UTC (permalink / raw)
To: Vasant Hegde; +Cc: iommu, will, robin.murphy, suravee.suthikulpanit, jgg
On Tue, Oct 29, 2024 at 10:14:52AM +0100, Joerg Roedel wrote:
> Applied, thanks.
I have to take that back, this series heavily conflicts with the changes
in the core branch. I think I resolved everything, but it looks pretty
messy.
Can you please rebase this series on-top of the latest core branch (I just
pushed the core branch only) and re-send? Backporters of these changes
will be very grateful.
Thanks,
Joerg
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path
2024-10-29 10:15 ` Joerg Roedel
@ 2024-10-29 16:36 ` Vasant Hegde
0 siblings, 0 replies; 21+ messages in thread
From: Vasant Hegde @ 2024-10-29 16:36 UTC (permalink / raw)
To: Joerg Roedel; +Cc: iommu, will, robin.murphy, suravee.suthikulpanit, jgg
Joerg,
On 10/29/2024 3:45 PM, Joerg Roedel wrote:
> On Tue, Oct 29, 2024 at 10:14:52AM +0100, Joerg Roedel wrote:
>> Applied, thanks.
>
> I have to take that back, this series heavily conflicts with the changes
> in the core branch. I think I resolved everything, but it looks pretty
> messy.
Right. It does have conflict (I was not sure which one will go first. So I
didn't create dependency between two series).
I will rebase and send it tomorrow.
-Vasant
>
> Can you please rebase this series on-top of the latest core branch (I just
> pushed the core branch only) and re-send? Backporters of these changes
> will be very grateful.
>
> Thanks,
>
> Joerg
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2024-10-29 16:36 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-28 11:31 [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 01/12] iommu/amd/pgtbl_v2: Take protection domain lock before invalidating TLB Vasant Hegde
2024-10-28 15:26 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 02/12] iommu/amd: Use ida interface to manage protection domain ID Vasant Hegde
2024-10-28 15:27 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 03/12] iommu/amd: Remove protection_domain.dev_cnt variable Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 04/12] iommu/amd: xarray to track protection_domain->iommu list Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 05/12] iommu/amd: Remove unused amd_iommus variable Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 06/12] iommu/amd: Do not detach devices in domain free path Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 07/12] iommu/amd: Reduce domain lock scope in attach device path Vasant Hegde
2024-10-28 15:34 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 08/12] iommu/amd: Rearrange attach device code Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 09/12] iommu/amd: Convert dev_data lock from spinlock to mutex Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 10/12] iommu/amd: Reorder attach device code Vasant Hegde
2024-10-28 11:31 ` [PATCH v4 11/12] iommu/amd: Add opa->release_domain Vasant Hegde
2024-10-28 15:35 ` Jason Gunthorpe
2024-10-28 11:31 ` [PATCH v4 12/12] iommu/amd: Improve amd_iommu_release_device() Vasant Hegde
2024-10-28 15:40 ` Jason Gunthorpe
2024-10-29 9:14 ` [PATCH v4 00/12] iommu/amd: Improve domain allocator and device attach code path Joerg Roedel
2024-10-29 10:15 ` Joerg Roedel
2024-10-29 16:36 ` Vasant Hegde
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.