linux-modules: Define and use a module name database.

Fixes <https://bugs.gnu.org/34902>.
Reported by Julien Lepiller <julien@lepiller.eu>.

* 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'.
This commit is contained in:
Ludovic Courtès 2018-03-14 23:11:01 +01:00
parent e1a9a7f275
commit c85ccf60bf
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 71 additions and 6 deletions

View File

@ -31,8 +31,10 @@
#:use-module (ice-9 vlist) #:use-module (ice-9 vlist)
#:use-module (ice-9 match) #:use-module (ice-9 match)
#:use-module (ice-9 rdelim) #:use-module (ice-9 rdelim)
#:autoload (ice-9 pretty-print) (pretty-print)
#:export (dot-ko #:export (dot-ko
ensure-dot-ko ensure-dot-ko
module-formal-name
module-aliases module-aliases
module-dependencies module-dependencies
module-soft-dependencies module-soft-dependencies
@ -52,6 +54,7 @@
matching-modules matching-modules
missing-modules missing-modules
write-module-name-database
write-module-alias-database write-module-alias-database
write-module-device-database)) write-module-device-database))
@ -100,6 +103,14 @@ key/value pairs.."
(define %not-comma (define %not-comma
(char-set-complement (char-set #\,))) (char-set-complement (char-set #\,)))
(define (module-formal-name file)
"Return the module name of FILE as it appears in its info section. Usually
the module name is the same as the base name of FILE, modulo hyphens and minus
the \".ko\" extension."
(match (assq 'name (modinfo-section-contents file))
(('name . name) name)
(#f #f)))
(define (module-dependencies file) (define (module-dependencies file)
"Return the list of modules that FILE depends on. The returned list "Return the list of modules that FILE depends on. The returned list
contains module names, not actual file names." contains module names, not actual file names."
@ -319,12 +330,13 @@ appears in BLACK-LIST are not loaded."
"Load MODULES and their dependencies from DIRECTORY, a directory containing "Load MODULES and their dependencies from DIRECTORY, a directory containing
the '.ko' files. The '.ko' suffix is automatically added to MODULES if the '.ko' files. The '.ko' suffix is automatically added to MODULES if
needed." needed."
(define (lookup-module name) (define module-name->file-name
(string-append directory "/" (ensure-dot-ko name))) (module-name-lookup directory))
(for-each (cut load-linux-module* <> (for-each (lambda (module)
#:lookup-module lookup-module) (load-linux-module* (module-name->file-name module)
(map lookup-module modules))) #:lookup-module module-name->file-name))
modules))
;;; ;;;
@ -502,6 +514,56 @@ are required to access DEVICE."
(remove (cut member <> provided) modules)) (remove (cut member <> provided) modules))
'())) '()))
;;;
;;; Module databases.
;;;
(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 (= 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 relevant
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.
;;
;; This format is Guix-specific; it is not supported by upstream Linux tools.
\n"
port)
(pretty-print mapping port))))
(define (write-module-alias-database directory) (define (write-module-alias-database directory)
"Traverse the '.ko' files in DIRECTORY and create the corresponding "Traverse the '.ko' files in DIRECTORY and create the corresponding
'modules.alias' file." 'modules.alias' file."

View File

@ -133,7 +133,10 @@ MODULES and taken from LINUX."
(copy-file module (copy-file module
(string-append #$output "/" (string-append #$output "/"
(basename module)))) (basename module))))
(delete-duplicates modules))))) (delete-duplicates modules))
;; Hyphen or underscore? This database tells us.
(write-module-name-database #$output))))
(computed-file "linux-modules" build-exp)) (computed-file "linux-modules" build-exp))