summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-24 02:18:23 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-24 02:18:23 -0400
commitce6a7560e6e5003eb1c351490bac70125668a4fb (patch)
tree8b3f68d57747ffe97cb8adc9d860aeaa43234bbe
parent64cca43699d6b74a1f2f2c5e087d33c7aba59de1 (diff)
downloadopen-iov-ce6a7560e6e5003eb1c351490bac70125668a4fb.tar.gz
open-iov-ce6a7560e6e5003eb1c351490bac70125668a4fb.zip
vgsp-sema r595: run a plausible GR push's ops - the driver's relocation copies live on a compute channel
The r568 b-copy class is rooted in the op gate: allow_ops was (ch->engine_type != 0), so a GR-class channel's own memory copies (LAUNCH_DMA on h=0x5c000059, eng=0) never executed unless the push page came from an injected pin. Their releases were still applied by the op-hold path, the client's blocking cudaMemcpy returned, and the launch read the pre-copy page (c = a + 0). Admit ops when the push content is a plausible method stream - the same content arbiter (cap_trust) that already gates GR launch capture - never on a replay or a rehold. Measured: the d_a/d_b relocation copies now run ~0.5-1.5 s after the driver submits them instead of tens of seconds.
-rw-r--r--kernel/gsp_sema_service.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index a0cdb2b..f1a31df 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -23124,9 +23124,30 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
idx, va, len);
svc.op_tr_pending = 0;
svc.op_owed = 0;
+ /*
+ * r595: a GR-class channel
+ * (engine_type 0) carries the
+ * driver's own relocation /
+ * H2D copies as well as its
+ * launches, but ops were only
+ * allowed for CE channels (or
+ * an injected push page). The
+ * copies then never executed
+ * and their releases were
+ * applied by the hold path -
+ * exactly the r568 b-copy
+ * class. Admit a GR push's
+ * ops when its content is a
+ * plausible method stream
+ * (cap_trust is that same
+ * content arbiter, set just
+ * above), never on a replay
+ * or a rehold.
+ */
svc_decode_stream(vgpu, pb,
len, 0,
- (allow_ops || injected) &&
+ (allow_ops || injected ||
+ cap_trust) &&
!entry_replay &&
!rehold,
ch,