[POWERPC] spu sched: ensure preempted threads are put back on the runqueue
authorChristoph Hellwig <hch@lst.de>
Mon, 23 Apr 2007 19:08:08 +0000 (21:08 +0200)
committerArnd Bergmann <arnd@klappe.arndb.de>
Mon, 23 Apr 2007 19:18:53 +0000 (21:18 +0200)
To not lose a spu thread we need to make sure it always gets put back
on the runqueue.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
arch/powerpc/platforms/cell/spufs/sched.c

index 003e330..5149dff 100644 (file)
@@ -97,7 +97,7 @@ void spu_sched_tick(struct work_struct *work)
        struct spu_context *ctx =
                container_of(work, struct spu_context, sched_work.work);
        struct spu *spu;
-       int rearm = 1;
+       int preempted = 0;
 
        /*
         * If this context is being stopped avoid rescheduling from the
@@ -113,12 +113,19 @@ void spu_sched_tick(struct work_struct *work)
                int best = sched_find_first_bit(spu_prio->bitmap);
                if (best <= ctx->prio) {
                        spu_deactivate(ctx);
-                       rearm = 0;
+                       preempted = 1;
                }
        }
        mutex_unlock(&ctx->state_mutex);
 
-       if (rearm)
+       if (preempted) {
+               /*
+                * We need to break out of the wait loop in spu_run manually
+                * to ensure this context gets put on the runqueue again
+                * ASAP.
+                */
+               wake_up(&ctx->stop_wq);
+       } else
                spu_start_tick(ctx);
 }