git: 1aa72148d19f - stable/15 - vm_map_growstack(): give a hint to user that stack was blown out

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Thu, 14 May 2026 00:57:11 UTC
The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=1aa72148d19fbf73ec1c864ac9efbc9c37c4d8d3

commit 1aa72148d19fbf73ec1c864ac9efbc9c37c4d8d3
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-05-06 22:53:59 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-05-14 00:48:03 +0000

    vm_map_growstack(): give a hint to user that stack was blown out
    
    (cherry picked from commit 18c5a26f8a747583b9bca3a6a1ae9db1ed4591a3)
---
 sys/vm/vm_map.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index 0a81e62d2d63..7ead7d7e6472 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -4723,6 +4723,11 @@ vm_map_stack_locked(vm_map_t map, vm_offset_t addrbos, vm_size_t max_ssize,
 	return (rv);
 }
 
+static bool report_stackoverflow = true;
+SYSCTL_BOOL(_vm, OID_AUTO, report_stackoverflow, CTLFLAG_RWTUN,
+    &report_stackoverflow, 0,
+    "uprintf() on stack overflow");
+
 /*
  * Attempts to grow a vm stack entry.  Returns KERN_SUCCESS if we
  * successfully grow the stack.
@@ -4787,8 +4792,12 @@ retry:
 	if (guard > max_grow)
 		return (KERN_NO_SPACE);
 	max_grow -= guard;
-	if (grow_amount > max_grow)
+	if (grow_amount > max_grow) {
+		if (report_stackoverflow)
+			uprintf("pid %d comm %s tid %d stack overflow\n",
+			    p->p_pid, p->p_comm, td->td_tid);
 		return (KERN_NO_SPACE);
+	}
 
 	/*
 	 * If this is the main process stack, see if we're over the stack
@@ -4796,8 +4805,12 @@ retry:
 	 */
 	is_procstack = addr >= (vm_offset_t)vm->vm_maxsaddr &&
 	    addr < (vm_offset_t)vm->vm_stacktop;
-	if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim))
+	if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) {
+		if (report_stackoverflow)
+			uprintf("pid %d comm %s tid %d stack overflow\n",
+			    p->p_pid, p->p_comm, td->td_tid);
 		return (KERN_NO_SPACE);
+	}
 
 #ifdef RACCT
 	if (racct_enable) {