From: Tomasz Figa <t.figa@samsung.com>
To: Cho KyongHo <pullip.cho@samsung.com>
Cc: 'Linux ARM Kernel' <linux-arm-kernel@lists.infradead.org>,
'Linux IOMMU' <iommu@lists.linux-foundation.org>,
'Linux Kernel' <linux-kernel@vger.kernel.org>,
'Linux Samsung SOC' <linux-samsung-soc@vger.kernel.org>,
devicetree@vger.kernel.org, 'Joerg Roedel' <joro@8bytes.org>,
'Kukjin Kim' <kgene.kim@samsung.com>,
'Prathyush' <prathyush.k@samsung.com>,
'Rahul Sharma' <rahul.sharma@samsung.com>,
'Subash Patel' <supash.ramaswamy@linaro.org>,
'Grant Grundler' <grundler@chromium.org>,
'Antonios Motakis' <a.motakis@virtualopensystems.com>,
kvmarm@lists.cs.columbia.edu,
'Sachin Kamat' <sachin.kamat@linaro.org>
Subject: Re: [PATCH v9 04/16] iommu/exynos: allocate lv2 page table from own slab
Date: Thu, 08 Aug 2013 16:00:18 +0200 [thread overview]
Message-ID: <2544843.sndV7usHTj@amdc1227> (raw)
In-Reply-To: <002801ce941a$fb6369e0$f22a3da0$@samsung.com>
On Thursday 08 of August 2013 18:38:04 Cho KyongHo wrote:
> 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@samsung.com>
> ---
> 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);
> + }
What about making the return value handling here cleaner? For example:
lv2table_kmem_cache = kmem_cache_create("exynos-iommu-lv2table",
LV2TABLE_SIZE, LV2TABLE_SIZE, 0, NULL);
if (!lv2table_kmem_cache) {
...
return -ENOMEM;
}
ret = platform_driver_register(&exynos_sysmmu_driver);
if (ret) {
...
goto err_destroy_kmem_cache;
}
ret = bus_set_iommu(&platform_bus_type, &exynos_iommu_ops);
if (ret) {
...
goto err_platform_unregister;
}
return 0;
err_platform_unregister:
...
err_destroy_kmem_cache:
...
return ret;
}
Best regards,
Tomasz
WARNING: multiple messages have this Message-ID (diff)
From: t.figa@samsung.com (Tomasz Figa)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v9 04/16] iommu/exynos: allocate lv2 page table from own slab
Date: Thu, 08 Aug 2013 16:00:18 +0200 [thread overview]
Message-ID: <2544843.sndV7usHTj@amdc1227> (raw)
In-Reply-To: <002801ce941a$fb6369e0$f22a3da0$@samsung.com>
On Thursday 08 of August 2013 18:38:04 Cho KyongHo wrote:
> 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@samsung.com>
> ---
> 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);
> + }
What about making the return value handling here cleaner? For example:
lv2table_kmem_cache = kmem_cache_create("exynos-iommu-lv2table",
LV2TABLE_SIZE, LV2TABLE_SIZE, 0, NULL);
if (!lv2table_kmem_cache) {
...
return -ENOMEM;
}
ret = platform_driver_register(&exynos_sysmmu_driver);
if (ret) {
...
goto err_destroy_kmem_cache;
}
ret = bus_set_iommu(&platform_bus_type, &exynos_iommu_ops);
if (ret) {
...
goto err_platform_unregister;
}
return 0;
err_platform_unregister:
...
err_destroy_kmem_cache:
...
return ret;
}
Best regards,
Tomasz
next prev parent reply other threads:[~2013-08-08 14:00 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
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
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=2544843.sndV7usHTj@amdc1227 \
--to=t.figa@samsung.com \
--cc=a.motakis@virtualopensystems.com \
--cc=devicetree@vger.kernel.org \
--cc=grundler@chromium.org \
--cc=iommu@lists.linux-foundation.org \
--cc=joro@8bytes.org \
--cc=kgene.kim@samsung.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=prathyush.k@samsung.com \
--cc=pullip.cho@samsung.com \
--cc=rahul.sharma@samsung.com \
--cc=sachin.kamat@linaro.org \
--cc=supash.ramaswamy@linaro.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.