diff options
| author | open-iov-agent <agent@open-iov.local> | 2026-10-09 17:58:46 -0400 |
|---|---|---|
| committer | open-iov-agent <agent@open-iov.local> | 2026-10-09 17:58:46 -0400 |
| commit | 61cc7629f989edd216c4381313c07f15ceaf1559 (patch) | |
| tree | f87bba5188f24a77fef6e37597df5882512561f8 /kernel | |
| parent | 8eb6a46d05d6156514624aa9f71e8666a4a9979b (diff) | |
| download | open-iov-61cc7629f989edd216c4381313c07f15ceaf1559.tar.gz open-iov-61cc7629f989edd216c4381313c07f15ceaf1559.zip | |
vgsp-sema: hold an entry on any unresolvable operand, not only mid-scan (ISSUE-0002)
The guest driver's pma scrub submits vidmem memsets on a GR channel; the
operand translations (client buffer VAs, pinned by the scanner) land about
a second after the push. The one-pass skip lost those memsets forever and
the guest spun in scrubCheckAndWaitForSize (r58 c3: three bigop memsets
rc=-22 at 17:54:35, their pins logged at 17:54:36, the channel froze at
get=89 with the client in pmaAllocatePages). Mark the operand path pending
on any unresolved operand so the existing bounded entry hold retries the
decode until the translation lands; raise the retry bound to 160 so the
hold covers the observed pin latency.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/gsp_sema_service.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 96c9064..d73a5df 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -3542,9 +3542,20 @@ static int svc_op_translate(struct nv_vgpu_device *vgpu, u64 va, u64 *addr, * calling for this same page). Tell the pump so it can hold the entry * and retry it while the scan is in progress: a copy whose operand is * only resolvable by the scan needs several passes. - */ - if (svc_resolve_in_progress(va & ~0xfffULL)) - svc.op_tr_pending = 1; + * + * ISSUE-0002 (r58): hold on ANY unresolvable operand, not only while + * a targeted scan is already running. The guest's pma scrub submits + * memsets of freshly allocated vidmem on a GR channel; the operand + * translations (client buffer VAs pinned by the scanner) land ~1 s + * after the push, and the one-pass skip lost the memset forever - + * the guest then spun in scrubCheckAndWaitForSize (c3: 3 bigop + * memsets rc=-22 at 17:54:35, their pins logged at 17:54:36, the + * channel froze at get=89 with the client in pmaAllocatePages). + * The hold is bounded by the pump's retry counter, so a translation + * that never lands costs the bounded hold, then the entry is + * consumed exactly as before. + */ + svc.op_tr_pending = 1; return -ENOENT; } @@ -13032,7 +13043,7 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu) * channel. */ if (svc.op_tr_pending && - ch->op_retry < 24) { + ch->op_retry < 160) { ch->op_retry++; svc.gpfifo_nomap++; /* |
