git: af13a06ab206 - stable/14 - rc.subr: Fix slow shutdown issue

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 30 Oct 2025 10:38:47 UTC
The branch stable/14 has been updated by des:

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

commit af13a06ab206b7009f689bf082ecbc776887ecee
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-10-28 11:57:03 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-10-30 10:38:19 +0000

    rc.subr: Fix slow shutdown issue
    
    Instead of sleeping after pwait returns, use its new -p option to
    obtain the list of processes that still have not terminated.
    
    MFC after:      3 days
    PR:             290357
    Fixes:          5953e7c98427 ("rc.subr: Move the sleep in wait_for_pids")
    Reviewed by:    0mp, markj
    Differential Revision:  https://reviews.freebsd.org/D53294
    
    (cherry picked from commit 22cff1f3e9d82b48aad440c52f883bfd4995359c)
---
 libexec/rc/rc.subr | 29 ++++++++---------------------
 1 file changed, 8 insertions(+), 21 deletions(-)

diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index a4f3762afd2c..bef364af0843 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -634,31 +634,18 @@ sort_lite()
 #
 wait_for_pids()
 {
-	local _list _prefix _nlist _j
+	local _list _prefix _j
 
-	_list="$@"
-	if [ -z "$_list" ]; then
-		return
-	fi
-	_prefix=
-	while true; do
-		_nlist=""
-		for _j in $_list; do
-			if kill -0 $_j 2>/dev/null; then
-				_nlist="${_nlist}${_nlist:+ }$_j"
-			fi
-		done
-		if [ -z "$_nlist" ]; then
-			break
+	for _j in "$@"; do
+		if kill -0 $_j 2>/dev/null; then
+			_list="${_list}${_list:+ }$_j"
 		fi
-		_list=$_nlist
+	done
+	_prefix=
+	while [ -n "$_list" ]; do
 		echo -n ${_prefix:-"Waiting for PIDS: "}$_list
 		_prefix=", "
-		pwait -o $_list 2>/dev/null
-		# At least one of the processes we were waiting for
-		# has terminated.  Give init a chance to collect it
-		# before looping around and checking again.
-		sleep 1
+		_list=$(pwait -op $_list 2>/dev/null)
 	done
 	if [ -n "$_prefix" ]; then
 		echo "."