Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 48246
b: refs/heads/master
c: 650f8b0
h: refs/heads/master
v: v3
  • Loading branch information
Christoph Hellwig authored and Arnd Bergmann committed Feb 13, 2007
1 parent c9da932 commit af94793
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 31 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: 202557d29eae528f464652e92085f3b19b05a0a7
refs/heads/master: 650f8b0291ecd0abdeadbd0ff3d70c3538e55405
33 changes: 10 additions & 23 deletions trunk/arch/powerpc/platforms/cell/spufs/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ struct spu_context *alloc_spu_context(struct spu_gang *gang)
}
spin_lock_init(&ctx->mmio_lock);
kref_init(&ctx->kref);
init_rwsem(&ctx->state_sema);
mutex_init(&ctx->state_mutex);
init_MUTEX(&ctx->run_sema);
init_waitqueue_head(&ctx->ibox_wq);
init_waitqueue_head(&ctx->wbox_wq);
Expand All @@ -65,9 +65,9 @@ void destroy_spu_context(struct kref *kref)
{
struct spu_context *ctx;
ctx = container_of(kref, struct spu_context, kref);
down_write(&ctx->state_sema);
mutex_lock(&ctx->state_mutex);
spu_deactivate(ctx);
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
spu_fini_csa(&ctx->csa);
if (ctx->gang)
spu_gang_remove_ctx(ctx->gang, ctx);
Expand Down Expand Up @@ -98,12 +98,12 @@ void spu_forget(struct spu_context *ctx)

void spu_acquire(struct spu_context *ctx)
{
down_read(&ctx->state_sema);
mutex_lock(&ctx->state_mutex);
}

void spu_release(struct spu_context *ctx)
{
up_read(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
}

void spu_unmap_mappings(struct spu_context *ctx)
Expand All @@ -128,7 +128,7 @@ int spu_acquire_exclusive(struct spu_context *ctx)
{
int ret = 0;

down_write(&ctx->state_sema);
mutex_lock(&ctx->state_mutex);
/* ctx is about to be freed, can't acquire any more */
if (!ctx->owner) {
ret = -EINVAL;
Expand All @@ -146,22 +146,20 @@ int spu_acquire_exclusive(struct spu_context *ctx)

out:
if (ret)
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
return ret;
}

int spu_acquire_runnable(struct spu_context *ctx)
{
int ret = 0;

down_read(&ctx->state_sema);
mutex_lock(&ctx->state_mutex);
if (ctx->state == SPU_STATE_RUNNABLE) {
ctx->spu->prio = current->prio;
return 0;
}
up_read(&ctx->state_sema);

down_write(&ctx->state_sema);
/* ctx is about to be freed, can't acquire any more */
if (!ctx->owner) {
ret = -EINVAL;
Expand All @@ -174,29 +172,18 @@ int spu_acquire_runnable(struct spu_context *ctx)
goto out;
}

downgrade_write(&ctx->state_sema);
/* On success, we return holding the lock */

return ret;
out:
/* Release here, to simplify calling code. */
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);

return ret;
}

void spu_acquire_saved(struct spu_context *ctx)
{
down_read(&ctx->state_sema);

if (ctx->state == SPU_STATE_SAVED)
return;

up_read(&ctx->state_sema);
down_write(&ctx->state_sema);

mutex_lock(&ctx->state_mutex);
if (ctx->state == SPU_STATE_RUNNABLE)
spu_deactivate(ctx);

downgrade_write(&ctx->state_sema);
}
8 changes: 4 additions & 4 deletions trunk/arch/powerpc/platforms/cell/spufs/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,11 +233,11 @@ static void spu_prio_wait(struct spu_context *ctx, u64 flags)
spu_add_wq(wq, &wait, prio);

if (!signal_pending(current)) {
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
pr_debug("%s: pid=%d prio=%d\n", __FUNCTION__,
current->pid, current->prio);
schedule();
down_write(&ctx->state_sema);
mutex_lock(&ctx->state_mutex);
}

spu_del_wq(wq, &wait, prio);
Expand Down Expand Up @@ -334,7 +334,7 @@ void spu_yield(struct spu_context *ctx)
struct spu *spu;
int need_yield = 0;

if (down_write_trylock(&ctx->state_sema)) {
if (mutex_trylock(&ctx->state_mutex)) {
if ((spu = ctx->spu) != NULL) {
int best = sched_find_first_bit(spu_prio->bitmap);
if (best < MAX_PRIO) {
Expand All @@ -346,7 +346,7 @@ void spu_yield(struct spu_context *ctx)
spu->prio = MAX_PRIO;
}
}
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
}
if (unlikely(need_yield))
yield();
Expand Down
6 changes: 3 additions & 3 deletions trunk/arch/powerpc/platforms/cell/spufs/spufs.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#define SPUFS_H

#include <linux/kref.h>
#include <linux/rwsem.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/fs.h>

Expand Down Expand Up @@ -53,7 +53,7 @@ struct spu_context {
u64 object_id; /* user space pointer for oprofile */

enum { SPU_STATE_RUNNABLE, SPU_STATE_SAVED } state;
struct rw_semaphore state_sema;
struct mutex state_mutex;
struct semaphore run_sema;

struct mm_struct *owner;
Expand Down Expand Up @@ -173,7 +173,7 @@ int spu_acquire_exclusive(struct spu_context *ctx);

static inline void spu_release_exclusive(struct spu_context *ctx)
{
up_write(&ctx->state_sema);
mutex_unlock(&ctx->state_mutex);
}

int spu_activate(struct spu_context *ctx, u64 flags);
Expand Down

0 comments on commit af94793

Please sign in to comment.