diff options
Diffstat (limited to 'arch/powerpc/platforms')
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/context.c | 20 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/sched.c | 4 | ||||
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/spufs.h | 2 |
3 files changed, 25 insertions, 1 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/context.c b/arch/powerpc/platforms/cell/spufs/context.c index a7efb999d65e..6694f86d7000 100644 --- a/arch/powerpc/platforms/cell/spufs/context.c +++ b/arch/powerpc/platforms/cell/spufs/context.c | |||
@@ -22,6 +22,7 @@ | |||
22 | 22 | ||
23 | #include <linux/fs.h> | 23 | #include <linux/fs.h> |
24 | #include <linux/mm.h> | 24 | #include <linux/mm.h> |
25 | #include <linux/module.h> | ||
25 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
26 | #include <asm/atomic.h> | 27 | #include <asm/atomic.h> |
27 | #include <asm/spu.h> | 28 | #include <asm/spu.h> |
@@ -81,6 +82,8 @@ void destroy_spu_context(struct kref *kref) | |||
81 | spu_fini_csa(&ctx->csa); | 82 | spu_fini_csa(&ctx->csa); |
82 | if (ctx->gang) | 83 | if (ctx->gang) |
83 | spu_gang_remove_ctx(ctx->gang, ctx); | 84 | spu_gang_remove_ctx(ctx->gang, ctx); |
85 | if (ctx->prof_priv_kref) | ||
86 | kref_put(ctx->prof_priv_kref, ctx->prof_priv_release); | ||
84 | BUG_ON(!list_empty(&ctx->rq)); | 87 | BUG_ON(!list_empty(&ctx->rq)); |
85 | atomic_dec(&nr_spu_contexts); | 88 | atomic_dec(&nr_spu_contexts); |
86 | kfree(ctx); | 89 | kfree(ctx); |
@@ -185,3 +188,20 @@ void spu_release_saved(struct spu_context *ctx) | |||
185 | 188 | ||
186 | spu_release(ctx); | 189 | spu_release(ctx); |
187 | } | 190 | } |
191 | |||
192 | void spu_set_profile_private_kref(struct spu_context *ctx, | ||
193 | struct kref *prof_info_kref, | ||
194 | void ( * prof_info_release) (struct kref *kref)) | ||
195 | { | ||
196 | ctx->prof_priv_kref = prof_info_kref; | ||
197 | ctx->prof_priv_release = prof_info_release; | ||
198 | } | ||
199 | EXPORT_SYMBOL_GPL(spu_set_profile_private_kref); | ||
200 | |||
201 | void *spu_get_profile_private_kref(struct spu_context *ctx) | ||
202 | { | ||
203 | return ctx->prof_priv_kref; | ||
204 | } | ||
205 | EXPORT_SYMBOL_GPL(spu_get_profile_private_kref); | ||
206 | |||
207 | |||
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 88ec333e90d3..44e2338a05d5 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -274,6 +274,7 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx) | |||
274 | ctx->spu = spu; | 274 | ctx->spu = spu; |
275 | ctx->ops = &spu_hw_ops; | 275 | ctx->ops = &spu_hw_ops; |
276 | spu->pid = current->pid; | 276 | spu->pid = current->pid; |
277 | spu->tgid = current->tgid; | ||
277 | spu_associate_mm(spu, ctx->owner); | 278 | spu_associate_mm(spu, ctx->owner); |
278 | spu->ibox_callback = spufs_ibox_callback; | 279 | spu->ibox_callback = spufs_ibox_callback; |
279 | spu->wbox_callback = spufs_wbox_callback; | 280 | spu->wbox_callback = spufs_wbox_callback; |
@@ -456,6 +457,7 @@ static void spu_unbind_context(struct spu *spu, struct spu_context *ctx) | |||
456 | spu->dma_callback = NULL; | 457 | spu->dma_callback = NULL; |
457 | spu_associate_mm(spu, NULL); | 458 | spu_associate_mm(spu, NULL); |
458 | spu->pid = 0; | 459 | spu->pid = 0; |
460 | spu->tgid = 0; | ||
459 | ctx->ops = &spu_backing_ops; | 461 | ctx->ops = &spu_backing_ops; |
460 | spu->flags = 0; | 462 | spu->flags = 0; |
461 | spu->ctx = NULL; | 463 | spu->ctx = NULL; |
@@ -737,7 +739,7 @@ void spu_deactivate(struct spu_context *ctx) | |||
737 | } | 739 | } |
738 | 740 | ||
739 | /** | 741 | /** |
740 | * spu_yield - yield a physical spu if others are waiting | 742 | * spu_yield - yield a physical spu if others are waiting |
741 | * @ctx: spu context to yield | 743 | * @ctx: spu context to yield |
742 | * | 744 | * |
743 | * Check if there is a higher priority context waiting and if yes | 745 | * Check if there is a higher priority context waiting and if yes |
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index 692dbd0edc37..8b20c0c1556f 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -85,6 +85,8 @@ struct spu_context { | |||
85 | 85 | ||
86 | struct list_head gang_list; | 86 | struct list_head gang_list; |
87 | struct spu_gang *gang; | 87 | struct spu_gang *gang; |
88 | struct kref *prof_priv_kref; | ||
89 | void ( * prof_priv_release) (struct kref *kref); | ||
88 | 90 | ||
89 | /* owner thread */ | 91 | /* owner thread */ |
90 | pid_t tid; | 92 | pid_t tid; |