summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_rm_emulation.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
-rw-r--r--kernel/gsp_rm_emulation.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c
index 37b2200..c14a767 100644
--- a/kernel/gsp_rm_emulation.c
+++ b/kernel/gsp_rm_emulation.c
@@ -639,6 +639,17 @@ static int gsp_rm_send_flags(struct gsp_emu_context *ctx, u32 function,
if (w == wait_iters)
break;
mutex_unlock(&rm->stat_lock);
+ /*
+ * r1668: a full status ring means the guest's RM
+ * consumer is blocked, and the usual cause is the
+ * CeUtils scrub wait holding the RM lock the event
+ * callback needs. Authoring the scrubber's finish
+ * payload is the only way out, but the pump cannot
+ * reach its next pass while this post waits, so run
+ * the scrub step here (service thread only; no-op
+ * elsewhere).
+ */
+ gsp_sema_service_scrub_pump(ctx->vgpu);
msleep(1);
mutex_lock(&rm->stat_lock);
}