Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 678b2ff1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Arnd Bergmann
Browse files

[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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
parent 26bec673
Loading
Loading
Loading
Loading
+15 −29
Original line number Diff line number Diff line
@@ -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:       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;
	struct spu *tmp;
	int rc = 0;

	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);
			rc = 1;
			break;
		}
	}
	mutex_unlock(&spu_prio->active_mutex[node]);
	return rc;
}

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:	physical spu to unbind from
 * @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__,
		 spu->pid, spu->number, spu->node);

	spu_remove_from_active_list(spu);
	spu_switch_notify(spu, NULL);
	spu_unmap_mappings(ctx);
	spu_save(&ctx->csa, spu);
@@ -193,8 +177,6 @@ static int spu_unbind_context(struct spu *spu, struct spu_context *ctx)
	ctx->spu = NULL;
	spu->flags = 0;
	spu->ctx = NULL;

	return was_active;
}

/**
@@ -340,18 +322,22 @@ int spu_activate(struct spu_context *ctx, unsigned long flags)
	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)
{
	struct spu *spu;
	int was_active;
	struct spu *spu = ctx->spu;

	spu = ctx->spu;
	if (!spu)
		return;
	was_active = spu_unbind_context(spu, ctx);
	if (was_active)
	if (spu) {
		spu_unbind_context(spu, ctx);
		spu_reschedule(spu);
	}
}

void spu_yield(struct spu_context *ctx)
{