Patchwork [05/18] powerpc/spufs: Gang should yield its spu(s) on major page faults

login
register
mail settings
Submitter Andre Detsch
Date Dec. 10, 2008, 7:40 p.m.
Message ID <200812101740.54942.adetsch@br.ibm.com>
Download mbox | patch
Permalink /patch/13323/
State RFC
Headers show

Comments

Andre Detsch - Dec. 10, 2008, 7:40 p.m.
Implement gang level nfaulting count that is incremented and decremented
across major page faults enabling the gang to be yielded when there are
no runnable contexts in the gang.  If there are no other runnable gangs
waiting to be dispatched, then the gang remains lazily loaded.  Otherwise,
it is switched out and put on the rq. The nrunnable count is the number
of contexts in the gang that are inside spu_run() and are considered
runnable.

Signed-off-by: Luke Browning <lukebrowning@us.ibm.com>
Signed-off-by: Andre Detsch <adetsch@br.ibm.com>
---
 arch/powerpc/platforms/cell/spufs/fault.c |   13 ++++++++++---
 arch/powerpc/platforms/cell/spufs/spufs.h |    1 +
 2 files changed, 11 insertions(+), 3 deletions(-)

Patch

diff --git a/arch/powerpc/platforms/cell/spufs/fault.c b/arch/powerpc/platforms/cell/spufs/fault.c
index f093a58..9e270b9 100644
--- a/arch/powerpc/platforms/cell/spufs/fault.c
+++ b/arch/powerpc/platforms/cell/spufs/fault.c
@@ -149,8 +149,16 @@  int spufs_handle_class1(struct spu_context *ctx)
 	local_irq_restore(flags);
 
 	/* hashing failed, so try the actual fault handler */
-	if (ret)
+	if (ret) {
+		struct spu_gang *gang = ctx->gang;
+
+		atomic_inc(&gang->nfaulting);
+		if (atomic_read(&gang->nrunnable) ==
+		    atomic_read(&gang->nfaulting))
+			spu_yield(ctx);
 		ret = spu_handle_mm_fault(current->mm, ea, dsisr, &flt);
+		atomic_dec(&gang->nfaulting);
+	}
 
 	/*
 	 * This is nasty: we need the state_mutex for all the bookkeeping even
@@ -166,8 +174,7 @@  int spufs_handle_class1(struct spu_context *ctx)
 	ctx->csa.class_1_dar = ctx->csa.class_1_dsisr = 0;
 
 	/*
-	 * If we handled the fault successfully and are in runnable
-	 * state, restart the DMA.
+	 * If we handled the fault successfully, restart the DMA.
 	 * In case of unhandled error report the problem to user space.
 	 */
 	if (!ret) {
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h
index 8e84481..c041cce 100644
--- a/arch/powerpc/platforms/cell/spufs/spufs.h
+++ b/arch/powerpc/platforms/cell/spufs/spufs.h
@@ -167,6 +167,7 @@  struct spu_gang {
 	int prio;
 	atomic_t nstarted;
 	atomic_t nrunnable;
+	atomic_t nfaulting;
 	unsigned long sched_flags;
 	struct list_head rq;