Date: Tue, 23 Feb 2021 10:27:34 GMT From: Baptiste Daroussin <bapt@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 77e1ccbee3ed - main - rc: implement parallel boot Message-ID: <202102231027.11NARYYE041280@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by bapt: URL: https://cgit.FreeBSD.org/src/commit/?id=77e1ccbee3ed6c837929e4e232fd07f95bfc8294 commit 77e1ccbee3ed6c837929e4e232fd07f95bfc8294 Author: Rick Parrish <unitrunker@gmail.com> AuthorDate: 2021-02-07 06:15:21 +0000 Commit: Baptiste Daroussin <bapt@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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102231027.11NARYYE041280>