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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index e6459f3..e127a4a 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -538,6 +538,7 @@ struct sema_svc {
u64 copy_pat_log; /* sema_copy_pat log budget */
u64 copy_dst_log; /* sema_copy_dst log budget */
u32 op_tr_src; /* provenance of last svc_op_translate */
+ u32 sem_sw_log; /* sema-sw release-write log budget */
u64 push_pat_log; /* push-content pattern budget */
u64 dma_skip_log; /* unrecognized-DMA budget */
u64 xfer_raw_log; /* operandless transfer raw-dump budget */
@@ -2610,6 +2611,7 @@ static int svc_sem_write(struct nv_vgpu_device *vgpu, u32 h, u64 va, u32 val)
bool is_pool = svc_pool_sem_va(va);
int wap, rc;
bool verified = false;
+ bool rb_ok = false;
/*
* Pool semaphores resolve pin -> verified cache -> targeted rm_mem
@@ -2663,8 +2665,20 @@ static int svc_sem_write(struct nv_vgpu_device *vgpu, u32 h, u64 va, u32 val)
if (is_pool)
(void)svc_read_ap(vgpu, addr, wap, &cur, sizeof(cur));
rc = svc_write_ap(vgpu, addr, wap, &val, sizeof(val));
- if (!rc && !svc_read_ap(vgpu, addr, wap, &back, sizeof(back)) &&
- back == val) {
+ rb_ok = !rc && !svc_read_ap(vgpu, addr, wap, &back, sizeof(back));
+ /*
+ * ISSUE-0002 diagnosis: record every release write into UVM's
+ * sysmem semaphore range (0x792..), with the resolver provenance and
+ * the read-back, so the second session's translations can be
+ * compared with the first session's for the same VA. Bounded.
+ */
+ if (va >= 0x79240000000ULL && va < 0x79260000000ULL &&
+ svc.sem_sw_log < 8192) {
+ svc.sem_sw_log++;
+ pr_info("sema-sw: h=0x%x va=0x%llx pa=0x%llx ap=%d src=%s val=0x%x rc=%d rb_ok=%d back=0x%x pool=%d\n",
+ h, va, addr, wap, src, val, rc, rb_ok, back, is_pool);
+ }
+ if (rb_ok && back == val) {
if (is_pool)
svc_pool_wr_note(h, va, addr, src, cur, val, "ok");
return 0;