[PATCH] initrd: Parse kernel command line and pass module parameters

  • Open
  • quality assurance status badge
Details
One participant
  • nathan
Owner
unassigned
Submitted by
nathan
Severity
normal
N
N
nathan wrote on 31 Dec 2023 05:14
(address . guix-patches@gnu.org)
87edf3qa0v.fsf@nborghese.com
GUIX's initrd code ignores the kernel command line and always passes no parameters to the modules it loads.
This fixes it with command line parsing code that is accurate to what modprobe does.
The user's module options, like somemodule.param=val, are properly passed now.
It also allows the modprobe.blacklist option to optionally be quoted and normalizes the module names given in the blacklist.
modprobe.blacklist="module1,mod-ule2" -> '("module1" "mod_ule2")

I tested passing module options with the command line in a VM and on my real system.
Tested blacklist code in a VM.

I've also attached my code I used to test the commandline parsing function manually.

fix bug#55907
From 626930cbad11e7f5546589fc290b2c95fee97b80 Mon Sep 17 00:00:00 2001
Message-ID: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 30 Dec 2023 22:10:26 -0500
Subject: [PATCH 1/3] linux-modules: Allow parameters to be passed to kernel
modules

* gnu/build/linux-modules.scm (load-linux-module*): New parameter,
`get-options', for getting kernel module parameters to give to Linux.

Change-Id: I8c4629a1404270fe641fef02a9fbbaeac4360e65
---
gnu/build/linux-modules.scm | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)

Toggle diff (54 lines)
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 12cb9c4ba6..c4950ea6d2 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -332,12 +332,15 @@ (define* (load-linux-module* file
#:key
(recursive? #t)
(lookup-module dot-ko)
- (black-list (module-black-list)))
+ (black-list (module-black-list))
+ (get-options (const "")))
"Load Linux module from FILE, the name of a '.ko[.gz|.xz]' file; return true
on success, false otherwise. When RECURSIVE? is true, load its dependencies
first (à la 'modprobe'.) The actual files containing modules depended on are
obtained by calling LOOKUP-MODULE with the module name. Modules whose name
-appears in BLACK-LIST are not loaded."
+appears in BLACK-LIST are not loaded. GET-OPTIONS is a procedure that takes a
+normalized module name string input and returns a string containing the complete
+parameters to pass to the module. See init_module(2) for the parameters format."
(define (black-listed? module)
(let ((result (member module black-list)))
(when result
@@ -350,20 +353,23 @@ (define* (load-linux-module* file
(let ((dependencies (module-dependencies file)))
(every (cut load-linux-module* <>
#:lookup-module lookup-module
- #:black-list black-list)
+ #:black-list black-list
+ #:get-options get-options)
(map lookup-module dependencies))))
(and (not (black-listed? (file-name->module-name file)))
(or (not recursive?)
(load-dependencies file))
- (let ((fd #f))
+ (let ((fd #f)
+ (options (get-options (file-name->module-name file))))
(format (current-module-debugging-port)
- "loading Linux module from '~a'...~%" file)
+ "loading Linux module from '~a' with options '~a'...~%" file
+ options)
(catch 'system-error
(lambda ()
(set! fd (open-fdes file O_RDONLY))
- (load-linux-module/fd fd)
+ (load-linux-module/fd fd options)
(close-fdes fd)
#t)
(lambda args

base-commit: f24b14767d362a84e6469682b4fe303b50f4b589
--
2.41.0
From 0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27 Mon Sep 17 00:00:00 2001
Message-ID: <0cd4f6fb19c96a6be4a0d0851e1cf6dfd7046a27.1703992381.git.nathan_mail@nborghese.com>
In-Reply-To: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@nborghese.com>
References: <626930cbad11e7f5546589fc290b2c95fee97b80.1703992381.git.nathan_mail@nborghese.com>
From: nathan <nathan_mail@nborghese.com>
Date: Sat, 30 Dec 2023 22:12:19 -0500
Subject: [PATCH 3/3] linux-modules: Rewrite module-black-list with
parse-kernel-cmdline

* gnu/build/linux-modules.scm
(module-black-list): Use parse-kernel-cmdline. Strip quotes from module names.
Normalize module names so they can be properly compared with strings from
file-name->module-name.

Change-Id: I318006f98844593863246fc89ed1703767794702
---
gnu/build/linux-modules.scm | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)

Toggle diff (44 lines)
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index a54616b2d4..cbce3394e2 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -397,18 +397,25 @@ (define (module-black-list)
is specified using 'modprobe.blacklist=MODULE1,MODULE2,...' on the kernel
command line; it is honored by libkmod for users that pass
'KMOD_PROBE_APPLY_BLACKLIST', which includes 'modprobe --use-blacklist' and
-udev."
- (define parameter
- "modprobe.blacklist=")
-
- (let ((command (call-with-input-file "/proc/cmdline"
- get-string-all)))
- (append-map (lambda (arg)
- (if (string-prefix? parameter arg)
- (string-tokenize (string-drop arg (string-length parameter))
- %not-comma)
- '()))
- (string-tokenize command))))
+udev. The names in the returned list are normalized with `normalize-module-name'."
+ (define target-parameter "blacklist=")
+
+ (let* ((cmdline (parse-kernel-cmdline (call-with-input-file "/proc/cmdline"
+ get-string-all)))
+ (modprobe-pair (vhash-assoc "modprobe" cmdline)))
+ (if modprobe-pair
+ (map normalize-module-name
+ (append-map
+ (lambda (param)
+ (if (string-prefix? target-parameter param)
+ (string-tokenize
+ (string-delete
+ #\"
+ (string-drop param (string-length target-parameter)))
+ %not-comma)
+ '()))
+ (cdr modprobe-pair)))
+ '())))
(define (module-loaded? module)
"Return #t if MODULE is already loaded. MODULE must be a Linux module name,
--
2.41.0
Attachment: test.scm
?