All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/nouveau: fix error handling in core/core object creation functions
@ 2012-10-07 22:49 Marcin Slusarz
       [not found] ` <1349650171-25045-5-git-send-email-marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Marcin Slusarz @ 2012-10-07 22:49 UTC (permalink / raw)
  To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
This patch relies on "drm/nouveau: remove >1 sclass support from nouveau_parent_create_".

There are *many* *more* code paths without proper error handling - I counted
at least 106 in 41 functions. If someone would like to do a bit of janitorial
work I marked those code paths and uploaded "patch" here:
http://people.freedesktop.org/~mslusarz/0001-codepaths-without-error-handling.patch
(Please let me know if you are going to fix those to not duplicate work)
---
 drivers/gpu/drm/nouveau/core/core/engine.c | 1 +
 drivers/gpu/drm/nouveau/core/core/gpuobj.c | 9 ++++++---
 drivers/gpu/drm/nouveau/core/core/parent.c | 4 +++-
 3 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/core/core/engine.c b/drivers/gpu/drm/nouveau/core/core/engine.c
index 09b3bd5..4319854 100644
--- a/drivers/gpu/drm/nouveau/core/core/engine.c
+++ b/drivers/gpu/drm/nouveau/core/core/engine.c
@@ -44,6 +44,7 @@ nouveau_engine_create_(struct nouveau_object *parent,
 		return ret;
 
 	if (!nouveau_boolopt(device->cfgopt, iname, enable)) {
+		nouveau_subdev_destroy(&engine->base);
 		if (!enable)
 			nv_warn(engine, "disabled, %s=1 to enable\n", iname);
 		return -ENODEV;
diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
index c2a7608..6254d52 100644
--- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
+++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
@@ -40,7 +40,7 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
 	}
 
 	if (gpuobj->heap.block_size)
-		nouveau_mm_fini(&gpuobj->heap);
+		WARN_ON(nouveau_mm_fini(&gpuobj->heap));
 
 	nouveau_object_destroy(&gpuobj->base);
 }
@@ -113,7 +113,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
 		ret = nouveau_mm_head(heap, 1, size, size,
 				      max(align, (u32)1), &gpuobj->node);
 		if (ret)
-			return ret;
+			goto err;
 
 		gpuobj->addr += gpuobj->node->offset;
 	}
@@ -121,7 +121,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
 	if (gpuobj->flags & NVOBJ_FLAG_HEAP) {
 		ret = nouveau_mm_init(&gpuobj->heap, 0, gpuobj->size, 1);
 		if (ret)
-			return ret;
+			goto err;
 	}
 
 	if (flags & NVOBJ_FLAG_ZERO_ALLOC) {
@@ -130,6 +130,9 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
 	}
 
 	return ret;
+err:
+	nouveau_gpuobj_destroy(gpuobj);
+	return ret;
 }
 
 struct nouveau_gpuobj_class {
diff --git a/drivers/gpu/drm/nouveau/core/core/parent.c b/drivers/gpu/drm/nouveau/core/core/parent.c
index 1a48e58..d2ea7c2 100644
--- a/drivers/gpu/drm/nouveau/core/core/parent.c
+++ b/drivers/gpu/drm/nouveau/core/core/parent.c
@@ -87,8 +87,10 @@ nouveau_parent_create_(struct nouveau_object *parent,
 
 	if (sclass && sclass->ofuncs) {
 		nclass = kzalloc(sizeof(*nclass), GFP_KERNEL);
-		if (!nclass)
+		if (!nclass) {
+			nouveau_parent_destroy(object);
 			return -ENOMEM;
+		}
 
 		nclass->sclass = object->sclass;
 		object->sclass = nclass;
-- 
1.7.12

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

* Re: [PATCH] drm/nouveau: fix error handling in core/core object creation functions
       [not found] ` <1349650171-25045-5-git-send-email-marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2012-10-07 23:01   ` Marcin Slusarz
  2012-10-08  1:05   ` Ben Skeggs
  1 sibling, 0 replies; 5+ messages in thread
From: Marcin Slusarz @ 2012-10-07 23:01 UTC (permalink / raw)
  To: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On Mon, Oct 08, 2012 at 12:49:31AM +0200, Marcin Slusarz wrote:
> Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
> This patch relies on "drm/nouveau: remove >1 sclass support from nouveau_parent_create_".
> 
> There are *many* *more* code paths without proper error handling - I counted
> at least 106 in 41 functions. If someone would like to do a bit of janitorial
> work I marked those code paths and uploaded "patch" here:
> http://people.freedesktop.org/~mslusarz/0001-codepaths-without-error-handling.patch
> (Please let me know if you are going to fix those to not duplicate work)
> ---
>  drivers/gpu/drm/nouveau/core/core/engine.c | 1 +
>  drivers/gpu/drm/nouveau/core/core/gpuobj.c | 9 ++++++---
>  drivers/gpu/drm/nouveau/core/core/parent.c | 4 +++-
>  3 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/core/core/engine.c b/drivers/gpu/drm/nouveau/core/core/engine.c
> index 09b3bd5..4319854 100644
> --- a/drivers/gpu/drm/nouveau/core/core/engine.c
> +++ b/drivers/gpu/drm/nouveau/core/core/engine.c
> @@ -44,6 +44,7 @@ nouveau_engine_create_(struct nouveau_object *parent,
>  		return ret;
>  
>  	if (!nouveau_boolopt(device->cfgopt, iname, enable)) {
> +		nouveau_subdev_destroy(&engine->base);
>  		if (!enable)
>  			nv_warn(engine, "disabled, %s=1 to enable\n", iname);
>  		return -ENODEV;
> diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> index c2a7608..6254d52 100644
> --- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> +++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> @@ -40,7 +40,7 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
>  	}
>  
>  	if (gpuobj->heap.block_size)
> -		nouveau_mm_fini(&gpuobj->heap);
> +		WARN_ON(nouveau_mm_fini(&gpuobj->heap));

Ha! This is triggering on channel close. Maybe it's the leak which is
preventing piglit from finishing...

>  
>  	nouveau_object_destroy(&gpuobj->base);
>  }
> @@ -113,7 +113,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  		ret = nouveau_mm_head(heap, 1, size, size,
>  				      max(align, (u32)1), &gpuobj->node);
>  		if (ret)
> -			return ret;
> +			goto err;
>  
>  		gpuobj->addr += gpuobj->node->offset;
>  	}
> @@ -121,7 +121,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  	if (gpuobj->flags & NVOBJ_FLAG_HEAP) {
>  		ret = nouveau_mm_init(&gpuobj->heap, 0, gpuobj->size, 1);
>  		if (ret)
> -			return ret;
> +			goto err;
>  	}
>  
>  	if (flags & NVOBJ_FLAG_ZERO_ALLOC) {
> @@ -130,6 +130,9 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  	}
>  
>  	return ret;
> +err:
> +	nouveau_gpuobj_destroy(gpuobj);
> +	return ret;
>  }
>  
>  struct nouveau_gpuobj_class {
> diff --git a/drivers/gpu/drm/nouveau/core/core/parent.c b/drivers/gpu/drm/nouveau/core/core/parent.c
> index 1a48e58..d2ea7c2 100644
> --- a/drivers/gpu/drm/nouveau/core/core/parent.c
> +++ b/drivers/gpu/drm/nouveau/core/core/parent.c
> @@ -87,8 +87,10 @@ nouveau_parent_create_(struct nouveau_object *parent,
>  
>  	if (sclass && sclass->ofuncs) {
>  		nclass = kzalloc(sizeof(*nclass), GFP_KERNEL);
> -		if (!nclass)
> +		if (!nclass) {
> +			nouveau_parent_destroy(object);
>  			return -ENOMEM;
> +		}
>  
>  		nclass->sclass = object->sclass;
>  		object->sclass = nclass;
> -- 
> 1.7.12
> 

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

* Re: [PATCH] drm/nouveau: fix error handling in core/core object creation functions
       [not found] ` <1349650171-25045-5-git-send-email-marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2012-10-07 23:01   ` Marcin Slusarz
@ 2012-10-08  1:05   ` Ben Skeggs
       [not found]     ` <20121008010533.GA4197-6RkuLLNOGXsZ315U/fw+0NvLeJWuRmrY@public.gmane.org>
  1 sibling, 1 reply; 5+ messages in thread
From: Ben Skeggs @ 2012-10-08  1:05 UTC (permalink / raw)
  To: Marcin Slusarz; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On Mon, Oct 08, 2012 at 12:49:31AM +0200, Marcin Slusarz wrote:
> Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
> This patch relies on "drm/nouveau: remove >1 sclass support from nouveau_parent_create_".
> 
> There are *many* *more* code paths without proper error handling -
This is *not* a bug.  An object's constructor should be called via
nouveau_object_ctor(), which has the semantics that the constructor
returns and error *and* a pointer returned via pobject, then the
class's destructor will be called to cleanup.

Ben.

> I counted
> at least 106 in 41 functions. If someone would like to do a bit of janitorial
> work I marked those code paths and uploaded "patch" here:
> http://people.freedesktop.org/~mslusarz/0001-codepaths-without-error-handling.patch
> (Please let me know if you are going to fix those to not duplicate work)
> ---
>  drivers/gpu/drm/nouveau/core/core/engine.c | 1 +
>  drivers/gpu/drm/nouveau/core/core/gpuobj.c | 9 ++++++---
>  drivers/gpu/drm/nouveau/core/core/parent.c | 4 +++-
>  3 files changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/nouveau/core/core/engine.c b/drivers/gpu/drm/nouveau/core/core/engine.c
> index 09b3bd5..4319854 100644
> --- a/drivers/gpu/drm/nouveau/core/core/engine.c
> +++ b/drivers/gpu/drm/nouveau/core/core/engine.c
> @@ -44,6 +44,7 @@ nouveau_engine_create_(struct nouveau_object *parent,
>  		return ret;
>  
>  	if (!nouveau_boolopt(device->cfgopt, iname, enable)) {
> +		nouveau_subdev_destroy(&engine->base);
>  		if (!enable)
>  			nv_warn(engine, "disabled, %s=1 to enable\n", iname);
>  		return -ENODEV;
> diff --git a/drivers/gpu/drm/nouveau/core/core/gpuobj.c b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> index c2a7608..6254d52 100644
> --- a/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> +++ b/drivers/gpu/drm/nouveau/core/core/gpuobj.c
> @@ -40,7 +40,7 @@ nouveau_gpuobj_destroy(struct nouveau_gpuobj *gpuobj)
>  	}
>  
>  	if (gpuobj->heap.block_size)
> -		nouveau_mm_fini(&gpuobj->heap);
> +		WARN_ON(nouveau_mm_fini(&gpuobj->heap));
>  
>  	nouveau_object_destroy(&gpuobj->base);
>  }
> @@ -113,7 +113,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  		ret = nouveau_mm_head(heap, 1, size, size,
>  				      max(align, (u32)1), &gpuobj->node);
>  		if (ret)
> -			return ret;
> +			goto err;
>  
>  		gpuobj->addr += gpuobj->node->offset;
>  	}
> @@ -121,7 +121,7 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  	if (gpuobj->flags & NVOBJ_FLAG_HEAP) {
>  		ret = nouveau_mm_init(&gpuobj->heap, 0, gpuobj->size, 1);
>  		if (ret)
> -			return ret;
> +			goto err;
>  	}
>  
>  	if (flags & NVOBJ_FLAG_ZERO_ALLOC) {
> @@ -130,6 +130,9 @@ nouveau_gpuobj_create_(struct nouveau_object *parent,
>  	}
>  
>  	return ret;
> +err:
> +	nouveau_gpuobj_destroy(gpuobj);
> +	return ret;
>  }
>  
>  struct nouveau_gpuobj_class {
> diff --git a/drivers/gpu/drm/nouveau/core/core/parent.c b/drivers/gpu/drm/nouveau/core/core/parent.c
> index 1a48e58..d2ea7c2 100644
> --- a/drivers/gpu/drm/nouveau/core/core/parent.c
> +++ b/drivers/gpu/drm/nouveau/core/core/parent.c
> @@ -87,8 +87,10 @@ nouveau_parent_create_(struct nouveau_object *parent,
>  
>  	if (sclass && sclass->ofuncs) {
>  		nclass = kzalloc(sizeof(*nclass), GFP_KERNEL);
> -		if (!nclass)
> +		if (!nclass) {
> +			nouveau_parent_destroy(object);
>  			return -ENOMEM;
> +		}
>  
>  		nclass->sclass = object->sclass;
>  		object->sclass = nclass;
> -- 
> 1.7.12
> 
> _______________________________________________
> Nouveau mailing list
> Nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau

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

* Re: [PATCH] drm/nouveau: fix error handling in core/core object creation functions
       [not found]     ` <20121008010533.GA4197-6RkuLLNOGXsZ315U/fw+0NvLeJWuRmrY@public.gmane.org>
@ 2012-10-08 22:50       ` Marcin Slusarz
       [not found]         ` <20121008225059.GD3103-OI9uyE9O0yo@public.gmane.org>
  0 siblings, 1 reply; 5+ messages in thread
From: Marcin Slusarz @ 2012-10-08 22:50 UTC (permalink / raw)
  To: Ben Skeggs; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On Mon, Oct 08, 2012 at 11:05:33AM +1000, Ben Skeggs wrote:
> On Mon, Oct 08, 2012 at 12:49:31AM +0200, Marcin Slusarz wrote:
> > Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> > ---
> > This patch relies on "drm/nouveau: remove >1 sclass support from nouveau_parent_create_".
> > 
> > There are *many* *more* code paths without proper error handling -
> This is *not* a bug.  An object's constructor should be called via
> nouveau_object_ctor(), which has the semantics that the constructor
> returns and error *and* a pointer returned via pobject, then the
> class's destructor will be called to cleanup.

That's... clever, and crazy, and unlike anything in kernel land...

Please put a comment near ctor field in nouveau_ofuncs to make this
information easier to discover, without need to review the whole call chain...

Marcin

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

* Re: [PATCH] drm/nouveau: fix error handling in core/core object creation functions
       [not found]         ` <20121008225059.GD3103-OI9uyE9O0yo@public.gmane.org>
@ 2012-10-09  0:05           ` Ben Skeggs
  0 siblings, 0 replies; 5+ messages in thread
From: Ben Skeggs @ 2012-10-09  0:05 UTC (permalink / raw)
  To: Marcin Slusarz; +Cc: nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

On Tue, Oct 09, 2012 at 12:50:59AM +0200, Marcin Slusarz wrote:
> On Mon, Oct 08, 2012 at 11:05:33AM +1000, Ben Skeggs wrote:
> > On Mon, Oct 08, 2012 at 12:49:31AM +0200, Marcin Slusarz wrote:
> > > Signed-off-by: Marcin Slusarz <marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> > > ---
> > > This patch relies on "drm/nouveau: remove >1 sclass support from nouveau_parent_create_".
> > > 
> > > There are *many* *more* code paths without proper error handling -
> > This is *not* a bug.  An object's constructor should be called via
> > nouveau_object_ctor(), which has the semantics that the constructor
> > returns and error *and* a pointer returned via pobject, then the
> > class's destructor will be called to cleanup.
> 
> That's... clever, and crazy, and unlike anything in kernel land...
Yep, I know.  It made sense to me, rather than having two copies of the
destructor code, one of them filled with gotos :)

> 
> Please put a comment near ctor field in nouveau_ofuncs to make this
> information easier to discover, without need to review the whole call chain...
Alright, I'll do something to that effect.  I have been adding comments
as I go to some WIP stuff I have going on too.

Ben.
> 
> Marcin

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

end of thread, other threads:[~2012-10-09  0:05 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-07 22:49 [PATCH] drm/nouveau: fix error handling in core/core object creation functions Marcin Slusarz
     [not found] ` <1349650171-25045-5-git-send-email-marcin.slusarz-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-10-07 23:01   ` Marcin Slusarz
2012-10-08  1:05   ` Ben Skeggs
     [not found]     ` <20121008010533.GA4197-6RkuLLNOGXsZ315U/fw+0NvLeJWuRmrY@public.gmane.org>
2012-10-08 22:50       ` Marcin Slusarz
     [not found]         ` <20121008225059.GD3103-OI9uyE9O0yo@public.gmane.org>
2012-10-09  0:05           ` Ben Skeggs

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.