diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-09 10:19:24 -0400 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-10-09 10:19:24 -0400 |
| commit | b4177f74cb666711e5b854e02e2344e6bae18bf5 (patch) | |
| tree | 6454d935ff1fb879cc30e9d794a082e9546f0690 /kernel | |
| parent | f6fe05c9322ae55b0c5e07cf3ab60e8b510f1b41 (diff) | |
| download | open-iov-b4177f74cb666711e5b854e02e2344e6bae18bf5.tar.gz open-iov-b4177f74cb666711e5b854e02e2344e6bae18bf5.zip | |
vgsp-sema: re-arm push-buffer and GR-ring discovery with the session (ISSUE-0002)
The push-buffer pairing bitmap (svc_pb_done), its pass budgets
(svc_pb_passes/svc_pb_idle/svc_pb_last*) and the GR ring bitmap
(svc_gr_ring_done) are boot-scoped, but svc_session_flush() only wiped
the pins they stood for. The next client reuses the same CE/GR ranks,
so discovery skipped every rank, its push pages could never be paired,
and its decoded releases were dropped ('no slot registered'): the
guest waited on a tracking semaphore that could never advance - the
second-client hang. Re-arm the discovery state in the flush.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/gsp_sema_service.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index f46158e..39e0096 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -6401,6 +6401,22 @@ static void svc_session_flush(void) svc_grce_dst_ring_next = 0; svc_ring_done = 0; /* + * Push-buffer and GR-ring discovery are boot-scoped bitmaps (and pass + * budgets): a rank marked done stays marked even though this flush + * just wiped the pins the mark stood for. The next client reuses the + * same ranks, so discovery would skip every one of them and its push + * pages could never be paired - the observed second-client hang where + * its releases are dropped ("no slot registered") and the guest waits + * forever. Re-arm the discovery state with the session (ISSUE-0002). + */ + svc_pb_done = 0; + svc_pb_passes = 0; + svc_pb_idle = 0; + svc_pb_last = 0; + svc_pb_last_n = 0; + svc_gr_ring_done = 0; + svc_ring_n = 0; + /* * The learned tables are session state too: the primary VA->PA pin * table (consulted before every other source), the counter-derived * cache (serves a cached PA without re-proving it) and the hot-page |
