Message ID | 1455875288-4370-12-git-send-email-tomi.valkeinen@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Tomi, Thank you for the patch. On Friday 19 February 2016 11:47:46 Tomi Valkeinen wrote: > omap_gem_attach_pages() calls dma_map_page() but does not check the > possible error with dma_mapping_error(). If DMA-API debugging is > enabled, the debug layer will give a warning if dma_mapping_error() has > not been used. > > This patch adds proper error handling to omap_gem_attach_pages(). > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > --- > drivers/gpu/drm/omapdrm/omap_gem.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c > b/drivers/gpu/drm/omapdrm/omap_gem.c index 8495a1a4b617..7098190815f1 > 100644 > --- a/drivers/gpu/drm/omapdrm/omap_gem.c > +++ b/drivers/gpu/drm/omapdrm/omap_gem.c > @@ -264,6 +264,18 @@ static int omap_gem_attach_pages(struct drm_gem_object > *obj) for (i = 0; i < npages; i++) { > addrs[i] = dma_map_page(dev->dev, pages[i], > 0, PAGE_SIZE, DMA_BIDIRECTIONAL); > + > + if (dma_mapping_error(dev->dev, addrs[i])) { > + dev_warn(dev->dev, "omap_gem_attach_pages: dma_map_page failed\n"); Using dev_warn(dev->dev, "%s: failed to map page\n", __func__); and proper line breaks you'll have no trouble complying with the 80 characters per line limit :-) > + > + for (i = i - 1; i >= 0; --i) { Maybe i-- instead of i = i - 1 ? > + dma_unmap_page(dev->dev, addrs[i], > + PAGE_SIZE, DMA_BIDIRECTIONAL); > + } > + > + ret = -ENOMEM; > + goto free_addrs; > + } > } > } else { > addrs = kzalloc(npages * sizeof(*addrs), GFP_KERNEL); > @@ -277,6 +289,8 @@ static int omap_gem_attach_pages(struct drm_gem_object > *obj) omap_obj->pages = pages; > > return 0; > +free_addrs: > + kfree(addrs); > I'd move this blank line before free_addrs. > free_pages: > drm_gem_put_pages(obj, pages, true, false);
On 24/02/16 00:10, Laurent Pinchart wrote: > Hi Tomi, > > Thank you for the patch. > > On Friday 19 February 2016 11:47:46 Tomi Valkeinen wrote: >> omap_gem_attach_pages() calls dma_map_page() but does not check the >> possible error with dma_mapping_error(). If DMA-API debugging is >> enabled, the debug layer will give a warning if dma_mapping_error() has >> not been used. >> >> This patch adds proper error handling to omap_gem_attach_pages(). >> >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> >> --- >> drivers/gpu/drm/omapdrm/omap_gem.c | 14 ++++++++++++++ >> 1 file changed, 14 insertions(+) >> >> diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c >> b/drivers/gpu/drm/omapdrm/omap_gem.c index 8495a1a4b617..7098190815f1 >> 100644 >> --- a/drivers/gpu/drm/omapdrm/omap_gem.c >> +++ b/drivers/gpu/drm/omapdrm/omap_gem.c >> @@ -264,6 +264,18 @@ static int omap_gem_attach_pages(struct drm_gem_object >> *obj) for (i = 0; i < npages; i++) { >> addrs[i] = dma_map_page(dev->dev, pages[i], >> 0, PAGE_SIZE, DMA_BIDIRECTIONAL); >> + >> + if (dma_mapping_error(dev->dev, addrs[i])) { >> + dev_warn(dev->dev, "omap_gem_attach_pages: dma_map_page > failed\n"); > > Using dev_warn(dev->dev, "%s: failed to map page\n", __func__); and proper > line breaks you'll have no trouble complying with the 80 characters per line > limit :-) Ok. >> + >> + for (i = i - 1; i >= 0; --i) { > > Maybe i-- instead of i = i - 1 ? Hmm I don't know... I do like assignment in the initializer more than i--. And why i--? Why not --i? =) >> + dma_unmap_page(dev->dev, addrs[i], >> + PAGE_SIZE, DMA_BIDIRECTIONAL); >> + } >> + >> + ret = -ENOMEM; >> + goto free_addrs; >> + } >> } >> } else { >> addrs = kzalloc(npages * sizeof(*addrs), GFP_KERNEL); >> @@ -277,6 +289,8 @@ static int omap_gem_attach_pages(struct drm_gem_object >> *obj) omap_obj->pages = pages; >> >> return 0; >> +free_addrs: >> + kfree(addrs); >> > > I'd move this blank line before free_addrs. Yes, that makes it cleaner. Tomi
Hi Tomi, On Thursday 25 February 2016 17:39:35 Tomi Valkeinen wrote: > On 24/02/16 00:10, Laurent Pinchart wrote: > > On Friday 19 February 2016 11:47:46 Tomi Valkeinen wrote: > >> omap_gem_attach_pages() calls dma_map_page() but does not check the > >> possible error with dma_mapping_error(). If DMA-API debugging is > >> enabled, the debug layer will give a warning if dma_mapping_error() has > >> not been used. > >> > >> This patch adds proper error handling to omap_gem_attach_pages(). > >> > >> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > >> --- > >> > >> drivers/gpu/drm/omapdrm/omap_gem.c | 14 ++++++++++++++ > >> 1 file changed, 14 insertions(+) > >> > >> diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c > >> b/drivers/gpu/drm/omapdrm/omap_gem.c index 8495a1a4b617..7098190815f1 > >> 100644 > >> --- a/drivers/gpu/drm/omapdrm/omap_gem.c > >> +++ b/drivers/gpu/drm/omapdrm/omap_gem.c > >> @@ -264,6 +264,18 @@ static int omap_gem_attach_pages(struct > >> drm_gem_object *obj) > >> for (i = 0; i < npages; i++) { > >> addrs[i] = dma_map_page(dev->dev, pages[i], > >> 0, PAGE_SIZE, DMA_BIDIRECTIONAL); > >> + > >> + if (dma_mapping_error(dev->dev, addrs[i])) { > >> + dev_warn(dev->dev, "omap_gem_attach_pages: dma_map_page > > failed\n"); > > > > Using dev_warn(dev->dev, "%s: failed to map page\n", __func__); and proper > > line breaks you'll have no trouble complying with the 80 characters per > > line limit :-) > > Ok. > > >> + > >> + for (i = i - 1; i >= 0; --i) { > > > > Maybe i-- instead of i = i - 1 ? > > Hmm I don't know... I do like assignment in the initializer more than > i--. And why i--? Why not --i? =) --i is fine with me too ;-) Or maybe while (i--) dma_unmap_page(dev->dev, addrs[i], PAGE_SIZE, DMA_BIDIRECTIONAL); > >> + dma_unmap_page(dev->dev, addrs[i], > >> + PAGE_SIZE, DMA_BIDIRECTIONAL); > >> + } > >> + > >> + ret = -ENOMEM; > >> + goto free_addrs; > >> + } > >> > >> } > >> > >> } else { > >> > >> addrs = kzalloc(npages * sizeof(*addrs), GFP_KERNEL); > >> > >> @@ -277,6 +289,8 @@ static int omap_gem_attach_pages(struct > >> drm_gem_object > >> *obj) omap_obj->pages = pages; > >> > >> return 0; > >> > >> +free_addrs: > >> + kfree(addrs); > > > > I'd move this blank line before free_addrs. > > Yes, that makes it cleaner.
On 26/02/16 10:52, Laurent Pinchart wrote: >>>> + >>>> + for (i = i - 1; i >= 0; --i) { >>> >>> Maybe i-- instead of i = i - 1 ? >> >> Hmm I don't know... I do like assignment in the initializer more than >> i--. And why i--? Why not --i? =) > > --i is fine with me too ;-) Or maybe > > while (i--) > dma_unmap_page(dev->dev, addrs[i], > PAGE_SIZE, DMA_BIDIRECTIONAL); Maybe it's just me, but I find it a bit difficult to decipher what exactly goes on there. I think the original 'if' is the most clear one: start from i-1, do while i>=0, decrement by one. It's obvious with a quick glance, whereas with the 'while' I need to stop and think. Tomi
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index 8495a1a4b617..7098190815f1 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c @@ -264,6 +264,18 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) for (i = 0; i < npages; i++) { addrs[i] = dma_map_page(dev->dev, pages[i], 0, PAGE_SIZE, DMA_BIDIRECTIONAL); + + if (dma_mapping_error(dev->dev, addrs[i])) { + dev_warn(dev->dev, "omap_gem_attach_pages: dma_map_page failed\n"); + + for (i = i - 1; i >= 0; --i) { + dma_unmap_page(dev->dev, addrs[i], + PAGE_SIZE, DMA_BIDIRECTIONAL); + } + + ret = -ENOMEM; + goto free_addrs; + } } } else { addrs = kzalloc(npages * sizeof(*addrs), GFP_KERNEL); @@ -277,6 +289,8 @@ static int omap_gem_attach_pages(struct drm_gem_object *obj) omap_obj->pages = pages; return 0; +free_addrs: + kfree(addrs); free_pages: drm_gem_put_pages(obj, pages, true, false);
omap_gem_attach_pages() calls dma_map_page() but does not check the possible error with dma_mapping_error(). If DMA-API debugging is enabled, the debug layer will give a warning if dma_mapping_error() has not been used. This patch adds proper error handling to omap_gem_attach_pages(). Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> --- drivers/gpu/drm/omapdrm/omap_gem.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)