From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> To: linux-omap@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Date: Wed, 1 Jun 2011 15:30:11 +0200 [thread overview] Message-ID: <1306935012-12406-1-git-send-email-laurent.pinchart@ideasonboard.com> (raw) In-Reply-To: <20110601131744.GH11352@atomide.com> sg_alloc_table can only allocate multi-page scatter-gather list tables if the architecture supports scatter-gather lists chaining. ARM doesn't fit in that category. The IOMMU driver abuses the sg table structure only to hold page addresses without ever passing the table to the device. Use __sg_alloc_table instead of sg_alloc_table and allocate all entries in one go. Otherwise trying to use a large userspace buffers to capture video will hit a BUG_ON in __sg_alloc_table. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> --- arch/arm/plat-omap/iovmm.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 51ef43e..b82cef4 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c @@ -121,6 +121,16 @@ static unsigned sgtable_nents(size_t bytes, u32 da, u32 pa) return nr_entries; } +static struct scatterlist *sg_alloc(unsigned int nents, gfp_t gfp_mask) +{ + return kmalloc(nents * sizeof(struct scatterlist), gfp_mask); +} + +static void sg_free(struct scatterlist *sg, unsigned int nents) +{ + kfree(sg); +} + /* allocate and initialize sg_table header(a kind of 'superblock') */ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags, u32 da, u32 pa) @@ -146,7 +156,7 @@ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags, if (!sgt) return ERR_PTR(-ENOMEM); - err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); + err = __sg_alloc_table(sgt, nr_entries, -1, GFP_KERNEL, sg_alloc); if (err) { kfree(sgt); return ERR_PTR(err); @@ -163,7 +173,7 @@ static void sgtable_free(struct sg_table *sgt) if (!sgt) return; - sg_free_table(sgt); + __sg_free_table(sgt, -1, sg_free); kfree(sgt); pr_debug("%s: sgt:%p\n", __func__, sgt); -- 1.7.3.4
WARNING: multiple messages have this Message-ID (diff)
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v3 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Date: Wed, 1 Jun 2011 15:30:11 +0200 [thread overview] Message-ID: <1306935012-12406-1-git-send-email-laurent.pinchart@ideasonboard.com> (raw) In-Reply-To: <20110601131744.GH11352@atomide.com> sg_alloc_table can only allocate multi-page scatter-gather list tables if the architecture supports scatter-gather lists chaining. ARM doesn't fit in that category. The IOMMU driver abuses the sg table structure only to hold page addresses without ever passing the table to the device. Use __sg_alloc_table instead of sg_alloc_table and allocate all entries in one go. Otherwise trying to use a large userspace buffers to capture video will hit a BUG_ON in __sg_alloc_table. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Hiroshi DOYU <Hiroshi.DOYU@nokia.com> --- arch/arm/plat-omap/iovmm.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) diff --git a/arch/arm/plat-omap/iovmm.c b/arch/arm/plat-omap/iovmm.c index 51ef43e..b82cef4 100644 --- a/arch/arm/plat-omap/iovmm.c +++ b/arch/arm/plat-omap/iovmm.c @@ -121,6 +121,16 @@ static unsigned sgtable_nents(size_t bytes, u32 da, u32 pa) return nr_entries; } +static struct scatterlist *sg_alloc(unsigned int nents, gfp_t gfp_mask) +{ + return kmalloc(nents * sizeof(struct scatterlist), gfp_mask); +} + +static void sg_free(struct scatterlist *sg, unsigned int nents) +{ + kfree(sg); +} + /* allocate and initialize sg_table header(a kind of 'superblock') */ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags, u32 da, u32 pa) @@ -146,7 +156,7 @@ static struct sg_table *sgtable_alloc(const size_t bytes, u32 flags, if (!sgt) return ERR_PTR(-ENOMEM); - err = sg_alloc_table(sgt, nr_entries, GFP_KERNEL); + err = __sg_alloc_table(sgt, nr_entries, -1, GFP_KERNEL, sg_alloc); if (err) { kfree(sgt); return ERR_PTR(err); @@ -163,7 +173,7 @@ static void sgtable_free(struct sg_table *sgt) if (!sgt) return; - sg_free_table(sgt); + __sg_free_table(sgt, -1, sg_free); kfree(sgt); pr_debug("%s: sgt:%p\n", __func__, sgt); -- 1.7.3.4
next prev parent reply other threads:[~2011-06-01 13:30 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-05-30 12:47 [PATCH 0/2] OMAP3 IOMMU fixes Laurent Pinchart 2011-05-30 12:47 ` [PATCH 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Laurent Pinchart 2011-05-31 13:22 ` Tony Lindgren 2011-06-01 12:25 ` [PATCH v2 " Laurent Pinchart 2011-06-01 13:11 ` Tony Lindgren 2011-06-01 12:25 ` [PATCH v2 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Laurent Pinchart 2011-06-01 12:50 ` Tony Lindgren 2011-06-01 13:09 ` Laurent Pinchart 2011-06-01 13:10 ` Tony Lindgren 2011-06-01 13:17 ` Tony Lindgren 2011-06-01 13:30 ` Laurent Pinchart [this message] 2011-06-01 13:30 ` [PATCH v3 1/2] omap3: iovmm: Work around sg_alloc_table size limitation in IOMMU Laurent Pinchart 2011-06-01 13:43 ` Russell King - ARM Linux 2011-06-01 13:43 ` Russell King - ARM Linux 2011-06-01 13:50 ` Laurent Pinchart 2011-06-01 13:50 ` Laurent Pinchart 2011-06-01 14:03 ` Russell King - ARM Linux 2011-06-01 14:03 ` Russell King - ARM Linux 2011-06-03 0:12 ` Laurent Pinchart 2011-06-03 0:12 ` Laurent Pinchart 2011-06-03 6:32 ` Russell King - ARM Linux 2011-06-03 6:32 ` Russell King - ARM Linux 2011-06-06 16:23 ` Laurent Pinchart 2011-06-06 16:23 ` Laurent Pinchart 2011-06-06 16:44 ` Russell King - ARM Linux 2011-06-06 16:44 ` Russell King - ARM Linux 2011-06-06 16:54 ` Laurent Pinchart 2011-06-06 16:54 ` Laurent Pinchart 2011-06-06 18:00 ` Russell King - ARM Linux 2011-06-06 18:00 ` Russell King - ARM Linux 2011-06-08 10:33 ` Laurent Pinchart 2011-06-08 10:33 ` Laurent Pinchart 2011-06-03 9:39 ` Felipe Contreras 2011-06-03 9:39 ` Felipe Contreras 2011-06-01 13:30 ` [PATCH v3 2/2] omap3: iovmm: Support non page-aligned buffers in iommu_vmap Laurent Pinchart 2011-06-01 13:30 ` Laurent Pinchart 2011-05-30 12:47 ` [PATCH " Laurent Pinchart 2011-05-30 13:16 ` [PATCH 0/2] OMAP3 IOMMU fixes Hiroshi DOYU 2011-06-08 10:48 ` Laurent Pinchart 2011-06-13 13:40 ` Tony Lindgren 2011-06-13 16:41 ` Laurent Pinchart 2011-06-13 19:34 ` Ohad Ben-Cohen
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=1306935012-12406-1-git-send-email-laurent.pinchart@ideasonboard.com \ --to=laurent.pinchart@ideasonboard.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-omap@vger.kernel.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: linkBe 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.