git: 77e1ccbee3ed - main - rc: implement parallel boot

Baptiste Daroussin bapt at FreeBSD.org
Tue Feb 23 10:27:34 UTC 2021


The branch main has been updated by bapt:

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

commit 77e1ccbee3ed6c837929e4e232fd07f95bfc8294
Author:     Rick Parrish <unitrunker at gmail.com>
AuthorDate: 2021-02-07 06:15:21 +0000
Commit:     Baptiste Daroussin <bapt at FreeBSD.org>
CommitDate: 2021-02-23 10:16:53 +0000

    rc: implement parallel boot
    
    take advantage of the rcorder -p argument to implement parallel
    booting in rc.
    
    According to the author non scientific tests:
    on a Core 2 Duo with spinning disk:
    
    | Services enabled | before | after | saving |
    | 0                | 8s     | 8s    | 0      |
    | 1                | 13s    | 13s   | 0      |
    | 2                | 17s    | 13s   | 5      |
    | 3                | 23s    | 13s   | 10     |
    | 4                | 28s    | 13s   | 15     |
    | 5                | 33s    | 13s   | 20     |
    
    PR:             249192
    MFC after:      3 weeks
---
 libexec/rc/rc | 49 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 15 deletions(-)

diff --git a/libexec/rc/rc b/libexec/rc/rc
index 35db4a850516..722d7fe35884 100644
--- a/libexec/rc/rc
+++ b/libexec/rc/rc
@@ -91,19 +91,31 @@ if ! [ -e ${firstboot_sentinel} ]; then
 	skip_firstboot="-s firstboot"
 fi
 
+# rc_parallel_start default is "NO"
+rc_parallel_start=${rc_parallel_start:-NO}
+_rc_parallel=''
+# enable rcorder -p if /etc/rc.conf rc_parallel_start is "YES"
+checkyesno rc_parallel_start && _rc_parallel='-p'
+
 # Do a first pass to get everything up to $early_late_divider so that
 # we can do a second pass that includes $local_startup directories
 #
-files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* 2>/dev/null`
+files=`rcorder ${skip} ${skip_firstboot} ${_rc_parallel} /etc/rc.d/* 2>/dev/null`
 
 _rc_elem_done=' '
-for _rc_elem in ${files}; do
-	run_rc_script ${_rc_elem} ${_boot}
-	_rc_elem_done="${_rc_elem_done}${_rc_elem} "
-
-	case "$_rc_elem" in
-	*/${early_late_divider})	break ;;
-	esac
+IFS=$'\n'
+for _rc_group in ${files}; do
+	IFS=$' '
+	for _rc_elem in ${_rc_group}; do
+		run_rc_script ${_rc_elem} ${_boot} &
+		_rc_elem_done="${_rc_elem_done}${_rc_elem} "
+
+		case "$_rc_elem" in
+		*/${early_late_divider}) break ;;
+		esac
+	done
+	wait
+	IFS=$'\n'
 done
 
 unset files local_rc
@@ -122,14 +134,21 @@ if [ -e ${firstboot_sentinel} ]; then
 	skip_firstboot=""
 fi
 
-files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} 2>/dev/null`
-for _rc_elem in ${files}; do
-	case "$_rc_elem_done" in
-	*" $_rc_elem "*)	continue ;;
-	esac
-
-	run_rc_script ${_rc_elem} ${_boot}
+files=`rcorder ${skip} ${skip_firstboot} /etc/rc.d/* ${local_rc} ${_rc_parallel} 2>/dev/null`
+IFS=$'\n'
+for _rc_group in ${files}; do
+	IFS=$' '
+	for _rc_elem in ${_rc_group}; do
+		case "$_rc_elem_done" in
+		*" $_rc_elem "*) continue ;;
+		esac
+
+		run_rc_script ${_rc_elem} ${_boot} &
+	done
+	wait
+	IFS=$'\n'
 done
+unset IFS
 
 # Remove the firstboot sentinel, and reboot if it was requested.
 # Be a bit paranoid about removing it to handle the common failure


More information about the dev-commits-src-all mailing list