diff mbox series

[bug#40274] gnu: Add kernel-module-loader-service.

Message ID 20200328135908.2540-1-brice@waegenei.re
State Accepted
Headers show
Series [bug#40274] gnu: Add kernel-module-loader-service. | expand

Checks

Context Check Description
cbaines/applying patch fail View Laminar job

Commit Message

Brice Waegeneire March 28, 2020, 1:59 p.m. UTC
* 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(-)

Comments

Mathieu Othacehe March 28, 2020, 8:51 p.m. UTC | #1
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
Brice Waegeneire March 31, 2020, 5:22 p.m. UTC | #2
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
Nicolò Balzarotti March 31, 2020, 8:10 p.m. UTC | #3
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
Brice Waegeneire March 31, 2020, 8:25 p.m. UTC | #4
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
Brice Waegeneire April 4, 2020, 3:17 p.m. UTC | #5
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(-)
Brice Waegeneire April 5, 2020, 5:28 a.m. UTC | #6
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 mbox series

Patch

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))))