{
        struct tasklet_struct *t = &engine->execlists.tasklet;
 
-       if (__tasklet_is_scheduled(t)) {
-               local_bh_disable();
-               if (tasklet_trylock(t)) {
-                       /* Must wait for any GPU reset in progress. */
-                       if (__tasklet_is_enabled(t))
-                               t->func(t->data);
-                       tasklet_unlock(t);
-               }
-               local_bh_enable();
+       /* Synchronise and wait for the tasklet on another CPU */
+       tasklet_kill(t);
+
+       /* Having cancelled the tasklet, ensure that is run */
+       local_bh_disable();
+       if (tasklet_trylock(t)) {
+               /* Must wait for any GPU reset in progress. */
+               if (__tasklet_is_enabled(t))
+                       t->func(t->data);
+               tasklet_unlock(t);
        }
-
-       /* Otherwise flush the tasklet if it was running on another cpu */
-       tasklet_unlock_wait(t);
+       local_bh_enable();
 }
 
 /**
 
        struct intel_context *ce = engine->kernel_context;
        struct i915_request *rq;
 
+       /* Just in case everything has gone horribly wrong, give it a kick */
+       intel_engine_flush_submission(engine);
+
        rq = engine->heartbeat.systole;
        if (rq && i915_request_completed(rq)) {
                i915_request_put(rq);