From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Subject: bug#34902: guix cannot find a module on boot Date: Fri, 22 Mar 2019 21:27:42 +0100 Message-ID: <87wokq4ptt.fsf@gnu.org> References: <813466538d530a38bddf60ed348cb75b@lepiller.eu> <87o967lxsa.fsf@gnu.org> <20190318231359.217af9f4@scratchpost.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([209.51.188.92]:56833) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h7QnT-0001Qw-Tz for bug-guix@gnu.org; Fri, 22 Mar 2019 16:29:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h7Qms-0001N4-2S for bug-guix@gnu.org; Fri, 22 Mar 2019 16:29:12 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:41173) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1h7Qmm-0001Bk-TP for bug-guix@gnu.org; Fri, 22 Mar 2019 16:29:07 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1h7Qmk-0005p2-5D for bug-guix@gnu.org; Fri, 22 Mar 2019 16:29:04 -0400 Sender: "Debbugs-submit" Resent-Message-ID: In-Reply-To: <20190318231359.217af9f4@scratchpost.org> (Danny Milosavljevic's message of "Mon, 18 Mar 2019 23:40:28 +0100") List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: "bug-Guix" To: Danny Milosavljevic Cc: 34902@debbugs.gnu.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Danny, Thanks for the explanation, I was unaware of all these subtleties=E2=80=A6 Danny Milosavljevic skribis: > Every time we want to lookup a module by modname, check a hashtable that > is built from modules.dep by: >=20=20 > * let x-path be the first value of each modules.dep line. > * Then the key for the hashtable entry is (underscore (stop-at-dot (basen= ame x-path))) > * And the value for the hashtable entry is x-path. > > In this way we would look up modules in a way similar to them. Instead of guessing, we could also store a mapping from module name to file name. I had that in a previous patch series that we discussed some time ago (see below.) This a custom format, not used by kmod or any other tool, but the advantage is that it solves the module/file name mapping without ugly guess-hacks. WDYT? Thanks, Ludo=E2=80=99. --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable commit 370c4426aa94d99f8faafd3992d54169ff918fb1 Author: Ludovic Court=C3=A8s Date: Wed Mar 14 23:11:01 2018 +0100 linux-modules: Define and use a module name database. =20=20=20=20 * gnu/build/linux-modules.scm (module-formal-name): New procedure. (load-linux-modules-from-directory)[lookup-module]: Remove. [module-name->file-name]: New variable. Use it. (module-name->file-name/guess, module-name-lookup) (write-module-name-database): New procedures. * gnu/system/linux-initrd.scm (flat-linux-module-directory): Call 'write-module-name-database'. diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm index 615e9e1d07..7e99f62941 100644 --- a/gnu/build/linux-modules.scm +++ b/gnu/build/linux-modules.scm @@ -31,8 +31,10 @@ #:use-module (ice-9 match) #:use-module (ice-9 rdelim) #:use-module (ice-9 ftw) + #:autoload (ice-9 pretty-print) (pretty-print) #:export (dot-ko ensure-dot-ko + module-formal-name module-aliases module-dependencies recursive-module-dependencies @@ -46,6 +48,7 @@ device-module-aliases known-module-aliases matching-modules + write-module-name-database write-module-alias-database write-module-device-database load-needed-linux-modules)) @@ -95,6 +98,14 @@ key/value pairs.." (define %not-comma (char-set-complement (char-set #\,))) =20 +(define (module-formal-name file) + "Return the module name of FILE as it appears in its info section. Usua= lly +the module name is the same as the base name of FILE, modulo hyphens and m= inus +the \".ko\" extension." + (match (assq 'name (modinfo-section-contents file)) + (('name . name) name) + (#f #f))) + (define (module-dependencies file) "Return the list of modules that FILE depends on. The returned list contains module names, not actual file names." @@ -240,12 +251,13 @@ appears in BLACK-LIST are not loaded." "Load MODULES and their dependencies from DIRECTORY, a directory contain= ing the '.ko' files. The '.ko' suffix is automatically added to MODULES if needed." - (define (lookup-module name) - (string-append directory "/" (ensure-dot-ko name))) + (define module-name->file-name + (module-name-lookup directory)) =20 - (for-each (cut load-linux-module* <> - #:lookup-module lookup-module) - (map lookup-module modules))) + (for-each (lambda (module) + (load-linux-module* (module-name->file-name module) + #:lookup-module module-name->file-name)) + modules)) =20 ;;; @@ -401,6 +413,47 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by module))) known-aliases)) =20 +(define (module-name->file-name/guess directory name) + "Guess the file name corresponding to NAME, a module name. That doesn't +always work because sometimes underscores in NAME map to hyphens (e.g., +\"input-leds.ko\"), sometimes not (e.g., \"mac_hid.ko\")." + (string-append directory "/" (ensure-dot-ko name))) + +(define (module-name-lookup directory) + "Return a one argument procedure that takes a module name (e.g., +\"input_leds\") and returns its absolute file name (e.g., +\"/.../input-leds.ko\")." + (catch 'system-error + (lambda () + (define mapping + (call-with-input-file (string-append directory "/modules.name") + read)) + + (lambda (name) + (or (assoc-ref mapping name) + (module-name->file-name/guess directory name)))) + (lambda args + (if (=3D ENOENT (system-error-errno args)) + (cut module-name->file-name/guess directory <>) + (apply throw args))))) + +(define (write-module-name-database directory) + "Write a database that maps \"module names\" as they appear in the relev= ant +ELF section of '.ko' files, to actual file names. This format is +Guix-specific. It aims to deal with inconsistent naming, in particular +hyphens vs. underscores." + (define mapping + (map (lambda (file) + (match (module-formal-name file) + (#f (cons (basename file ".ko") file)) + (name (cons name file)))) + (find-files directory "\\.ko$"))) + + (call-with-output-file (string-append directory "/modules.name") + (lambda (port) + (display ";; Module name to file name mapping.\n" port) + (pretty-print mapping port)))) + (define (write-module-alias-database directory) "Traverse the '.ko' files in DIRECTORY and create the corresponding 'modules.alias' file." diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm index 4379fb461e..9160d94847 100644 --- a/gnu/system/linux-initrd.scm +++ b/gnu/system/linux-initrd.scm @@ -242,6 +242,9 @@ MODULES and taken from LINUX." (write-module-alias-database #$output) (write-module-device-database #$output) =20 + ;; Hyphen or underscore? This database tells us. + (write-module-name-database #$output) + ;; Copy "modules.builtin", which we need to determine whether a ;; module needs to be loaded. (match (find-files #$linux (string->regexp "modules.builtin")) --=-=-=--