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, 17 insertions, 1 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index 42e8d76..22eccb7 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -11700,7 +11700,23 @@ static void svc_session_flush(void)
}
svc_gr_diag_reset(); /* m150: per-session diagnostic budgets */
- svc.map_n = 0;
+ /*
+ * r532: the learned map is NOT wiped here. The flush fires when the
+ * channel table momentarily empties - which a live client's UVM
+ * channel cycling triggers - and wiping the map then left the
+ * client's already-resolved data VAs unresolvable until a rebuild
+ * scan re-found them, which it may not: r531 multikernel's operands
+ * (0x72a05a5...) went NO ENTRY 40+ s after the gen-12 flush (the
+ * rebuild restored 14-31 K entries without them) and the pump
+ * stalled for minutes with the client spinning; streams2/
+ * streams_events then read back whole-page garbage. The map is a
+ * cache with a merge-on-rebuild contract (the fresh scan updates a
+ * VA it re-finds and appends the rest), so a re-compaction keeps it
+ * bounded without dropping live translations. Reused-VA correctness
+ * is carried by the ledger (the launch's own landing, r349), the
+ * pin-wins rule and the fresh scan - not by wholesale eviction.
+ */
+ svc_map_finalize();
svc_pb_n = 0;
svc_pd_found = 0;
svc_pd_attempts = 0;