[POWERPC] spu sched: simplity spu_remove_from_active_list
If we call spu_remove_from_active_list that spu is always guaranteed to be on the active list and in runnable state, so we can simply do a list_del to remove it and unconditionally take the was_active codepath. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
This commit is contained in:
parent
26bec67386
commit
678b2ff1e6
@ -83,27 +83,14 @@ static void spu_add_to_active_list(struct spu *spu)
|
|||||||
/**
|
/**
|
||||||
* spu_remove_from_active_list - remove spu from active list
|
* spu_remove_from_active_list - remove spu from active list
|
||||||
* @spu: spu to remove from the active list
|
* @spu: spu to remove from the active list
|
||||||
*
|
|
||||||
* This function removes an spu from the active list. If the spu was
|
|
||||||
* found on the active list the function returns 1, else it doesn't do
|
|
||||||
* anything and returns 0.
|
|
||||||
*/
|
*/
|
||||||
static int spu_remove_from_active_list(struct spu *spu)
|
static void spu_remove_from_active_list(struct spu *spu)
|
||||||
{
|
{
|
||||||
int node = spu->node;
|
int node = spu->node;
|
||||||
struct spu *tmp;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
mutex_lock(&spu_prio->active_mutex[node]);
|
mutex_lock(&spu_prio->active_mutex[node]);
|
||||||
list_for_each_entry(tmp, &spu_prio->active_list[node], list) {
|
|
||||||
if (tmp == spu) {
|
|
||||||
list_del_init(&spu->list);
|
list_del_init(&spu->list);
|
||||||
rc = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mutex_unlock(&spu_prio->active_mutex[node]);
|
mutex_unlock(&spu_prio->active_mutex[node]);
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mm_needs_global_tlbie(struct mm_struct *mm)
|
static inline void mm_needs_global_tlbie(struct mm_struct *mm)
|
||||||
@ -167,16 +154,13 @@ static void spu_bind_context(struct spu *spu, struct spu_context *ctx)
|
|||||||
* spu_unbind_context - unbind spu context from physical spu
|
* spu_unbind_context - unbind spu context from physical spu
|
||||||
* @spu: physical spu to unbind from
|
* @spu: physical spu to unbind from
|
||||||
* @ctx: context to unbind
|
* @ctx: context to unbind
|
||||||
*
|
|
||||||
* If the spu was on the active list the function returns 1, else 0.
|
|
||||||
*/
|
*/
|
||||||
static int spu_unbind_context(struct spu *spu, struct spu_context *ctx)
|
static void spu_unbind_context(struct spu *spu, struct spu_context *ctx)
|
||||||
{
|
{
|
||||||
int was_active = spu_remove_from_active_list(spu);
|
|
||||||
|
|
||||||
pr_debug("%s: unbind pid=%d SPU=%d NODE=%d\n", __FUNCTION__,
|
pr_debug("%s: unbind pid=%d SPU=%d NODE=%d\n", __FUNCTION__,
|
||||||
spu->pid, spu->number, spu->node);
|
spu->pid, spu->number, spu->node);
|
||||||
|
|
||||||
|
spu_remove_from_active_list(spu);
|
||||||
spu_switch_notify(spu, NULL);
|
spu_switch_notify(spu, NULL);
|
||||||
spu_unmap_mappings(ctx);
|
spu_unmap_mappings(ctx);
|
||||||
spu_save(&ctx->csa, spu);
|
spu_save(&ctx->csa, spu);
|
||||||
@ -193,8 +177,6 @@ static int spu_unbind_context(struct spu *spu, struct spu_context *ctx)
|
|||||||
ctx->spu = NULL;
|
ctx->spu = NULL;
|
||||||
spu->flags = 0;
|
spu->flags = 0;
|
||||||
spu->ctx = NULL;
|
spu->ctx = NULL;
|
||||||
|
|
||||||
return was_active;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -340,17 +322,21 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
|
|||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spu_deactivate - unbind a context from it's physical spu
|
||||||
|
* @ctx: spu context to unbind
|
||||||
|
*
|
||||||
|
* Unbind @ctx from the physical spu it is running on and schedule
|
||||||
|
* the highest priority context to run on the freed physical spu.
|
||||||
|
*/
|
||||||
void spu_deactivate(struct spu_context *ctx)
|
void spu_deactivate(struct spu_context *ctx)
|
||||||
{
|
{
|
||||||
struct spu *spu;
|
struct spu *spu = ctx->spu;
|
||||||
int was_active;
|
|
||||||
|
|
||||||
spu = ctx->spu;
|
if (spu) {
|
||||||
if (!spu)
|
spu_unbind_context(spu, ctx);
|
||||||
return;
|
|
||||||
was_active = spu_unbind_context(spu, ctx);
|
|
||||||
if (was_active)
|
|
||||||
spu_reschedule(spu);
|
spu_reschedule(spu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void spu_yield(struct spu_context *ctx)
|
void spu_yield(struct spu_context *ctx)
|
||||||
|
Loading…
Reference in New Issue
Block a user