[arch-dev-public] [PATCH] rc.sysinit: background hwclock calls

Dan McGee dan at archlinux.org
Tue Nov 10 15:18:10 EST 2009

hwclock calls appear to block somewhere between 1 and 2 seconds when we have
back-to-back calls. My theory (without looking at the code) is that hwclock
has to synchronize to the 1 second intervals of the hardware clock, so it
can sometimes take up to a second to complete.

To get around this unpleasant behavior, we can background the calls at point
X in the boot sequence, and then later at point Y in the script (when we
absolutely need the clock actions to be complete), we wait on the
subprocess. This allows the rest of the boot sequence, after both hwclock
code blocks, to continue until the point where we wait on the subprocess.

Signed-off-by: Dan McGee <dan at archlinux.org>

For reference, but didn't want to include them in the patch as they will
probably disappear:

Before on the Eee:

Note that there is no longer a huge section of time where the CPU is going
unused; this was the second hwclock block before. Also note that rc.multi
starts at ~8.5 secs where as before it was ~11 secs.


 rc.sysinit |   19 ++++++++++++++++++-
 1 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/rc.sysinit b/rc.sysinit
index 0c934c7..524b2cd 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -36,6 +36,7 @@ else
 if [ "$HARDWARECLOCK" = "UTC" ]; then
 elif [ "$HARDWARECLOCK" = "localtime" ]; then
@@ -57,7 +58,10 @@ if [ -n "$HWCLOCK_PARAMS" ]; then
 	# Set clock early to fix some bugs with filesystem checks
 	# Clock is set again later to match rc.conf
 	if [ -f /etc/localtime ]; then
+		(
 		/sbin/hwclock $HWCLOCK_PARAMS --noadjfile
+		) &
+		clock_pid=$!
@@ -111,6 +115,11 @@ if [ -d /sys/class/net/lo ]; then
+# preliminary hwclock setting needs to be done at this point
+if [ -n "$clock_pid" ]; then
+	wait $clock_pid
 # If necessary, find md devices and manually assemble RAID arrays
 if [ -f /etc/mdadm.conf -a "$(/bin/grep ^ARRAY /etc/mdadm.conf 2>/dev/null)" ]; then
 	status "Activating RAID arrays" /sbin/mdadm --assemble --scan
@@ -282,8 +291,11 @@ if [ "$TIMEZONE" != "" -a -e "/usr/share/zoneinfo/$TIMEZONE" ]; then
 if [ -n "$HWCLOCK_PARAMS" ]; then
+	(
 	/sbin/hwclock --adjust #Adjust for system drift
 	/sbin/hwclock $HWCLOCK_PARAMS
+	) &
+	clock_pid=$!
@@ -396,7 +408,12 @@ fi
 /bin/dmesg >| /var/log/dmesg.log
+# final hwclock setting needs to be done at this point
+if [ -n "$clock_pid" ]; then
+	wait $clock_pid
 run_hook sysinit_end
 # End of file
-# vim: set ts=2 noet:
+# vim: set ts=2 sw=2 noet:

More information about the arch-dev-public mailing list