Comments
Patch
@@ -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:
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@br.ibm.com> --- arch/powerpc/platforms/cell/spufs/context.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)