Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 81141
b: refs/heads/master
c: 33bfd7a
h: refs/heads/master
i:
  81139: bae70b7
v: v3
  • Loading branch information
Arnd Bergmann authored and Paul Mackerras committed Dec 21, 2007
1 parent 6541791 commit 6eaaca2
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7cd58e43810852eeb7af5a0c803f3890bd08b581
refs/heads/master: 33bfd7a73861c3727482c6c1c1c2ef40054060b7
1 change: 1 addition & 0 deletions trunk/arch/powerpc/platforms/cell/spufs/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
init_waitqueue_head(&ctx->wbox_wq);
init_waitqueue_head(&ctx->stop_wq);
init_waitqueue_head(&ctx->mfc_wq);
init_waitqueue_head(&ctx->run_wq);
ctx->state = SPU_STATE_SAVED;
ctx->ops = &spu_backing_ops;
ctx->owner = get_task_mm(current);
Expand Down
25 changes: 18 additions & 7 deletions trunk/arch/powerpc/platforms/cell/spufs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,21 +236,31 @@ static unsigned long spufs_ps_nopfn(struct vm_area_struct *vma,
{
struct spu_context *ctx = vma->vm_file->private_data;
unsigned long area, offset = address - vma->vm_start;
int ret;

offset += vma->vm_pgoff << PAGE_SHIFT;
if (offset >= ps_size)
return NOPFN_SIGBUS;

/* error here usually means a signal.. we might want to test
* the error code more precisely though
/*
* We have to wait for context to be loaded before we have
* pages to hand out to the user, but we don't want to wait
* with the mmap_sem held.
* It is possible to drop the mmap_sem here, but then we need
* to return NOPFN_REFAULT because the mappings may have
* hanged.
*/
ret = spu_acquire_runnable(ctx, 0);
if (ret)
return NOPFN_REFAULT;
spu_acquire(ctx);
if (ctx->state == SPU_STATE_SAVED) {
up_read(&current->mm->mmap_sem);
spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
down_read(&current->mm->mmap_sem);
goto out;
}

area = ctx->spu->problem_phys + ps_offs;
vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);

out:
spu_release(ctx);

return NOPFN_REFAULT;
Expand Down Expand Up @@ -1505,7 +1515,8 @@ static ssize_t spufs_mfc_write(struct file *file, const char __user *buffer,
if (ret)
goto out;

ret = spu_acquire_runnable(ctx, 0);
spu_acquire(ctx);
ret = spufs_wait(ctx->run_wq, ctx->state == SPU_STATE_RUNNABLE);
if (ret)
goto out;

Expand Down
1 change: 1 addition & 0 deletions trunk/arch/powerpc/platforms/cell/spufs/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -682,6 +682,7 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
spu_bind_context(spu, ctx);
cbe_spu_info[node].nr_active++;
mutex_unlock(&cbe_spu_info[node].list_mutex);
wake_up_all(&ctx->run_wq);
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions trunk/arch/powerpc/platforms/cell/spufs/spufs.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ struct spu_context {
wait_queue_head_t wbox_wq;
wait_queue_head_t stop_wq;
wait_queue_head_t mfc_wq;
wait_queue_head_t run_wq;
struct fasync_struct *ibox_fasync;
struct fasync_struct *wbox_fasync;
struct fasync_struct *mfc_fasync;
Expand Down

0 comments on commit 6eaaca2

Please sign in to comment.