From: Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>,
David Woodhouse <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
Yinghai Lu <yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Bjorn Helgaas <bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
Dan Williams
<dan.j.williams-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Vinod Koul <vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
"Rafael J . Wysocki"
<rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Cc: Tony Luck <tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Subject: [Patch Part3 V1 05/22] iommu/vt-d: only dynamically allocate domain id for virtual domains
Date: Tue, 22 Apr 2014 15:07:16 +0800 [thread overview]
Message-ID: <1398150453-28141-6-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1398150453-28141-1-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Check the same domain id is allocated for si_domain on each IOMMU,
otherwise the IOTLB flush for si_domain will fail.
Now the rules to allocate and manage domain id are:
1) For normal and static identity domains, domain id is allocated
when creating domain structure. And this id will be written into
context entry.
2) For virtual machine domain, a virtual id is allocated when creating
domain. And when binding virtual machine domain to an iommu, a real
domain id is allocated on demand and this domain id will be written
into context entry. So domain->id for virtual machine domain may be
different from the domain id written into context entry(used by
hardware).
Signed-off-by: Jiang Liu <jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/iommu/intel-iommu.c | 46 ++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 20 deletions(-)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 29f613e7eea3..0ab0cd236b16 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1551,15 +1551,27 @@ static int iommu_attach_domain(struct dmar_domain *domain,
spin_lock_irqsave(&iommu->lock, flags);
num = __iommu_attach_domain(domain, iommu);
+ spin_unlock_irqrestore(&iommu->lock, flags);
if (num < 0)
pr_err("IOMMU: no free domain ids\n");
- else
- domain->id = num;
- spin_unlock_irqrestore(&iommu->lock, flags);
return num;
}
+static int iommu_attach_vm_domain(struct dmar_domain *domain,
+ struct intel_iommu *iommu)
+{
+ int num;
+ unsigned long ndomains;
+
+ ndomains = cap_ndoms(iommu->cap);
+ for_each_set_bit(num, iommu->domain_ids, ndomains)
+ if (iommu->domains[num] == domain)
+ return num;
+
+ return __iommu_attach_domain(domain, iommu);
+}
+
static void iommu_detach_domain(struct dmar_domain *domain,
struct intel_iommu *iommu)
{
@@ -1766,8 +1778,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
struct context_entry *context;
unsigned long flags;
struct dma_pte *pgd;
- unsigned long num;
- unsigned long ndomains;
int id;
int agaw;
struct device_domain_info *info = NULL;
@@ -1792,20 +1802,8 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
pgd = domain->pgd;
if (domain_type_is_vm_or_si(domain)) {
- int found = 0;
-
- /* find an available domain id for this device in iommu */
- ndomains = cap_ndoms(iommu->cap);
- for_each_set_bit(num, iommu->domain_ids, ndomains) {
- if (iommu->domains[num] == domain) {
- id = num;
- found = 1;
- break;
- }
- }
-
- if (found == 0) {
- id = __iommu_attach_domain(domain, iommu);
+ if (domain_type_is_vm(domain)) {
+ id = iommu_attach_vm_domain(domain, iommu);
if (id < 0) {
spin_unlock_irqrestore(&iommu->lock, flags);
pr_err("IOMMU: no free domain ids\n");
@@ -2281,7 +2279,8 @@ static struct dmar_domain *get_domain_for_dev(struct device *dev, int gaw)
domain = alloc_domain(0);
if (!domain)
goto error;
- if (iommu_attach_domain(domain, iommu) < 0) {
+ domain->id = iommu_attach_domain(domain, iommu);
+ if (domain->id < 0) {
free_domain_mem(domain);
domain = NULL;
goto error;
@@ -2442,6 +2441,7 @@ static int __init si_domain_init(int hw)
struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
int nid, ret = 0;
+ bool first = true;
si_domain = alloc_domain(DOMAIN_FLAG_STATIC_IDENTITY);
if (!si_domain)
@@ -2452,6 +2452,12 @@ static int __init si_domain_init(int hw)
if (ret < 0) {
domain_exit(si_domain);
return -EFAULT;
+ } else if (first) {
+ si_domain->id = ret;
+ first = false;
+ } else if (si_domain->id != ret) {
+ domain_exit(si_domain);
+ return -EFAULT;
}
domain_attach_iommu(si_domain, iommu);
}
--
1.7.10.4
WARNING: multiple messages have this Message-ID (diff)
From: Jiang Liu <jiang.liu@linux.intel.com>
To: Joerg Roedel <joro@8bytes.org>,
David Woodhouse <dwmw2@infradead.org>,
Yinghai Lu <yinghai@kernel.org>,
Bjorn Helgaas <bhelgaas@google.com>,
Dan Williams <dan.j.williams@intel.com>,
Vinod Koul <vinod.koul@intel.com>,
"Rafael J . Wysocki" <rafael.j.wysocki@intel.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
Ashok Raj <ashok.raj@intel.com>,
Yijing Wang <wangyijing@huawei.com>,
Tony Luck <tony.luck@intel.com>,
iommu@lists.linux-foundation.org, linux-pci@vger.kernel.org,
linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org
Subject: [Patch Part3 V1 05/22] iommu/vt-d: only dynamically allocate domain id for virtual domains
Date: Tue, 22 Apr 2014 15:07:16 +0800 [thread overview]
Message-ID: <1398150453-28141-6-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1398150453-28141-1-git-send-email-jiang.liu@linux.intel.com>
Check the same domain id is allocated for si_domain on each IOMMU,
otherwise the IOTLB flush for si_domain will fail.
Now the rules to allocate and manage domain id are:
1) For normal and static identity domains, domain id is allocated
when creating domain structure. And this id will be written into
context entry.
2) For virtual machine domain, a virtual id is allocated when creating
domain. And when binding virtual machine domain to an iommu, a real
domain id is allocated on demand and this domain id will be written
into context entry. So domain->id for virtual machine domain may be
different from the domain id written into context entry(used by
hardware).
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
drivers/iommu/intel-iommu.c | 46 ++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 20 deletions(-)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 29f613e7eea3..0ab0cd236b16 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1551,15 +1551,27 @@ static int iommu_attach_domain(struct dmar_domain *domain,
spin_lock_irqsave(&iommu->lock, flags);
num = __iommu_attach_domain(domain, iommu);
+ spin_unlock_irqrestore(&iommu->lock, flags);
if (num < 0)
pr_err("IOMMU: no free domain ids\n");
- else
- domain->id = num;
- spin_unlock_irqrestore(&iommu->lock, flags);
return num;
}
+static int iommu_attach_vm_domain(struct dmar_domain *domain,
+ struct intel_iommu *iommu)
+{
+ int num;
+ unsigned long ndomains;
+
+ ndomains = cap_ndoms(iommu->cap);
+ for_each_set_bit(num, iommu->domain_ids, ndomains)
+ if (iommu->domains[num] == domain)
+ return num;
+
+ return __iommu_attach_domain(domain, iommu);
+}
+
static void iommu_detach_domain(struct dmar_domain *domain,
struct intel_iommu *iommu)
{
@@ -1766,8 +1778,6 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
struct context_entry *context;
unsigned long flags;
struct dma_pte *pgd;
- unsigned long num;
- unsigned long ndomains;
int id;
int agaw;
struct device_domain_info *info = NULL;
@@ -1792,20 +1802,8 @@ static int domain_context_mapping_one(struct dmar_domain *domain,
pgd = domain->pgd;
if (domain_type_is_vm_or_si(domain)) {
- int found = 0;
-
- /* find an available domain id for this device in iommu */
- ndomains = cap_ndoms(iommu->cap);
- for_each_set_bit(num, iommu->domain_ids, ndomains) {
- if (iommu->domains[num] == domain) {
- id = num;
- found = 1;
- break;
- }
- }
-
- if (found == 0) {
- id = __iommu_attach_domain(domain, iommu);
+ if (domain_type_is_vm(domain)) {
+ id = iommu_attach_vm_domain(domain, iommu);
if (id < 0) {
spin_unlock_irqrestore(&iommu->lock, flags);
pr_err("IOMMU: no free domain ids\n");
@@ -2281,7 +2279,8 @@ static struct dmar_domain *get_domain_for_dev(struct device *dev, int gaw)
domain = alloc_domain(0);
if (!domain)
goto error;
- if (iommu_attach_domain(domain, iommu) < 0) {
+ domain->id = iommu_attach_domain(domain, iommu);
+ if (domain->id < 0) {
free_domain_mem(domain);
domain = NULL;
goto error;
@@ -2442,6 +2441,7 @@ static int __init si_domain_init(int hw)
struct dmar_drhd_unit *drhd;
struct intel_iommu *iommu;
int nid, ret = 0;
+ bool first = true;
si_domain = alloc_domain(DOMAIN_FLAG_STATIC_IDENTITY);
if (!si_domain)
@@ -2452,6 +2452,12 @@ static int __init si_domain_init(int hw)
if (ret < 0) {
domain_exit(si_domain);
return -EFAULT;
+ } else if (first) {
+ si_domain->id = ret;
+ first = false;
+ } else if (si_domain->id != ret) {
+ domain_exit(si_domain);
+ return -EFAULT;
}
domain_attach_iommu(si_domain, iommu);
}
--
1.7.10.4
next prev parent reply other threads:[~2014-04-22 7:07 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-22 7:07 [RFC Patch Part3 V1 00/22] Enable Intel DMAR device hotplug Jiang Liu
[not found] ` <1398150453-28141-1-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2014-04-22 7:07 ` [Patch Part3 V1 01/22] iommu/vt-d: match segment number when searching for dev_iotlb capable devices Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 02/22] iommu/vt-d: use correct domain id to flush virtual machine domains Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 03/22] iommu/vt-d: introduce helper functions to improve code readability Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 04/22] iommu/vt-d: introduce helper functions to make code symmetric for readability Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` Jiang Liu [this message]
2014-04-22 7:07 ` [Patch Part3 V1 05/22] iommu/vt-d: only dynamically allocate domain id for virtual domains Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 06/22] iommu/vt-d: fix possible invalid memory access caused by free_dmar_iommu() Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 07/22] iommu/vt-d: avoid freeing virtual machine domain in free_dmar_iommu() Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 08/22] iommu/VT-d: simplify include/linux/dmar.h Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 09/22] iommu/vt-d: change iommu_enable/disable_translation to return void Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 10/22] iommu/vt-d: dynamically allocate and free seq_id for DMAR units Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 11/22] IOMMU/vt-d: introduce helper function dmar_walk_resources() Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 12/22] iommu/vt-d: implement DMAR unit hotplug framework Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 13/22] iommu/vt-d: search _DSM method for DMAR hotplug Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 14/22] iommu/vt-d: enhance intel_irq_remapping driver to support DMAR unit hotplug Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 15/22] iommu/vt-d: enhance error recovery in function intel_enable_irq_remapping() Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 16/22] iommu/vt-d: enhance intel-iommu driver to support DMAR unit hotplug Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 17/22] pci, ACPI, iommu: enhance pci_root to support DMAR device hotplug Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 9:49 ` Rafael J. Wysocki
2014-05-05 8:31 ` Jiang Liu
[not found] ` <1398150453-28141-18-git-send-email-jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2014-04-24 17:33 ` Bjorn Helgaas
2014-04-24 17:33 ` Bjorn Helgaas
2014-05-05 8:22 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 18/22] iommu/vt-d: update proximity information when a new node with memory available Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 19/22] iommu/vt-d: simplify intel_unmap_sg() and kill duplicated code Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:38 ` David Woodhouse
2014-04-22 7:42 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 20/22] iommu/vt-d: introduce helper domain_pfn_within_range() to simplify code Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 21/22] iommu/vt-d: introduce helper function iova_size() to improve code readability Jiang Liu
2014-04-22 7:07 ` Jiang Liu
2014-04-22 7:07 ` [Patch Part3 V1 22/22] iommu/vt-d: fix bug in computing domain's iommu_snooping flag Jiang Liu
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=1398150453-28141-6-git-send-email-jiang.liu@linux.intel.com \
--to=jiang.liu-vuqaysv1563yd54fqh9/ca@public.gmane.org \
--cc=bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=dan.j.williams-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=rafael.j.wysocki-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=tony.luck-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
/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 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.