Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 48247
b: refs/heads/master
c: 6a0641e
h: refs/heads/master
i:
  48245: c9da932
  48243: 63f5458
  48239: dd6698e
v: v3
  • Loading branch information
Christoph Hellwig authored and Arnd Bergmann committed Feb 13, 2007
1 parent af94793 commit 985eff0
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 54 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: 650f8b0291ecd0abdeadbd0ff3d70c3538e55405
refs/heads/master: 6a0641e51011def4e308fd07387047f5ee50647f
97 changes: 53 additions & 44 deletions trunk/arch/powerpc/platforms/cell/spufs/context.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,6 @@ void spu_forget(struct spu_context *ctx)
spu_release(ctx);
}

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

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

void spu_unmap_mappings(struct spu_context *ctx)
{
if (ctx->local_store)
Expand All @@ -124,66 +114,85 @@ void spu_unmap_mappings(struct spu_context *ctx)
unmap_mapping_range(ctx->psmap, 0, 0x20000, 1);
}

/**
* spu_acquire_exclusive - lock spu contex and protect against userspace access
* @ctx: spu contex to lock
*
* Note:
* Returns 0 and with the context locked on success
* Returns negative error and with the context _unlocked_ on failure.
*/
int spu_acquire_exclusive(struct spu_context *ctx)
{
int ret = 0;
int ret = -EINVAL;

mutex_lock(&ctx->state_mutex);
/* ctx is about to be freed, can't acquire any more */
if (!ctx->owner) {
ret = -EINVAL;
goto out;
}
spu_acquire(ctx);
/*
* Context is about to be freed, so we can't acquire it anymore.
*/
if (!ctx->owner)
goto out_unlock;

if (ctx->state == SPU_STATE_SAVED) {
ret = spu_activate(ctx, 0);
if (ret)
goto out;
goto out_unlock;
} else {
/* We need to exclude userspace access to the context. */
/*
* We need to exclude userspace access to the context.
*
* To protect against memory access we invalidate all ptes
* and make sure the pagefault handlers block on the mutex.
*/
spu_unmap_mappings(ctx);
}

out:
if (ret)
mutex_unlock(&ctx->state_mutex);
return 0;

out_unlock:
spu_release(ctx);
return ret;
}

/**
* spu_acquire_runnable - lock spu contex and make sure it is in runnable state
* @ctx: spu contex to lock
*
* Note:
* Returns 0 and with the context locked on success
* Returns negative error and with the context _unlocked_ on failure.
*/
int spu_acquire_runnable(struct spu_context *ctx)
{
int ret = 0;

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

/* ctx is about to be freed, can't acquire any more */
if (!ctx->owner) {
ret = -EINVAL;
goto out;
}
int ret = -EINVAL;

spu_acquire(ctx);
if (ctx->state == SPU_STATE_SAVED) {
/*
* Context is about to be freed, so we can't acquire it anymore.
*/
if (!ctx->owner)
goto out_unlock;
ret = spu_activate(ctx, 0);
if (ret)
goto out;
}
goto out_unlock;
} else
ctx->spu->prio = current->prio;

/* On success, we return holding the lock */
return ret;
out:
/* Release here, to simplify calling code. */
mutex_unlock(&ctx->state_mutex);
return 0;

out_unlock:
spu_release(ctx);
return ret;
}

/**
* spu_acquire_saved - lock spu contex and make sure it is in saved state
* @ctx: spu contex to lock
*/
void spu_acquire_saved(struct spu_context *ctx)
{
mutex_lock(&ctx->state_mutex);
if (ctx->state == SPU_STATE_RUNNABLE)
spu_acquire(ctx);
if (ctx->state != SPU_STATE_SAVED)
spu_deactivate(ctx);
}
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/platforms/cell/spufs/run.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ static int spu_setup_isolated(struct spu_context *ctx)
spu_mfc_sr1_set(ctx->spu, sr1);

out_unlock:
spu_release_exclusive(ctx);
spu_release(ctx);
out:
return ret;
}
Expand Down
18 changes: 10 additions & 8 deletions trunk/arch/powerpc/platforms/cell/spufs/spufs.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,24 +158,26 @@ void spu_gang_remove_ctx(struct spu_gang *gang, struct spu_context *ctx);
void spu_gang_add_ctx(struct spu_gang *gang, struct spu_context *ctx);

/* context management */
static inline void spu_acquire(struct spu_context *ctx)
{
mutex_lock(&ctx->state_mutex);
}

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

struct spu_context * alloc_spu_context(struct spu_gang *gang);
void destroy_spu_context(struct kref *kref);
struct spu_context * get_spu_context(struct spu_context *ctx);
int put_spu_context(struct spu_context *ctx);
void spu_unmap_mappings(struct spu_context *ctx);

void spu_forget(struct spu_context *ctx);
void spu_acquire(struct spu_context *ctx);
void spu_release(struct spu_context *ctx);
int spu_acquire_runnable(struct spu_context *ctx);
void spu_acquire_saved(struct spu_context *ctx);
int spu_acquire_exclusive(struct spu_context *ctx);

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

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

0 comments on commit 985eff0

Please sign in to comment.