linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] fix and cleanup for iommu/vt-d
@ 2016-05-27 22:24 Wei Yang
  2016-05-27 22:24 ` [PATCH v2 1/2] iommu/vt-d: reduce extra first level entry in iommu->domains Wei Yang
  2016-05-27 22:24 ` [PATCH v2 2/2] iommu/vt-d: use marco for dmar_domain's second level size and shift Wei Yang
  0 siblings, 2 replies; 3+ messages in thread
From: Wei Yang @ 2016-05-27 22:24 UTC (permalink / raw)
  To: joro, robin.murphy; +Cc: dwmw2, iommu, linux-kernel, Wei Yang

The first patch tries to improve the calculation of the dmar_domain first
level entry.

The second patch defines two marco for dmar_domains second level size and
shift instead of using an integer.

---
v2:
    * use DIV_ROUND_UP instead of ALIGN for the calculation.
      Thanks Robin Murphy <robin.murphy@arm.com>
    * adds patch 2 for comment


Wei Yang (2):
  iommu/vt-d: reduce extra first level entry in iommu->domains
  iommu/vt-d: use marco for dmar_domain's second level size and shift

 drivers/iommu/intel-iommu.c | 12 ++++++------
 include/linux/intel-iommu.h |  2 ++
 2 files changed, 8 insertions(+), 6 deletions(-)

-- 
2.5.0

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 1/2] iommu/vt-d: reduce extra first level entry in iommu->domains
  2016-05-27 22:24 [PATCH v2 0/2] fix and cleanup for iommu/vt-d Wei Yang
@ 2016-05-27 22:24 ` Wei Yang
  2016-05-27 22:24 ` [PATCH v2 2/2] iommu/vt-d: use marco for dmar_domain's second level size and shift Wei Yang
  1 sibling, 0 replies; 3+ messages in thread
From: Wei Yang @ 2016-05-27 22:24 UTC (permalink / raw)
  To: joro, robin.murphy; +Cc: dwmw2, iommu, linux-kernel, Wei Yang

In commit <8bf478163e69> ("iommu/vt-d: Split up iommu->domains array"), it
it splits iommu->domains in two levels. Each first level contains 256
entries of second level. In case of the ndomains is exact a multiple of
256, it would have one more extra first level entry for current
implementation.

This patch refines this calculation to reduce the extra first level entry
when ndomains is exact a multiple of 256.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 drivers/iommu/intel-iommu.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index d7fa268..1c8b587 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -1634,7 +1634,7 @@ static int iommu_init_domains(struct intel_iommu *iommu)
 		return -ENOMEM;
 	}
 
-	size = ((ndomains >> 8) + 1) * sizeof(struct dmar_domain **);
+	size = DIV_ROUND_UP(ndomains, 256) * sizeof(struct dmar_domain **);
 	iommu->domains = kzalloc(size, GFP_KERNEL);
 
 	if (iommu->domains) {
@@ -1699,7 +1699,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)
 static void free_dmar_iommu(struct intel_iommu *iommu)
 {
 	if ((iommu->domains) && (iommu->domain_ids)) {
-		int elems = (cap_ndoms(iommu->cap) >> 8) + 1;
+		int elems = DIV_ROUND_UP(cap_ndoms(iommu->cap), 256);
 		int i;
 
 		for (i = 0; i < elems; i++)
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH v2 2/2] iommu/vt-d: use marco for dmar_domain's second level size and shift
  2016-05-27 22:24 [PATCH v2 0/2] fix and cleanup for iommu/vt-d Wei Yang
  2016-05-27 22:24 ` [PATCH v2 1/2] iommu/vt-d: reduce extra first level entry in iommu->domains Wei Yang
@ 2016-05-27 22:24 ` Wei Yang
  1 sibling, 0 replies; 3+ messages in thread
From: Wei Yang @ 2016-05-27 22:24 UTC (permalink / raw)
  To: joro, robin.murphy; +Cc: dwmw2, iommu, linux-kernel, Wei Yang

In the origin commit, the size of the second level is hard coded to an
integer, 256.

This patch defines two marco for the second level size and shift.

Signed-off-by: Wei Yang <richard.weiyang@gmail.com>
---
 drivers/iommu/intel-iommu.c | 12 ++++++------
 include/linux/intel-iommu.h |  2 ++
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 1c8b587..dd050d7 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -616,7 +616,7 @@ static struct kmem_cache *iommu_devinfo_cache;
 static struct dmar_domain* get_iommu_domain(struct intel_iommu *iommu, u16 did)
 {
 	struct dmar_domain **domains;
-	int idx = did >> 8;
+	int idx = did >> DMAR_DOMS_SHIFT;
 
 	domains = iommu->domains[idx];
 	if (!domains)
@@ -629,10 +629,10 @@ static void set_iommu_domain(struct intel_iommu *iommu, u16 did,
 			     struct dmar_domain *domain)
 {
 	struct dmar_domain **domains;
-	int idx = did >> 8;
+	int idx = did >> DMAR_DOMS_SHIFT;
 
 	if (!iommu->domains[idx]) {
-		size_t size = 256 * sizeof(struct dmar_domain *);
+		size_t size = DMAR_DOMS_SIZE * sizeof(struct dmar_domain *);
 		iommu->domains[idx] = kzalloc(size, GFP_ATOMIC);
 	}
 
@@ -1634,11 +1634,11 @@ static int iommu_init_domains(struct intel_iommu *iommu)
 		return -ENOMEM;
 	}
 
-	size = DIV_ROUND_UP(ndomains, 256) * sizeof(struct dmar_domain **);
+	size = DIV_ROUND_UP(ndomains, DMAR_DOMS_SIZE) * sizeof(struct dmar_domain **);
 	iommu->domains = kzalloc(size, GFP_KERNEL);
 
 	if (iommu->domains) {
-		size = 256 * sizeof(struct dmar_domain *);
+		size = DMAR_DOMS_SIZE * sizeof(struct dmar_domain *);
 		iommu->domains[0] = kzalloc(size, GFP_KERNEL);
 	}
 
@@ -1699,7 +1699,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)
 static void free_dmar_iommu(struct intel_iommu *iommu)
 {
 	if ((iommu->domains) && (iommu->domain_ids)) {
-		int elems = DIV_ROUND_UP(cap_ndoms(iommu->cap), 256);
+		int elems = DIV_ROUND_UP(cap_ndoms(iommu->cap), DMAR_DOMS_SIZE);
 		int i;
 
 		for (i = 0; i < elems; i++)
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 2d9b650..afcb7bf 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -412,6 +412,8 @@ struct intel_iommu {
 
 #ifdef CONFIG_INTEL_IOMMU
 	unsigned long 	*domain_ids; /* bitmap of domains */
+#define DMAR_DOMS_SHIFT 8
+#define DMAR_DOMS_SIZE (1 << DMAR_DOMS_SHIFT )
 	struct dmar_domain ***domains; /* ptr to domains */
 	spinlock_t	lock; /* protect context, domain ids */
 	struct root_entry *root_entry; /* virtual address */
-- 
2.5.0

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-05-27 22:24 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-27 22:24 [PATCH v2 0/2] fix and cleanup for iommu/vt-d Wei Yang
2016-05-27 22:24 ` [PATCH v2 1/2] iommu/vt-d: reduce extra first level entry in iommu->domains Wei Yang
2016-05-27 22:24 ` [PATCH v2 2/2] iommu/vt-d: use marco for dmar_domain's second level size and shift Wei Yang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).