diff mbox

[11/33] drm/omap: use dma_mapping_error in omap_gem_attach_pages

Message ID 1455875288-4370-12-git-send-email-tomi.valkeinen@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Tomi Valkeinen Feb. 19, 2016, 9:47 a.m. UTC
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(+)

Comments

Laurent Pinchart Feb. 23, 2016, 10:10 p.m. UTC | #1
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);
Tomi Valkeinen Feb. 25, 2016, 3:39 p.m. UTC | #2
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
Laurent Pinchart Feb. 26, 2016, 8:52 a.m. UTC | #3
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.
Tomi Valkeinen Feb. 26, 2016, 9:07 a.m. UTC | #4
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 mbox

Patch

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);