diff options
Diffstat (limited to 'kernel/gsp_sema_service.c')
| -rw-r--r-- | kernel/gsp_sema_service.c | 84 |
1 files changed, 35 insertions, 49 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c index 844d2c9..caaaae3 100644 --- a/kernel/gsp_sema_service.c +++ b/kernel/gsp_sema_service.c @@ -9555,7 +9555,13 @@ static bool svc_gr_page_inline_covers(u64 page) * Resolution only happens on the service thread; the work item turns the * guest PAs into HPAs and the backend plants the identity PTEs. */ -#define SVC_GR_DATA_RELOC_BASE 0x100000000ULL +#define SVC_GR_DATA_RELOC_BASE 0x110000ULL +/* + * Per candidate pointer, map at most this many pages from the pointer's + * page onward (the engine-visible main-PT window has ~220 free 4 KB slots; + * the demo buffers are small on the native path). + */ +#define SVC_GR_DATA_PAGES_PER_PTR 64u static void svc_gr_data_fill(struct nv_vgpu_device *vgpu) { @@ -9605,62 +9611,42 @@ static void svc_gr_data_fill(struct nv_vgpu_device *vgpu) wins[n_cand++] = wv; } } + /* m110: one contiguous run of pages per candidate pointer, relocated + * into the engine-walkable main-PT window (0x110000 onward, fresh + * PTE lines; the commit-time snapshot only preserves that window). */ for (w = 0; w < n_cand; w++) { - int wi; + u64 base = wins[w] & ~0x1fffffULL; + u32 p; - for (wi = -1; wi <= 16; wi++) { - u64 wv = wins[w] + (u64)wi * 0x200000ULL; - u64 rbase; - u32 got = 0, p, x; + for (p = 0; p < SVC_GR_DATA_PAGES_PER_PTR; p++) { + u64 va = wins[w] + (u64)p * SEMA_PAGE_SIZE; + u64 pa = 0; + u32 ap = 0, x; + struct svc_gr_data *rec; - if (wi < 0 && wins[w] < 0x200000ULL) - continue; - if (wv >= (1ULL << 47)) + if (va >= (1ULL << 47)) break; - for (x = 0; x < svc_fwd_req.gr_n_data_wins; x++) - if (svc_fwd_req.gr_data_wins[x].va_base == wv) + for (x = 0; x < svc_fwd_req.gr_n_data; x++) + if (svc_fwd_req.gr_data[x].va == va) break; - if (x == svc_fwd_req.gr_n_data_wins) { - if (svc_fwd_req.gr_n_data_wins >= - SVC_GR_DATA_WINS_MAX) - return; - svc_fwd_req.gr_data_wins[x].va_base = wv; - rbase = SVC_GR_DATA_RELOC_BASE + - ((u64)svc_fwd_req.gr_n_data_wins << - 21); - svc_fwd_req.gr_data_wins[x].reloc_base = - rbase; - svc_fwd_req.gr_n_data_wins++; - } else { - rbase = - svc_fwd_req.gr_data_wins[x].reloc_base; - } - for (p = 0; p < 512; p++) { - u64 va = wv + (u64)p * SEMA_PAGE_SIZE; - u64 pa = 0; - u32 ap = 0; - struct svc_gr_data *rec; - - if (svc_resolve_va(vgpu, va, &pa, &ap)) - continue; - if (svc_fwd_req.gr_n_data >= SVC_GR_DATA_MAX) - return; - rec = &svc_fwd_req.gr_data - [svc_fwd_req.gr_n_data++]; - rec->va = va; - rec->pa = pa & ~(u64)(SEMA_PAGE_SIZE - 1); - rec->reloc_va = rbase + (va & 0x1fffffULL); - rec->ap = (u8)svc_ap_of(ap); - got++; - } - if (!got && wi > 0) + if (x < svc_fwd_req.gr_n_data) + continue; /* already mapped */ + if (svc_resolve_va(vgpu, va, &pa, &ap)) break; if (svc_fwd_req.gr_n_data >= SVC_GR_DATA_MAX) return; - } - } - pr_info("vgsp-sema: svc-gr data fill: %u candidate ptrs, %u windows, %u pages resolved\n", - n_cand, svc_fwd_req.gr_n_data_wins, svc_fwd_req.gr_n_data); + rec = &svc_fwd_req.gr_data[svc_fwd_req.gr_n_data]; + rec->va = va; + rec->pa = pa & ~(u64)(SEMA_PAGE_SIZE - 1); + rec->reloc_va = SVC_GR_DATA_RELOC_BASE + + ((u64)svc_fwd_req.gr_n_data << 12); + rec->ap = (u8)svc_ap_of(ap); + svc_fwd_req.gr_n_data++; + } + (void)base; + } + pr_info("vgsp-sema: svc-gr data fill: %u candidate ptrs, %u pages resolved (reloc 0x%llx+)\n", + n_cand, svc_fwd_req.gr_n_data, (u64)SVC_GR_DATA_RELOC_BASE); } static int svc_gr_req_fill(struct nv_vgpu_device *vgpu, |
