summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_phys_booter.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-21 05:59:10 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-10-21 05:59:10 -0400
commit4083a969bde1a39bf23f6cde0f61cace28a8d127 (patch)
tree03788cd89b927bce62dac9a4dab1c93beb87e218 /kernel/gsp_phys_booter.c
parent4b5730e9baf1414effc5573a2164973605cf7c24 (diff)
downloadopen-iov-4083a969bde1a39bf23f6cde0f61cace28a8d127.tar.gz
open-iov-4083a969bde1a39bf23f6cde0f61cace28a8d127.zip
gr: r405b late-write probes - retire LATE-PROBE (+500 ms re-scan) and a tunable settle window (gsp_phys_gr_settle_ms)
The r405 streams2 forensics show a new shape of the no-write class: the in-place scale launch wrote 1 of its 32 expected pages and the partial-changed count was content-stable for 300 ms, so the retire wait declared 'settled' and the copy-out shipped one page. Two runtime knobs discriminate and test the fix in one cycle: gsp_phys_gr_late_probe=1 re-scans +500 ms after the retire wait and logs whether the engine was still writing; gsp_phys_gr_settle_ms raises the content-stable window (default 300 ms).
Diffstat (limited to 'kernel/gsp_phys_booter.c')
-rw-r--r--kernel/gsp_phys_booter.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 01e0d12..b5898b6 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -141,6 +141,44 @@ static inline bool gsp_phys_gr_copywit_enabled(void)
}
/*
+ * r405 late-write probes (the r405 "partial write" class: the scale launch
+ * of streams2 wrote 1 of its 32 expected in-place pages and every other
+ * launch settled with far fewer changed pages than the kernel should
+ * produce). Two knobs, both runtime-settable:
+ *
+ * - gsp_phys_gr_late_probe (default 0): after the retire wait concludes,
+ * sleep +500 ms and re-scan the tracked pages. Run-once diagnostic:
+ * "ENGINE STILL WRITING" proves the copy-out shipped before the stores
+ * landed (the fix is a longer settle window); "stable" proves the engine
+ * genuinely stopped, which needs a different treatment.
+ * - gsp_phys_gr_settle_ms (default 300): the content-stable window the
+ * partial-changed rule requires before it declares the stores settled.
+ * Raise it to give a still-writing engine its time (A/B in one cycle).
+ */
+static bool gsp_phys_gr_late_probe_param;
+module_param_named(gsp_phys_gr_late_probe, gsp_phys_gr_late_probe_param,
+ bool, 0644);
+MODULE_PARM_DESC(gsp_phys_gr_late_probe,
+ "Diagnostic: after the GR retire wait, re-scan the tracked pages +500 ms later and log whether the engine is still writing (default 0)");
+
+static int gsp_phys_gr_settle_ms_param = 300;
+module_param_named(gsp_phys_gr_settle_ms, gsp_phys_gr_settle_ms_param,
+ int, 0644);
+MODULE_PARM_DESC(gsp_phys_gr_settle_ms,
+ "GR retire wait: content-stable window (ms) required before a partial changed-page count counts as settled (default 300)");
+
+static inline u32 gsp_phys_gr_settle_iters(void)
+{
+ int ms = READ_ONCE(gsp_phys_gr_settle_ms_param);
+
+ if (ms < 60)
+ ms = 60;
+ if (ms > 1400)
+ ms = 1400;
+ return (u32)(ms / 5);
+}
+
+/*
* COPYWIT fail4 r224 follow-up: the r224 OUT-PAGE-WIT dumps proved the
* engine's outputs are structurally corrupted (row bands >= 16 replicate a
* single tile per buffer) while the copy-out write/read pairs agree
@@ -17725,7 +17763,8 @@ gsp_phys_gr_output_retire_wait(const struct gsp_phys_gr_submit *req,
* kernel costs at most 300 ms extra; a ramping engine gets
* the time its stores need.
*/
- if (changed > 0 && hash == prev_hash && iter >= 60u) {
+ if (changed > 0 && hash == prev_hash &&
+ iter >= gsp_phys_gr_settle_iters()) {
why = " (settled)";
break;
}
@@ -17738,6 +17777,22 @@ gsp_phys_gr_output_retire_wait(const struct gsp_phys_gr_submit *req,
}
pr_info("vgsp-gr: output retirement wait: %u/%u pages changed after %u ms%s\n",
changed, n_all, jiffies_to_msecs(jiffies - wait_start), why);
+ /*
+ * r405: run-once late-write probe (see the param comment above).
+ */
+ if (READ_ONCE(gsp_phys_gr_late_probe_param) && changed < n_all) {
+ u32 late_n = 0, late;
+ unsigned long lp_start = jiffies;
+
+ msleep(500);
+ late = gsp_phys_gr_scan_pages(req, csum_in, &late_n, NULL);
+ pr_info("vgsp-gr: retire LATE-PROBE %u -> %u of %u after +%u ms%s\n",
+ changed, late, late_n,
+ jiffies_to_msecs(jiffies - lp_start),
+ late != changed ?
+ " (ENGINE STILL WRITING - stores landed late)" :
+ " (stable - writes are final)");
+ }
return changed;
}