From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49479) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eqcTT-0000i6-Ah for guix-patches@gnu.org; Tue, 27 Feb 2018 05:27:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eqcTP-00038i-Nu for guix-patches@gnu.org; Tue, 27 Feb 2018 05:27:07 -0500 Received: from debbugs.gnu.org ([208.118.235.43]:54723) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eqcTP-00038W-Jt for guix-patches@gnu.org; Tue, 27 Feb 2018 05:27:03 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1eqcTP-0003vH-EC for guix-patches@gnu.org; Tue, 27 Feb 2018 05:27:03 -0500 Subject: [bug#30604] [PATCH v4 4/7] linux-boot: Load kernel modules only when the hardware is present. Resent-Message-ID: From: Danny Milosavljevic Date: Tue, 27 Feb 2018 12:26:16 +0100 Message-Id: <20180227112619.5071-5-dannym@scratchpost.org> In-Reply-To: <20180227112619.5071-1-dannym@scratchpost.org> References: <20180226040609.3066-1-dannym@scratchpost.org> <20180227112619.5071-1-dannym@scratchpost.org> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 30604@debbugs.gnu.org * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when the hardware is present. * gnu/system/linux-initrd.scm (raw-initrd): Add imports. --- gnu/build/linux-boot.scm | 31 +++++++++++++++++++++++++++---- gnu/system/linux-initrd.scm | 4 +++- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm index 18d87260a..6d00ea9be 100644 --- a/gnu/build/linux-boot.scm +++ b/gnu/build/linux-boot.scm @@ -473,6 +473,32 @@ upon error." (string-append linux-module-directory "/" (ensure-dot-ko name))) + (define (load-kernel-modules) + "Examine /sys/devices to find out which modules to load and load them." + (define enter? + (const #t)) + (define (down! path stat result) + ;; Note: modprobe mutates the tree starting with path. + (let ((modalias-name (string-append path "/modalias"))) + (if (file-exists? modalias-name) + (let ((modalias + (string-trim-right (call-with-input-file modalias-name + read-string) + #\newline))) + (system* "/sbin/modprobe" "-q" "--" modalias)))) + #t) + (define up + (const #t)) + (define skip + (const #t)) + (define leaf + (const #t)) + (define (error name stat errno result) + (format (current-error-port) "warning: ~a: ~a~%" + name (strerror errno)) + result) + (file-system-fold enter? leaf down! up skip error #t "/sys/devices")) + (display "Welcome, this is GNU's early boot Guile.\n") (display "Use '--repl' for an initrd REPL.\n\n") @@ -486,10 +512,7 @@ upon error." (when (member "--repl" args) (start-repl)) - (display "loading kernel modules...\n") - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module linux-modules)) + (load-kernel-modules) (when qemu-guest-networking? (unless (configure-qemu-networking) diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 46ef055f0..c8a9e4950 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -225,7 +225,9 @@ upon error." ;; this info via gexps. ((gnu build file-systems) #:select (find-partition-by-luks-uuid)) - (rnrs bytevectors)) + (rnrs bytevectors) + (ice-9 ftw) + (ice-9 rdelim)) (with-output-to-port (%make-void-port "w") (lambda ()