summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_sema_service.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_sema_service.c')
-rw-r--r--kernel/gsp_sema_service.c84
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,