From: Brice Waegeneire <brice@waegenei.re>
To: 40274@debbugs.gnu.org
Subject: [bug#40274] [PATCH v6 2/2] gnu: Add kernel-module-loader-service.
Date: Sat, 4 Apr 2020 17:17:32 +0200 [thread overview]
Message-ID: <20200404151732.20341-3-brice@waegenei.re> (raw)
In-Reply-To: <20200404151732.20341-1-brice@waegenei.re>
* doc/guix.texi (Linux Services): Add a new subsection and document the
new service and its configuration.
* gnu/services/linux.scm (kernel-module-loader-service-type): New type.
(kernel-module-loader-shepherd-service): New procedure.
* gnu/tests/linux-modules.scm (module-loader-program): Procedure
removed.
(modules-loaded?-program): New procedure.
(run-loadable-kernel-modules-test): 'module-loader-program' procedure
replaced by the new one.
[os]: Use 'kernel-module-loader-service'.
---
doc/guix.texi | 38 +++++++++++++++++++++++++++
gnu/services/linux.scm | 52 ++++++++++++++++++++++++++++++++++++-
gnu/tests/linux-modules.scm | 33 ++++++++++++++---------
3 files changed, 110 insertions(+), 13 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index 8cb85fe62c..b18413f685 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -76,6 +76,7 @@ Copyright @copyright{} 2020 Damien Cassou@*
Copyright @copyright{} 2020 Jakub Kądziołka@*
Copyright @copyright{} 2020 Jack Hill@*
Copyright @copyright{} 2020 Naga Malleswari@*
+Copyright @copyright{} 2020 Brice Waegeneire@*
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@@ -25383,6 +25384,43 @@ notifications.
@end table
@end deftp
+@cindex modprobe
+@cindex kernel module loader
+@subsubsection Kernel Module Loader Service
+
+The kernel module loader service allows one to load, at boot, loadable
+kernel modules---in opposition to built-in kernel modules which should
+be added to the @code{kernel-arguments} field instead. This is
+especially useful for modules that don't autoload and need to be
+manually loaded, as it's the case with @code{ddcci} for example.
+
+@deffn {Scheme Variable} kernel-module-loader-service-type
+The service type for loading loadable kernel modules at boot with
+@command{modprobe}. Its value must be a list of strings representing
+module names. For example loading the drivers provided by
+@code{ddci-driver-linux}, in debugging mode by passing some module
+parameters, can be done as follow:
+
+@lisp
+(use-modules (gnu) (gnu services))
+(use-package-modules linux)
+(use-service-modules linux)
+
+(define ddcci-config
+ (plain-file "ddcci.conf"
+ "options ddcci dyndbg delay=120"))
+
+(operating-system
+ ...
+ (services (cons* (service kernel-module-loader-service-type
+ '("ddcci" "ddcci_backlight"))
+ (simple-service 'ddcci-config etc-service-type
+ (list `("modprobe.d/ddcci.conf"
+ ,ddcci-config)))
+ %base-services))
+ (kernel-loadable-modules (list ddcci-driver-linux)))
+@end lisp
+@end deffn
@node Miscellaneous Services
@subsection Miscellaneous Services
diff --git a/gnu/services/linux.scm b/gnu/services/linux.scm
index caa0326c31..621d26fcff 100644
--- a/gnu/services/linux.scm
+++ b/gnu/services/linux.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -25,6 +26,8 @@
#:use-module (gnu packages linux)
#:use-module (srfi srfi-1)
#:use-module (srfi srfi-26)
+ #:use-module (srfi srfi-34)
+ #:use-module (srfi srfi-35)
#:use-module (ice-9 match)
#:export (earlyoom-configuration
earlyoom-configuration?
@@ -37,7 +40,9 @@
earlyoom-configuration-ignore-positive-oom-score-adj?
earlyoom-configuration-show-debug-messages?
earlyoom-configuration-send-notification-command
- earlyoom-service-type))
+ earlyoom-service-type
+
+ kernel-module-loader-service-type))
\f
;;;
@@ -123,3 +128,48 @@ representation."
(list (service-extension shepherd-root-service-type
(compose list earlyoom-shepherd-service))))
(description "Run @command{earlyoom}, the Early OOM daemon.")))
+
+\f
+;;;
+;;; Kernel module loader.
+;;;
+
+(define kernel-module-loader-shepherd-service
+ (match-lambda
+ ((and (? list? kernel-modules) ((? string?) ...))
+ (list
+ (shepherd-service
+ (documentation "Load kernel modules.")
+ (provision '(kernel-module-loader))
+ (requirement '(file-systems))
+ (respawn? #f)
+ (one-shot? #t)
+ (modules `((srfi srfi-34)
+ (srfi srfi-35)
+ ,@%default-modules))
+ (start
+ #~(lambda _
+ (if (file-exists? "/proc/sys/kernel/modprobe")
+ (let ((modprobe (call-with-input-file
+ "/proc/sys/kernel/modprobe" get-line)))
+ (guard (c ((message-condition? c)
+ (format (current-error-port) "~a~%"
+ (condition-message c))
+ #f))
+ (map (lambda (module)
+ (invoke/quiet modprobe "--" module))
+ '#$kernel-modules)))
+ (begin (format (current-error-port) "error: ~a~%"
+ "Kernel is missing loadable module support.")
+ #f)))))))))
+
+(define kernel-module-loader-service-type
+ (service-type
+ (name 'kernel-module-loader)
+ (description "Load kernel modules.")
+ (extensions
+ (list (service-extension shepherd-root-service-type
+ kernel-module-loader-shepherd-service)))
+ (compose concatenate)
+ (extend append)
+ (default-value '())))
diff --git a/gnu/tests/linux-modules.scm b/gnu/tests/linux-modules.scm
index 39e11587c6..f1c4feb7a0 100644
--- a/gnu/tests/linux-modules.scm
+++ b/gnu/tests/linux-modules.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.org>
;;; Copyright © 2020 Danny Milosavljevic <dannym@scratchpost.org>
+;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -19,6 +20,8 @@
(define-module (gnu tests linux-modules)
#:use-module (gnu packages linux)
+ #:use-module (gnu services)
+ #:use-module (gnu services linux)
#:use-module (gnu system)
#:use-module (gnu system vm)
#:use-module (gnu tests)
@@ -37,25 +40,30 @@
;;;
;;; Code:
-(define* (module-loader-program os modules)
- "Return an executable store item that, upon being evaluated, will dry-run
-load MODULES."
+(define* (modules-loaded?-program os modules)
+ "Return an executable store item that, upon being evaluated, will verify
+that MODULES are actually loaded."
(program-file
"load-kernel-modules.scm"
- (with-imported-modules (source-module-closure '((guix build utils)))
- #~(begin
- (use-modules (guix build utils))
- (for-each (lambda (module)
- (invoke (string-append #$kmod "/bin/modprobe") "-n" "--"
- module))
- '#$modules)))))
+ #~(begin
+ (use-modules (ice-9 rdelim)
+ (ice-9 popen))
+ (let* ((port (open-input-pipe (string-append #$kmod "/bin/lsmod")))
+ (output (read-string port))
+ (status (close-pipe port)))
+ (and-map (lambda (module) (string-contains output module))
+ '#$modules)))))
(define* (run-loadable-kernel-modules-test module-packages module-names)
- "Run a test of an OS having MODULE-PACKAGES, and modprobe MODULE-NAMES."
+ "Run a test of an OS having MODULE-PACKAGES, and verify that MODULE-NAMES
+are loaded in memory."
(define os
(marionette-operating-system
(operating-system
(inherit (simple-operating-system))
+ (services (cons (service kernel-module-loader-service-type module-names)
+ (operating-system-user-services
+ (simple-operating-system))))
(kernel-loadable-modules module-packages))
#:imported-modules '((guix combinators))))
(define vm (virtual-machine os))
@@ -75,7 +83,8 @@ load MODULES."
marionette))
(test-end)
(exit (= (test-runner-fail-count (test-runner-current)) 0)))))
- (gexp->derivation "loadable-kernel-modules" (test (module-loader-program os module-names))))
+ (gexp->derivation "loadable-kernel-modules"
+ (test (modules-loaded?-program os module-names))))
(define %test-loadable-kernel-modules-0
(system-test
--
2.26.0
next prev parent reply other threads:[~2020-04-04 15:18 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-28 13:59 [bug#40274] [PATCH] gnu: Add kernel-module-loader-service Brice Waegeneire
2020-03-28 20:51 ` Mathieu Othacehe
2020-03-31 17:22 ` Brice Waegeneire
2020-03-31 17:19 ` [bug#40274] [PATCH v2] " Brice Waegeneire
2020-03-31 20:00 ` [bug#40274] [PATCH v3] " Brice Waegeneire
2020-03-31 20:10 ` [bug#40274] [PATCH] " Nicolò Balzarotti
2020-03-31 20:25 ` Brice Waegeneire
2020-03-31 20:23 ` [bug#40274] [PATCH v4] " Brice Waegeneire
2020-04-01 13:30 ` Mathieu Othacehe
2020-04-01 14:38 ` Brice Waegeneire
2020-04-01 19:34 ` pelzflorian (Florian Pelz)
2020-04-01 19:43 ` pelzflorian (Florian Pelz)
2020-04-01 19:48 ` pelzflorian (Florian Pelz)
2020-04-02 12:40 ` Brice Waegeneire
2020-04-03 13:03 ` pelzflorian (Florian Pelz)
2020-04-02 12:37 ` [bug#40274] [PATCH v5] " Brice Waegeneire
2020-04-02 13:56 ` Danny Milosavljevic
2020-04-02 17:13 ` Brice Waegeneire
2020-04-03 10:20 ` Danny Milosavljevic
2020-04-03 12:58 ` pelzflorian (Florian Pelz)
2020-04-04 10:51 ` Danny Milosavljevic
2020-04-04 17:58 ` Brice Waegeneire
2020-04-04 18:31 ` Danny Milosavljevic
2020-04-05 7:19 ` Brice Waegeneire
2020-04-02 14:22 ` Mathieu Othacehe
2020-04-04 15:17 ` [bug#40274] [PATCH v6 0/2] " Brice Waegeneire
2020-04-04 15:17 ` [bug#40274] [PATCH v6 1/2] services: Allow modprobe to use "/etc/modprobe.d" Brice Waegeneire
2020-04-04 15:17 ` Brice Waegeneire [this message]
2020-04-04 15:53 ` [bug#40274] [PATCH v6 2/2] gnu: Add kernel-module-loader-service Mathieu Othacehe
2020-04-04 16:09 ` pelzflorian (Florian Pelz)
2020-04-04 16:49 ` Brice Waegeneire
2020-04-04 17:46 ` pelzflorian (Florian Pelz)
2020-04-04 21:10 ` Danny Milosavljevic
2020-04-04 21:11 ` Danny Milosavljevic
2020-04-04 23:06 ` pelzflorian (Florian Pelz)
2020-04-05 7:06 ` Brice Waegeneire
2020-04-04 21:16 ` Danny Milosavljevic
2020-04-05 5:28 ` [bug#40274] [PATCH v7 0/2] " Brice Waegeneire
2020-04-05 5:28 ` [bug#40274] [PATCH v7 1/2] services: Allow modprobe to use "/etc/modprobe.d" Brice Waegeneire
2020-04-05 11:11 ` Danny Milosavljevic
2020-04-05 12:38 ` Brice Waegeneire
2020-04-05 5:28 ` [bug#40274] [PATCH v7 2/2] gnu: Add kernel-module-loader-service Brice Waegeneire
2020-04-05 10:06 ` pelzflorian (Florian Pelz)
2020-04-05 11:10 ` bug#40274: " Danny Milosavljevic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200404151732.20341-3-brice@waegenei.re \
--to=brice@waegenei.re \
--cc=40274@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).