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>
        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
                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);
 }