From: Joerg Roedel <joerg.roedel@amd.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org,
Joerg Roedel <joerg.roedel@amd.com>
Subject: [PATCH 29/34] x86/amd-iommu: Keep devices per domain in a list
Date: Fri, 27 Nov 2009 14:55:40 +0100 [thread overview]
Message-ID: <1259330145-14865-30-git-send-email-joerg.roedel@amd.com> (raw)
In-Reply-To: <1259330145-14865-1-git-send-email-joerg.roedel@amd.com>
This patch introduces a list to each protection domain which
keeps all devices associated with the domain. This can be
used later to optimize certain functions and to completly
remove the amd_iommu_pd_table.
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
---
arch/x86/include/asm/amd_iommu_types.h | 2 ++
arch/x86/kernel/amd_iommu.c | 11 +++++++++++
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h
index 434e90e..93953d1 100644
--- a/arch/x86/include/asm/amd_iommu_types.h
+++ b/arch/x86/include/asm/amd_iommu_types.h
@@ -235,6 +235,7 @@ extern bool amd_iommu_np_cache;
*/
struct protection_domain {
struct list_head list; /* for list of all protection domains */
+ struct list_head dev_list; /* List of all devices in this domain */
spinlock_t lock; /* mostly used to lock the page table*/
u16 id; /* the domain id written to the device table */
int mode; /* paging mode (0-6 levels) */
@@ -251,6 +252,7 @@ struct protection_domain {
* This struct contains device specific data for the IOMMU
*/
struct iommu_dev_data {
+ struct list_head list; /* For domain->dev_list */
struct device *alias; /* The Alias Device */
struct protection_domain *domain; /* Domain the device is bound to */
atomic_t bind; /* Domain attach reverent count */
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
index f5db7d5..530d608 100644
--- a/arch/x86/kernel/amd_iommu.c
+++ b/arch/x86/kernel/amd_iommu.c
@@ -1286,6 +1286,7 @@ static struct dma_ops_domain *dma_ops_domain_alloc(void)
dma_dom->domain.id = domain_id_alloc();
if (dma_dom->domain.id == 0)
goto free_dma_dom;
+ INIT_LIST_HEAD(&dma_dom->domain.dev_list);
dma_dom->domain.mode = PAGE_MODE_2_LEVEL;
dma_dom->domain.pt_root = (void *)get_zeroed_page(GFP_KERNEL);
dma_dom->domain.flags = PD_DMA_OPS_MASK;
@@ -1408,6 +1409,7 @@ static int __attach_device(struct device *dev,
if (alias != devid) {
if (alias_data->domain == NULL) {
alias_data->domain = domain;
+ list_add(&alias_data->list, &domain->dev_list);
set_dte_entry(alias, domain);
}
@@ -1416,6 +1418,7 @@ static int __attach_device(struct device *dev,
if (dev_data->domain == NULL) {
dev_data->domain = domain;
+ list_add(&dev_data->list, &domain->dev_list);
set_dte_entry(devid, domain);
}
@@ -1460,6 +1463,7 @@ static void __detach_device(struct device *dev)
struct amd_iommu *iommu = amd_iommu_rlookup_table[devid];
struct iommu_dev_data *dev_data = get_dev_data(dev);
struct iommu_dev_data *alias_data;
+ unsigned long flags;
BUG_ON(!iommu);
@@ -1469,13 +1473,19 @@ static void __detach_device(struct device *dev)
if (devid != alias) {
alias_data = get_dev_data(dev_data->alias);
if (atomic_dec_and_test(&alias_data->bind)) {
+ spin_lock_irqsave(&alias_data->domain->lock, flags);
clear_dte_entry(alias);
+ list_del(&alias_data->list);
+ spin_unlock_irqrestore(&alias_data->domain->lock, flags);
alias_data->domain = NULL;
}
}
if (atomic_dec_and_test(&dev_data->bind)) {
+ spin_lock_irqsave(&dev_data->domain->lock, flags);
clear_dte_entry(devid);
+ list_del(&dev_data->list);
+ spin_unlock_irqrestore(&dev_data->domain->lock, flags);
dev_data->domain = NULL;
}
@@ -2294,6 +2304,7 @@ static struct protection_domain *protection_domain_alloc(void)
domain->id = domain_id_alloc();
if (!domain->id)
goto out_err;
+ INIT_LIST_HEAD(&domain->dev_list);
add_domain_to_list(domain);
--
1.6.5.3
next prev parent reply other threads:[~2009-11-27 13:58 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-27 13:55 [git pull] IOMMU updates for 2.6.33 Joerg Roedel
2009-11-27 13:55 ` [PATCH 01/34] x86/amd-iommu: Separate internal interface definitions Joerg Roedel
2009-11-27 13:55 ` [PATCH 02/34] x86/amd-iommu: Update copyright headers Joerg Roedel
2009-11-27 13:55 ` [PATCH 03/34] x86/amd-iommu: Add an index field to struct amd_iommu Joerg Roedel
2009-11-27 13:55 ` [PATCH 04/34] x86/amd-iommu: Add per IOMMU reference counting Joerg Roedel
2009-11-27 13:55 ` [PATCH 05/34] x86/amd-iommu: Add function to complete a tlb flush Joerg Roedel
2009-11-27 13:55 ` [PATCH 06/34] x86/amd-iommu: Make iommu_flush_pages aware of multiple IOMMUs Joerg Roedel
2009-11-27 13:55 ` [PATCH 07/34] x86/amd-iommu: Use __iommu_flush_pages for tlb flushes Joerg Roedel
2009-11-27 13:55 ` [PATCH 08/34] x86/amd-iommu: Remove iommu_flush_domain function Joerg Roedel
2009-11-27 13:55 ` [PATCH 09/34] x86/amd-iommu: Implement protection domain list Joerg Roedel
2009-11-27 13:55 ` [PATCH 10/34] x86/amd-iommu: Reimplement amd_iommu_flush_all_domains() Joerg Roedel
2009-11-27 13:55 ` [PATCH 11/34] x86/amd-iommu: Reimplement flush_all_domains_on_iommu() Joerg Roedel
2009-11-27 13:55 ` [PATCH 12/34] x86/amd-iommu: Make np-cache a global flag Joerg Roedel
2009-11-27 13:55 ` [PATCH 13/34] x86/amd-iommu: Use check_device for amd_iommu_dma_supported Joerg Roedel
2009-11-27 13:55 ` [PATCH 14/34] x86/amd-iommu: Use check_device in get_device_resources Joerg Roedel
2009-11-27 13:55 ` [PATCH 15/34] x86/amd-iommu: Remove iommu parameter from dma_ops_domain_(un)map Joerg Roedel
2009-11-27 13:55 ` [PATCH 16/34] x86/amd-iommu: Make alloc_new_range aware of multiple IOMMUs Joerg Roedel
2009-11-27 13:55 ` [PATCH 17/34] x86/amd-iommu: Remove iommu parameter from __(un)map_single Joerg Roedel
2009-11-27 13:55 ` [PATCH 18/34] x86/amd-iommu: Remove iommu specific handling from dma_ops path Joerg Roedel
2009-11-27 13:55 ` [PATCH 19/34] x86/amd-iommu: Let domain_for_device handle aliases Joerg Roedel
2009-11-27 13:55 ` [PATCH 20/34] x86/amd-iommu: Simplify get_device_resources() Joerg Roedel
2009-11-27 13:55 ` [PATCH 21/34] x86/amd-iommu: Move find_protection_domain to helper functions Joerg Roedel
2009-11-27 13:55 ` [PATCH 22/34] x86/amd-iommu: Use get_device_id and check_device where appropriate Joerg Roedel
2009-11-27 13:55 ` [PATCH 23/34] x86/amd-iommu: Remove iommu parameter from dma_ops_domain_alloc Joerg Roedel
2009-11-27 13:55 ` [PATCH 24/34] x86/amd-iommu: Move some pte allocation functions in the right section Joerg Roedel
2009-11-27 13:55 ` [PATCH 25/34] x86/amd-iommu: Rearrange dma_ops related functions Joerg Roedel
2009-11-27 13:55 ` [PATCH 26/34] x86/amd-iommu: Remove support for domain sharing Joerg Roedel
2009-11-27 13:55 ` [PATCH 27/34] x86/amd-iommu: Use dev->arch->iommu to store iommu related information Joerg Roedel
2009-11-27 13:55 ` [PATCH 28/34] x86/amd-iommu: Add device bind reference counting Joerg Roedel
2009-11-27 13:55 ` Joerg Roedel [this message]
2009-11-27 13:55 ` [PATCH 30/34] x86/amd-iommu: Cleanup attach/detach_device code Joerg Roedel
2009-11-27 13:55 ` [PATCH 31/34] x86/amd-iommu: Introduce iommu_flush_device() function Joerg Roedel
2009-11-27 13:55 ` [PATCH 32/34] x86/amd-iommu: Cleanup DTE flushing code Joerg Roedel
2009-11-27 13:55 ` [PATCH 33/34] x86/amd-iommu: Move reset_iommu_command_buffer out of locked code Joerg Roedel
2009-11-27 13:55 ` [PATCH 34/34] x86/amd-iommu: Remove amd_iommu_pd_table Joerg Roedel
2009-11-27 19:27 ` [git pull] IOMMU updates for 2.6.33 Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1259330145-14865-30-git-send-email-joerg.roedel@amd.com \
--to=joerg.roedel@amd.com \
--cc=iommu@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox