[Cbe-oss-dev] [PATCH 13/18] powerpc/spufs: Fix memory leak on implicit gangs

Andre Detsch adetsch at br.ibm.com
Thu Dec 11 06:40:46 EST 2008


If the context has no explicit gang, there is no spufs gang
directory, whose deletion would lead to a put_spu_context.
So, we need to perform a put_spu_context operation after
the context was allocated, or else the gang would never be
freeded.

Signed-off-by: Andre Detsch <adetsch at br.ibm.com>
---
 arch/powerpc/platforms/cell/spufs/context.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c
index 3bda369..0e37eff 100644
--- a/arch/powerpc/platforms/cell/spufs/context.c
+++ b/arch/powerpc/platforms/cell/spufs/context.c
@@ -51,6 +51,7 @@ static void dec_active_gangs(struct spu_gang *gang)
 struct spu_context *alloc_spu_context(struct spu_gang *gang)
 {
 	struct spu_context *ctx;
+	int has_gang;
 
 	ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
 	if (!ctx)
@@ -62,9 +63,12 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
 	 * the gang is a gang of one.
 	 */
 	if (!gang) {
+		has_gang = 0;
 		gang = alloc_spu_gang();
 		if (!gang)
 			goto out_free;
+	} else {
+		has_gang = 1;
 	}
 
 	/* Binding to physical processor deferred
@@ -107,6 +111,15 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
 
 	atomic_inc(&nr_spu_contexts);
 
+	/*
+	 * If the context has no explicit gang, there is no spufs gang
+	 * directory, whose deletion would lead to a put_spu_context.
+	 * So, we do the put here, or else the gang would never be
+	 * freeded.
+	 */
+	if (!has_gang)
+		put_spu_gang(gang);
+
 	goto out;
 
 out_free_gang:
-- 
1.5.4.3




More information about the cbe-oss-dev mailing list