diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-24 02:18:23 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-24 02:18:23 -0400 |
| commit | ce6a7560e6e5003eb1c351490bac70125668a4fb (patch) | |
| tree | 8b3f68d57747ffe97cb8adc9d860aeaa43234bbe | |
| parent | 64cca43699d6b74a1f2f2c5e087d33c7aba59de1 (diff) | |
| download | open-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.c | 23 |
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, |
