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

Commit cbc23d3e authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Arnd Bergmann
Browse files

[CELL] spufs: integration of SPE affinity with the scheduller



This patch makes the scheduller honor affinity information for each
context being scheduled. If the context has no affinity information,
behaviour is unchanged. If there are affinity information, context is
schedulled to be run on the exact spu recommended by the affinity
placement algorithm.

Signed-off-by: default avatarAndre Detsch <adetsch@br.ibm.com>
Signed-off-by: default avatarArnd Bergmann <arnd.bergmann@de.ibm.com>
parent c5fc8d2a
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -425,6 +425,25 @@ static void spu_init_channels(struct spu *spu)
	}
}

struct spu *spu_alloc_spu(struct spu *req_spu)
{
	struct spu *spu, *ret = NULL;

	mutex_lock(&spu_mutex);
	list_for_each_entry(spu, &cbe_spu_info[req_spu->node].free_spus, list) {
		if (spu == req_spu) {
			list_del_init(&spu->list);
			pr_debug("Got SPU %d %d\n", spu->number, spu->node);
			spu_init_channels(spu);
			ret = spu;
			break;
		}
	}
	mutex_unlock(&spu_mutex);
	return ret;
}
EXPORT_SYMBOL_GPL(spu_alloc_spu);

struct spu *spu_alloc_node(int node)
{
	struct spu *spu = NULL;
+4 −0
Original line number Diff line number Diff line
@@ -507,6 +507,10 @@ static struct spu *spu_get_idle(struct spu_context *ctx)
	int node = cpu_to_node(raw_smp_processor_id());
	int n;

	spu = affinity_check(ctx);
	if (spu)
		return spu_alloc_spu(spu);

	for (n = 0; n < MAX_NUMNODES; n++, node++) {
		node = (node < MAX_NUMNODES) ? node : 0;
		if (!node_allowed(ctx, node))