return 0;
 }
 
+static int
+await_request_submit(struct i915_request *to, struct i915_request *from)
+{
+       /*
+        * If we are waiting on a virtual engine, then it may be
+        * constrained to execute on a single engine *prior* to submission.
+        * When it is submitted, it will be first submitted to the virtual
+        * engine and then passed to the physical engine. We cannot allow
+        * the waiter to be submitted immediately to the physical engine
+        * as it may then bypass the virtual request.
+        */
+       if (to->engine == READ_ONCE(from->engine))
+               return i915_sw_fence_await_sw_fence_gfp(&to->submit,
+                                                       &from->submit,
+                                                       I915_FENCE_GFP);
+       else
+               return __i915_request_await_execution(to, from, NULL);
+}
+
 static int
 i915_request_await_request(struct i915_request *to, struct i915_request *from)
 {
                        return ret;
        }
 
-       if (to->engine == READ_ONCE(from->engine))
-               ret = i915_sw_fence_await_sw_fence_gfp(&to->submit,
-                                                      &from->submit,
-                                                      I915_FENCE_GFP);
+       if (is_power_of_2(to->execution_mask | READ_ONCE(from->execution_mask)))
+               ret = await_request_submit(to, from);
        else
                ret = emit_semaphore_wait(to, from, I915_FENCE_GFP);
        if (ret < 0)