All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v9 04/16] iommu/exynos: allocate lv2 page table from own slab
@ 2013-08-08  9:38 ` Cho KyongHo
  0 siblings, 0 replies; 25+ messages in thread
From: Cho KyongHo @ 2013-08-08  9:38 UTC (permalink / raw)
  To: 'Linux ARM Kernel', 'Linux IOMMU',
	'Linux Kernel', 'Linux Samsung SOC',
	devicetree-u79uwXL29TY76Z2rM5mHXA
  Cc: 'Kukjin Kim', 'Prathyush',
	'Grant Grundler', 'Subash Patel',
	'Sachin Kamat', 'Antonios Motakis',
	kvmarm-FPEHb7Xf0XXUo1n7N8X6UoWGPAHP3yOg, 'Rahul Sharma'

Since kmalloc() does not guarantee that the allignment of 1KiB when it
allocates 1KiB, it is required to allocate lv2 page table from own
slab that guarantees alignment of 1KiB

Signed-off-by: Cho KyongHo <pullip.cho-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
---
 drivers/iommu/exynos-iommu.c |   24 ++++++++++++++++++++----
 1 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
index d90e6fa..a318049 100644
--- a/drivers/iommu/exynos-iommu.c
+++ b/drivers/iommu/exynos-iommu.c
@@ -100,6 +100,8 @@
 #define REG_PB1_SADDR		0x054
 #define REG_PB1_EADDR		0x058
 
+static struct kmem_cache *lv2table_kmem_cache;
+
 static unsigned long *section_entry(unsigned long *pgtable, unsigned long iova)
 {
 	return pgtable + lv1ent_offset(iova);
@@ -765,7 +767,8 @@ static void exynos_iommu_domain_destroy(struct iommu_domain *domain)
 
 	for (i = 0; i < NUM_LV1ENTRIES; i++)
 		if (lv1ent_page(priv->pgtable + i))
-			kfree(__va(lv2table_base(priv->pgtable + i)));
+			kmem_cache_free(lv2table_kmem_cache,
+					__va(lv2table_base(priv->pgtable + i)));
 
 	free_pages((unsigned long)priv->pgtable, 2);
 	free_pages((unsigned long)priv->lv2entcnt, 1);
@@ -861,7 +864,7 @@ static unsigned long *alloc_lv2entry(unsigned long *sent, unsigned long iova,
 	if (lv1ent_fault(sent)) {
 		unsigned long *pent;
 
-		pent = kzalloc(LV2TABLE_SIZE, GFP_ATOMIC);
+		pent = kmem_cache_zalloc(lv2table_kmem_cache, GFP_ATOMIC);
 		BUG_ON((unsigned long)pent & (LV2TABLE_SIZE - 1));
 		if (!pent)
 			return ERR_PTR(-ENOMEM);
@@ -881,7 +884,7 @@ static int lv1set_section(unsigned long *sent, phys_addr_t paddr, short *pgcnt)
 
 	if (lv1ent_page(sent)) {
 		BUG_ON(*pgcnt != NUM_LV2ENTRIES);
-		kfree(page_entry(sent, 0));
+		kmem_cache_free(lv2table_kmem_cache, page_entry(sent, 0));
 		*pgcnt = 0;
 	}
 
@@ -1082,10 +1085,23 @@ static int __init exynos_iommu_init(void)
 {
 	int ret;
 
+	lv2table_kmem_cache = kmem_cache_create("exynos-iommu-lv2table",
+				LV2TABLE_SIZE, LV2TABLE_SIZE, 0, NULL);
+	if (!lv2table_kmem_cache) {
+		pr_err("%s: Failed to create kmem cache\n", __func__);
+		return -ENOMEM;
+	}
+
 	ret = platform_driver_register(&exynos_sysmmu_driver);
 
 	if (ret == 0)
-		bus_set_iommu(&platform_bus_type, &exynos_iommu_ops);
+		ret = bus_set_iommu(&platform_bus_type, &exynos_iommu_ops);
+
+	if (ret) {
+		pr_err("%s: Failed to register exynos-iommu driver.\n",
+								__func__);
+		kmem_cache_destroy(lv2table_kmem_cache);
+	}
 
 	return ret;
 }
-- 
1.7.2.5

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

end of thread, other threads:[~2013-08-16 11:17 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-08  9:38 [PATCH v9 04/16] iommu/exynos: allocate lv2 page table from own slab Cho KyongHo
2013-08-08  9:38 ` Cho KyongHo
2013-08-08  9:38 ` Cho KyongHo
2013-08-08 14:00 ` Tomasz Figa
2013-08-08 14:00   ` Tomasz Figa
2013-08-09  5:58   ` Cho KyongHo
2013-08-09  5:58     ` Cho KyongHo
2013-08-09  5:58     ` Cho KyongHo
     [not found]     ` <20130809145849.790a9800f4f9893b30e54a1c-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-08-09  7:55       ` Tomasz Figa
2013-08-09  7:55         ` Tomasz Figa
2013-08-09  7:55         ` Tomasz Figa
2013-08-09  8:51         ` Cho KyongHo
2013-08-09  8:51           ` Cho KyongHo
2013-08-09  8:51           ` Cho KyongHo
2013-08-09  9:35           ` Tomasz Figa
2013-08-09  9:35             ` Tomasz Figa
2013-08-12  1:59             ` Cho KyongHo
2013-08-12  1:59               ` Cho KyongHo
2013-08-12  1:59               ` Cho KyongHo
2013-08-14 10:56         ` 'Joerg Roedel'
2013-08-14 10:56           ` 'Joerg Roedel'
2013-08-14 10:56           ` 'Joerg Roedel'
     [not found]           ` <20130814105615.GG4491-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2013-08-16 11:17             ` Cho KyongHo
2013-08-16 11:17               ` Cho KyongHo
2013-08-16 11:17               ` Cho KyongHo

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.