Message ID | 20200328135908.2540-1-brice@waegenei.re |
---|---|
State | Accepted |
Headers | show |
Series | [bug#40274] gnu: Add kernel-module-loader-service. | expand |
Context | Check | Description |
---|---|---|
cbaines/applying patch | fail | View Laminar job |
Hello Brice, Thanks for this patch! I think you could add this service to (gnu tests linux-modules). This way we would have a full-coverage of the mechanism. Mathieu
Hello Mathieu, On 2020-03-28 20:51, Mathieu Othacehe wrote: > Hello Brice, > > Thanks for this patch! I think you could add this service to (gnu tests > linux-modules). This way we would have a full-coverage of the > mechanism. > > Mathieu I have done what you suggested in v2. It also fix some issues and add the ability to optionally specify parameters for each module. - Brice
Hi, I found a typo /usefull/useful/ Nicolò Brice Waegeneire <brice@waegenei.re> writes: > * 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): New procedure. > (kernel-module-loader-service-type, kernel-module-loader-configuration): > New types. > --- > > This patch is related to the following thread: > https://lists.gnu.org/archive/html/guix-devel/2020-03/msg00381.html > > doc/guix.texi | 48 ++++++++++++++++++++++++++++++++++ > gnu/services/linux.scm | 58 +++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 105 insertions(+), 1 deletion(-) > > diff --git a/doc/guix.texi b/doc/guix.texi > index 77a4b8ed71..a297ec249f 100644 > --- a/doc/guix.texi > +++ b/doc/guix.texi > @@ -75,6 +75,7 @@ Copyright @copyright{} 2020 Wiktor Żelazny@* > Copyright @copyright{} 2020 Damien Cassou@* > Copyright @copyright{} 2020 Jakub Kądziołka@* > Copyright @copyright{} 2020 Jack Hill@* > +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 > @@ -25382,6 +25383,53 @@ notifications. > @end table > @end deftp > > +@cindex modprobe > +@cindex kernel module loader > +@subsubsection Kernel Module Loader Service > + > +The @code{kernel-module-loader-service} provides a service to load > +kernel modules at boot. This is especially usefull for modules that > +don't autoload and need to be manually loaded, like it's the case with > +@code{ddcci} for example. > + > +@deffn {Scheme Procedure} kernel-module-loader-service @var{modules} > +Return a service that run @command{modprobe} with arguments > +@var{modules} at boot. For example loading the drivers provided by > +@code{ddci-driver-linux} can be done as follow: > + > +@lisp > +(use-modules (gnu)) > +(use-package-modules linux) > +(use-service-modules linux) > +(operating-system > + ... > + (services (cons* (kernel-module-loader-service > + '("ddcci""ddcci_backlight")) > + %base-services)) > + (kernel-loadable-modules (list ddcci-driver-linux))) > +@end lisp > +@end defvr > + > +@deffn {Scheme Variable} kernel-module-loader-service-type > +The service type for loading kernel modules, that can't autoload, at > +boot, @command{modprobe}, on. Its value must be a > +@code{kernel-module-loader-configuration} object, described below. > + > +@deftp {Data Type} kernel-module-loader-configuration > +The data type representing the configuration of @command{sysctl}. > + > +@deftp {Data Type} kernel-module-loader-configuration > +This is the configuration record for the > +@code{kernel-module-loader-service-type}. > + > +@table @asis > +@item @code{modprobe} (default: @code{(file-append kmod "/bin/modprobe"}) > +The @command{modprobe} executable to use. > + > +@item @code{modules} (default: @code{'()}) > +A list specifying the modules to load. > +@end table > +@end deftp > > @node Miscellaneous Services > @subsection Miscellaneous Services > diff --git a/gnu/services/linux.scm b/gnu/services/linux.scm > index caa0326c31..99ab4a3329 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. > ;;; > @@ -37,7 +38,14 @@ > 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-configuration > + kernel-module-loader-configuration? > + kernel-module-loader-configuration-modprobe > + kernel-module-loader-configuration-modules > + kernel-module-loader-service-type > + kernel-module-loader-service)) > > > ;;; > @@ -123,3 +131,51 @@ representation." > (list (service-extension shepherd-root-service-type > (compose list earlyoom-shepherd-service)))) > (description "Run @command{earlyoom}, the Early OOM daemon."))) > + > +;;; > +;;; Kernel module loader. > +;;; > + > +(define-record-type* <kernel-module-loader-configuration> > + kernel-module-loader-configuration make-kernel-module-loader-configuration > + kernel-module-loader-configuration? > + (modprobe kernel-module-loader-configuration-modprobe ; path of the 'modprobe' command > + (default (file-append kmod "/bin/modprobe"))) > + (modules kernel-module-loader-configuration-modules ; list of strings > + (default '()))) > + > +(define kernel-module-loader-shepherd-service > + (match-lambda > + (($ <kernel-module-loader-configuration> modprobe modules) > + (list > + (shepherd-service > + (documentation "Load kernel modules.") > + (provision '(kernel-module-loader)) > + (respawn? #f) > + (one-shot? #t) > + (start > + #~(lambda _ > + (zero? (system* #$modprobe #$@modules))))))))) > + > +(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 (lambda (config modules) > + (kernel-module-loader-configuration > + (inherit config) > + (modules (append > + (kernel-module-loader-configuration-modules config) > + modules))))) > + (default-value (kernel-module-loader-configuration)))) > + > +(define* (kernel-module-loader-service modules) > + "Return a service that loads kernel MODULES." > + (service kernel-module-loader-service-type > + (kernel-module-loader-configuration > + (modules modules)))) > -- > 2.25.1
Hello, On 2020-03-31 20:10, Nicolò Balzarotti wrote: > Hi, I found a typo > > /usefull/useful/ > > Nicolò Thank you Nicolò I was missing flyspell in texinfo-mode, it's fixed in v4. - Brice
Hello, The following modification have been made since the previous patch version: - The format to specify kernel modules has been reverted to a simple list of strings. - The `modprobe` command used is retrieved from "/proc/sys/kernel/modprobe". - Thanks to the previously listed modifications, `kernel-module-loader-service-type` has been removed together with the helper function `kernel-module-loader-service`. No need to bother with a record now that we only need a list of strings. - A temporary crutch to force `modprobe` from loading "/etc/modprobe.d" has been added. The permanent fix has been submitted as #40422[0] but it needs to go trough the core-updates branch. - The documentation has been updated accordingly. - An example showing how to specify module arguments using "/etc/modprobe.d/" has been added to the documentation. [0]: https://issues.guix.info/issue/40422 - Brice Brice Waegeneire (2): services: Allow modprobe to use "/etc/modprobe.d". gnu: Add kernel-module-loader-service. doc/guix.texi | 38 +++++++++++++++++++++++++++ gnu/services.scm | 4 +++ gnu/services/linux.scm | 52 ++++++++++++++++++++++++++++++++++++- gnu/tests/linux-modules.scm | 33 ++++++++++++++--------- 4 files changed, 114 insertions(+), 13 deletions(-)
This new revision: - fix a typo in the documentation - remove the part about built-in modules in the documentation - add a missing Guile module to `kernel-module-loader-shepherd-service` - `kernel-module-loader-shepherd-service` doesn't fail when the kernel don't support loadable module and there if no module are to be loaded Brice Waegeneire (2): services: Allow modprobe to use "/etc/modprobe.d". gnu: Add kernel-module-loader-service. doc/guix.texi | 37 +++++++++++++++++++++++++ gnu/services.scm | 4 +++ gnu/services/linux.scm | 54 ++++++++++++++++++++++++++++++++++++- gnu/tests/linux-modules.scm | 33 ++++++++++++++--------- 4 files changed, 115 insertions(+), 13 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi index 77a4b8ed71..a297ec249f 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -75,6 +75,7 @@ Copyright @copyright{} 2020 Wiktor Żelazny@* Copyright @copyright{} 2020 Damien Cassou@* Copyright @copyright{} 2020 Jakub Kądziołka@* Copyright @copyright{} 2020 Jack Hill@* +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 @@ -25382,6 +25383,53 @@ notifications. @end table @end deftp +@cindex modprobe +@cindex kernel module loader +@subsubsection Kernel Module Loader Service + +The @code{kernel-module-loader-service} provides a service to load +kernel modules at boot. This is especially usefull for modules that +don't autoload and need to be manually loaded, like it's the case with +@code{ddcci} for example. + +@deffn {Scheme Procedure} kernel-module-loader-service @var{modules} +Return a service that run @command{modprobe} with arguments +@var{modules} at boot. For example loading the drivers provided by +@code{ddci-driver-linux} can be done as follow: + +@lisp +(use-modules (gnu)) +(use-package-modules linux) +(use-service-modules linux) +(operating-system + ... + (services (cons* (kernel-module-loader-service + '("ddcci""ddcci_backlight")) + %base-services)) + (kernel-loadable-modules (list ddcci-driver-linux))) +@end lisp +@end defvr + +@deffn {Scheme Variable} kernel-module-loader-service-type +The service type for loading kernel modules, that can't autoload, at +boot, @command{modprobe}, on. Its value must be a +@code{kernel-module-loader-configuration} object, described below. + +@deftp {Data Type} kernel-module-loader-configuration +The data type representing the configuration of @command{sysctl}. + +@deftp {Data Type} kernel-module-loader-configuration +This is the configuration record for the +@code{kernel-module-loader-service-type}. + +@table @asis +@item @code{modprobe} (default: @code{(file-append kmod "/bin/modprobe"}) +The @command{modprobe} executable to use. + +@item @code{modules} (default: @code{'()}) +A list specifying the modules to load. +@end table +@end deftp @node Miscellaneous Services @subsection Miscellaneous Services diff --git a/gnu/services/linux.scm b/gnu/services/linux.scm index caa0326c31..99ab4a3329 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. ;;; @@ -37,7 +38,14 @@ 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-configuration + kernel-module-loader-configuration? + kernel-module-loader-configuration-modprobe + kernel-module-loader-configuration-modules + kernel-module-loader-service-type + kernel-module-loader-service)) ;;; @@ -123,3 +131,51 @@ representation." (list (service-extension shepherd-root-service-type (compose list earlyoom-shepherd-service)))) (description "Run @command{earlyoom}, the Early OOM daemon."))) + +;;; +;;; Kernel module loader. +;;; + +(define-record-type* <kernel-module-loader-configuration> + kernel-module-loader-configuration make-kernel-module-loader-configuration + kernel-module-loader-configuration? + (modprobe kernel-module-loader-configuration-modprobe ; path of the 'modprobe' command + (default (file-append kmod "/bin/modprobe"))) + (modules kernel-module-loader-configuration-modules ; list of strings + (default '()))) + +(define kernel-module-loader-shepherd-service + (match-lambda + (($ <kernel-module-loader-configuration> modprobe modules) + (list + (shepherd-service + (documentation "Load kernel modules.") + (provision '(kernel-module-loader)) + (respawn? #f) + (one-shot? #t) + (start + #~(lambda _ + (zero? (system* #$modprobe #$@modules))))))))) + +(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 (lambda (config modules) + (kernel-module-loader-configuration + (inherit config) + (modules (append + (kernel-module-loader-configuration-modules config) + modules))))) + (default-value (kernel-module-loader-configuration)))) + +(define* (kernel-module-loader-service modules) + "Return a service that loads kernel MODULES." + (service kernel-module-loader-service-type + (kernel-module-loader-configuration + (modules modules))))