diff mbox series

[V2,1/2] kernel-module-split: make autoload and probeconf distribution specific

Message ID 20230619231343.1683736-1-jose.quaresma@foundries.io
State New
Headers show
Series [V2,1/2] kernel-module-split: make autoload and probeconf distribution specific | expand

Commit Message

Jose Quaresma June 19, 2023, 11:13 p.m. UTC
The modules-load.d [1] - Configure kernel modules to load at boot
should install their configuration files in /usr/lib/modules-load.d.

The modprobe.d [2] - Configuration directory for modprobe
should install their configuration files in /lib/modprobe.d

[1] https://www.freedesktop.org/software/systemd/man/modules-load.d.html
[2] https://www.man7.org/linux/man-pages//man5/modprobe.d.5.html

[YOCTO #12212] https://bugzilla.yoctoproject.org/show_bug.cgi?id=12212

CC: Ola x Nilsson <Ola.x.Nilsson@axis.com>
CC: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
---

V2: use the same location as before on the class and define the new
location just for systemd.

 .../kernel-module-split.bbclass               | 30 +++++++++----------
 .../distro/include/init-manager-systemd.inc   |  4 +++
 2 files changed, 18 insertions(+), 16 deletions(-)

Comments

Peter Kjellerstedt June 20, 2023, 1:13 a.m. UTC | #1
> -----Original Message-----
> From: Jose Quaresma <quaresma.jose@gmail.com>
> Sent: den 20 juni 2023 01:14
> To: openembedded-core@lists.openembedded.org
> Cc: Jose Quaresma <jose.quaresma@foundries.io>; Ola x Nilsson <Ola.x.Nilsson@axis.com>; Peter Kjellerstedt <peter.kjellerstedt@axis.com>
> Subject: [PATCH V2 1/2] kernel-module-split: make autoload and probeconf distribution specific
> 
> The modules-load.d [1] - Configure kernel modules to load at boot
> should install their configuration files in /usr/lib/modules-load.d.
> 
> The modprobe.d [2] - Configuration directory for modprobe
> should install their configuration files in /lib/modprobe.d
> 
> [1] https://www.freedesktop.org/software/systemd/man/modules-load.d.html
> [2] https://www.man7.org/linux/man-pages//man5/modprobe.d.5.html
> 
> [YOCTO #12212] https://bugzilla.yoctoproject.org/show_bug.cgi?id=12212
> 
> CC: Ola x Nilsson <Ola.x.Nilsson@axis.com>
> CC: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
> Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
> ---
> 
> V2: use the same location as before on the class and define the new
> location just for systemd.
> 
>  .../kernel-module-split.bbclass               | 30 +++++++++----------
>  .../distro/include/init-manager-systemd.inc   |  4 +++
>  2 files changed, 18 insertions(+), 16 deletions(-)
> 
> diff --git a/meta/classes-recipe/kernel-module-split.bbclass b/meta/classes-recipe/kernel-module-split.bbclass
> index 50882c31a7..ee14bb6910 100644
> --- a/meta/classes-recipe/kernel-module-split.bbclass
> +++ b/meta/classes-recipe/kernel-module-split.bbclass

[cut]

> @@ -169,8 +168,7 @@ python split_kernel_module_packages () {
>      postrm = d.getVar('pkg_postrm:modules')
> 
>      if splitmods != '1':
> -        etcdir = d.getVar('sysconfdir')
> -        d.appendVar('FILES:' + metapkg, '%s/modules-load.d/ %s/modprobe.d/ %s/modules/' % (etcdir, etcdir, d.getVar("nonarch_base_libdir")))
> +        d.appendVar('FILES:' + metapkg, '%s/ %s/ %s/modules/' % (modulesloaddir, modprobedir, d.getVar("nonarch_base_libdir")))

There is no need for the trailing slashes in FILES:${PN}, so the above 
can be simplified to: 

        d.appendVar('FILES:' + metapkg, '%s %s %s/modules' % (modulesloaddir, modprobedir, d.getVar("nonarch_base_libdir")))

Not sure that warrants a new patch though.

>          d.appendVar('pkg_postinst:%s' % metapkg, postinst)
>          d.prependVar('pkg_postrm:%s' % metapkg, postrm);
>          return

Reviewed-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>

//Peter
Ola x Nilsson June 20, 2023, 8:54 a.m. UTC | #2
On Mon, Jun 19 2023, Jose Quaresma wrote:

> The modules-load.d [1] - Configure kernel modules to load at boot
> should install their configuration files in /usr/lib/modules-load.d.
>
> The modprobe.d [2] - Configuration directory for modprobe
> should install their configuration files in /lib/modprobe.d
>
> [1] https://www.freedesktop.org/software/systemd/man/modules-load.d.html
> [2] https://www.man7.org/linux/man-pages//man5/modprobe.d.5.html
>
> [YOCTO #12212] https://bugzilla.yoctoproject.org/show_bug.cgi?id=12212
>
> CC: Ola x Nilsson <Ola.x.Nilsson@axis.com>
> CC: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
> Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
> ---
>
> V2: use the same location as before on the class and define the new
> location just for systemd.
>
>  .../kernel-module-split.bbclass               | 30 +++++++++----------
>  .../distro/include/init-manager-systemd.inc   |  4 +++
>  2 files changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/meta/classes-recipe/kernel-module-split.bbclass b/meta/classes-recipe/kernel-module-split.bbclass
> index 50882c31a7..ee14bb6910 100644
> --- a/meta/classes-recipe/kernel-module-split.bbclass
> +++ b/meta/classes-recipe/kernel-module-split.bbclass
> @@ -30,8 +30,11 @@ fi
>  
>  PACKAGE_WRITE_DEPS += "kmod-native depmodwrapper-cross"
>  
> +modulesloaddir ??= "${sysconfdir}/modules-load.d"
> +modprobedir ??= "${sysconfdir}/modprobe.d"
> +
>  do_install:append() {
> -	install -d ${D}${sysconfdir}/modules-load.d/ ${D}${sysconfdir}/modprobe.d/
> +	install -d ${D}${modulesloaddir} ${D}${modprobedir}
>  }
>  
>  KERNEL_SPLIT_MODULES ?= "1"
> @@ -93,8 +96,9 @@ python split_kernel_module_packages () {
>  
>          dvar = d.getVar('PKGD')
>  
> -        # If autoloading is requested, output /etc/modules-load.d/<name>.conf and append
> +        # If autoloading is requested, output ${modulesloaddir}/<name>.conf and append
>          # appropriate modprobe commands to the postinst
> +        autoloadpath = '%s/%s.conf' % (d.getVar('modulesloaddir'), basename)
>          autoloadlist = (d.getVar("KERNEL_MODULE_AUTOLOAD") or "").split()
>          autoload = d.getVar('module_autoload_%s' % basename)
>          if autoload and autoload == basename:
> @@ -102,8 +106,7 @@ python split_kernel_module_packages () {
>          if autoload and basename not in autoloadlist:
>              bb.warn("module_autoload_%s is defined but '%s' isn't included in KERNEL_MODULE_AUTOLOAD, please add it there" % (basename, basename))
>          if basename in autoloadlist:
> -            name = '%s/etc/modules-load.d/%s.conf' % (dvar, basename)
> -            f = open(name, 'w')
> +            f = open("%s%s" % (dvar, autoloadpath), 'w')
>              if autoload:
>                  for m in autoload.split():
>                      f.write('%s\n' % m)

You could take the opportunity to rewrite this section to use context
manager to handle the file object:
  with open(...) as f


> @@ -117,23 +120,19 @@ python split_kernel_module_packages () {
>              d.setVar('pkg_postinst:%s' % pkg, postinst)
>  
>          # Write out any modconf fragment
> +        modconfpath = '%s/%s.conf' % (d.getVar('modprobedir'), basename)
>          modconflist = (d.getVar("KERNEL_MODULE_PROBECONF") or "").split()
>          modconf = d.getVar('module_conf_%s' % basename)
>          if modconf and basename in modconflist:
> -            name = '%s/etc/modprobe.d/%s.conf' % (dvar, basename)
> -            f = open(name, 'w')
> +            f = open("%s%s" % (dvar, modconfpath), 'w')

Same.

>              f.write("%s\n" % modconf)
>              f.close()
>          elif modconf:
>              bb.error("Please ensure module %s is listed in KERNEL_MODULE_PROBECONF since module_conf_%s is set" % (basename, basename))
>  
> -        files = d.getVar('FILES:%s' % pkg)
> -        files = "%s /etc/modules-load.d/%s.conf /etc/modprobe.d/%s.conf" % (files, basename, basename)
> -        d.setVar('FILES:%s' % pkg, files)
> -
> -        conffiles = d.getVar('CONFFILES:%s' % pkg)
> -        conffiles = "%s /etc/modules-load.d/%s.conf /etc/modprobe.d/%s.conf" % (conffiles, basename, basename)
> -        d.setVar('CONFFILES:%s' % pkg, conffiles)
> +        appendfiles = " %s %s" % (autoloadpath, modconfpath)
> +        d.appendVar('FILES:%s' % pkg, appendfiles)
> +        d.appendVar('CONFFILES:%s' % pkg, appendfiles)
>  

I think it would be best to use autoloadpath and modconfpath for the
automatic creation of such files, but use all known variants of these
paths for the package splitting.  If the module makefile creates the
files in one of the places the package splitter should find them without
requireing the customization of the recipe. 

>          if "description" in vals:
>              old_desc = d.getVar('DESCRIPTION:' + pkg) or ""
> @@ -169,8 +168,7 @@ python split_kernel_module_packages () {
>      postrm = d.getVar('pkg_postrm:modules')
>  
>      if splitmods != '1':
> -        etcdir = d.getVar('sysconfdir')
> -        d.appendVar('FILES:' + metapkg, '%s/modules-load.d/ %s/modprobe.d/ %s/modules/' % (etcdir, etcdir, d.getVar("nonarch_base_libdir")))
> +        d.appendVar('FILES:' + metapkg, '%s/ %s/ %s/modules/' % (modulesloaddir, modprobedir, d.getVar("nonarch_base_libdir")))
>          d.appendVar('pkg_postinst:%s' % metapkg, postinst)
>          d.prependVar('pkg_postrm:%s' % metapkg, postrm);
>          return
> @@ -189,7 +187,7 @@ python split_kernel_module_packages () {
>      # avoid warnings. removedirs only raises an OSError if an empty
>      # directory cannot be removed.
>      dvar = d.getVar('PKGD')
> -    for dir in ["%s/etc/modprobe.d" % (dvar), "%s/etc/modules-load.d" % (dvar), "%s/etc" % (dvar)]:
> +    for dir in ["%s%s" % (dvar, modprobedir), "%s%s" % (dvar, modulesloaddir)]:
>          if len(os.listdir(dir)) == 0:
>              os.rmdir(dir)
>  }

Same.

> diff --git a/meta/conf/distro/include/init-manager-systemd.inc b/meta/conf/distro/include/init-manager-systemd.inc
> index 7867d90028..fc13089764 100644
> --- a/meta/conf/distro/include/init-manager-systemd.inc
> +++ b/meta/conf/distro/include/init-manager-systemd.inc
> @@ -5,3 +5,7 @@ VIRTUAL-RUNTIME_init_manager ??= "systemd"
>  VIRTUAL-RUNTIME_initscripts ??= "systemd-compat-units"
>  VIRTUAL-RUNTIME_login_manager ??= "shadow-base"
>  VIRTUAL-RUNTIME_dev_manager ??= "systemd"
> +
> +# use autoload and probeconf distribution specific
> +modulesloaddir ?= "${libdir}/modules-load.d"
> +modprobedir ?= "${nonarch_base_libdir}/modprobe.d"
Luca Ceresoli June 20, 2023, 1:57 p.m. UTC | #3
Hello Jose,

On Mon, 19 Jun 2023 23:13:43 +0000
"Jose Quaresma" <quaresma.jose@gmail.com> wrote:

> The modules-load.d [1] - Configure kernel modules to load at boot
> should install their configuration files in /usr/lib/modules-load.d.
> 
> The modprobe.d [2] - Configuration directory for modprobe
> should install their configuration files in /lib/modprobe.d
> 
> [1] https://www.freedesktop.org/software/systemd/man/modules-load.d.html
> [2] https://www.man7.org/linux/man-pages//man5/modprobe.d.5.html
> 
> [YOCTO #12212] https://bugzilla.yoctoproject.org/show_bug.cgi?id=12212
> 
> CC: Ola x Nilsson <Ola.x.Nilsson@axis.com>
> CC: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
> Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>

This patchset is triggering some AB failures:

  Exception: NameError: name 'modprobedir' is not defined

Some logs:

https://autobuilder.yoctoproject.org/typhoon/#/builders/104/builds/6229/steps/12/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/23/builds/7658/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/120/builds/2935/steps/12/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/89/builds/7369/steps/17/logs/stdio

Luca
Jose Quaresma June 20, 2023, 2:12 p.m. UTC | #4
Luca Ceresoli <luca.ceresoli@bootlin.com> escreveu no dia terça, 20/06/2023
à(s) 14:57:

> Hello Jose,
>
> On Mon, 19 Jun 2023 23:13:43 +0000
> "Jose Quaresma" <quaresma.jose@gmail.com> wrote:
>
> > The modules-load.d [1] - Configure kernel modules to load at boot
> > should install their configuration files in /usr/lib/modules-load.d.
> >
> > The modprobe.d [2] - Configuration directory for modprobe
> > should install their configuration files in /lib/modprobe.d
> >
> > [1] https://www.freedesktop.org/software/systemd/man/modules-load.d.html
> > [2] https://www.man7.org/linux/man-pages//man5/modprobe.d.5.html
> >
> > [YOCTO #12212] https://bugzilla.yoctoproject.org/show_bug.cgi?id=12212
> >
> > CC: Ola x Nilsson <Ola.x.Nilsson@axis.com>
> > CC: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
> > Signed-off-by: Jose Quaresma <jose.quaresma@foundries.io>
>
> This patchset is triggering some AB failures:
>
>   Exception: NameError: name 'modprobedir' is not defined
>
> Some logs:
>
>
> https://autobuilder.yoctoproject.org/typhoon/#/builders/104/builds/6229/steps/12/logs/stdio
>
> https://autobuilder.yoctoproject.org/typhoon/#/builders/23/builds/7658/steps/14/logs/stdio
>
> https://autobuilder.yoctoproject.org/typhoon/#/builders/120/builds/2935/steps/12/logs/stdio
>
> https://autobuilder.yoctoproject.org/typhoon/#/builders/89/builds/7369/steps/17/logs/stdio


Hi Luca,

Thanks for the info.

I missed some parts of the patch when updating to v2.
I am also addressing some comments on v2 and will send a v3
after some more testing.

--- a/meta/classes-recipe/kernel-module-split.bbclass
+++ b/meta/classes-recipe/kernel-module-split.bbclass
@@ -166,6 +166,8 @@ python split_kernel_module_packages () {
     splitmods = d.getVar('KERNEL_SPLIT_MODULES')
     postinst = d.getVar('pkg_postinst:modules')
     postrm = d.getVar('pkg_postrm:modules')
+    modulesloaddir = d.getVar('modulesloaddir')
+    modprobedir = d.getVar('modprobedir')

     if splitmods != '1':
         d.appendVar('FILES:' + metapkg, '%s/ %s/ %s/modules/' %
(modulesloaddir, modprobedir, d.getVar("nonarch_base_libdir")))



>
> Luca
>
> --
> Luca Ceresoli, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
>
diff mbox series

Patch

diff --git a/meta/classes-recipe/kernel-module-split.bbclass b/meta/classes-recipe/kernel-module-split.bbclass
index 50882c31a7..ee14bb6910 100644
--- a/meta/classes-recipe/kernel-module-split.bbclass
+++ b/meta/classes-recipe/kernel-module-split.bbclass
@@ -30,8 +30,11 @@  fi
 
 PACKAGE_WRITE_DEPS += "kmod-native depmodwrapper-cross"
 
+modulesloaddir ??= "${sysconfdir}/modules-load.d"
+modprobedir ??= "${sysconfdir}/modprobe.d"
+
 do_install:append() {
-	install -d ${D}${sysconfdir}/modules-load.d/ ${D}${sysconfdir}/modprobe.d/
+	install -d ${D}${modulesloaddir} ${D}${modprobedir}
 }
 
 KERNEL_SPLIT_MODULES ?= "1"
@@ -93,8 +96,9 @@  python split_kernel_module_packages () {
 
         dvar = d.getVar('PKGD')
 
-        # If autoloading is requested, output /etc/modules-load.d/<name>.conf and append
+        # If autoloading is requested, output ${modulesloaddir}/<name>.conf and append
         # appropriate modprobe commands to the postinst
+        autoloadpath = '%s/%s.conf' % (d.getVar('modulesloaddir'), basename)
         autoloadlist = (d.getVar("KERNEL_MODULE_AUTOLOAD") or "").split()
         autoload = d.getVar('module_autoload_%s' % basename)
         if autoload and autoload == basename:
@@ -102,8 +106,7 @@  python split_kernel_module_packages () {
         if autoload and basename not in autoloadlist:
             bb.warn("module_autoload_%s is defined but '%s' isn't included in KERNEL_MODULE_AUTOLOAD, please add it there" % (basename, basename))
         if basename in autoloadlist:
-            name = '%s/etc/modules-load.d/%s.conf' % (dvar, basename)
-            f = open(name, 'w')
+            f = open("%s%s" % (dvar, autoloadpath), 'w')
             if autoload:
                 for m in autoload.split():
                     f.write('%s\n' % m)
@@ -117,23 +120,19 @@  python split_kernel_module_packages () {
             d.setVar('pkg_postinst:%s' % pkg, postinst)
 
         # Write out any modconf fragment
+        modconfpath = '%s/%s.conf' % (d.getVar('modprobedir'), basename)
         modconflist = (d.getVar("KERNEL_MODULE_PROBECONF") or "").split()
         modconf = d.getVar('module_conf_%s' % basename)
         if modconf and basename in modconflist:
-            name = '%s/etc/modprobe.d/%s.conf' % (dvar, basename)
-            f = open(name, 'w')
+            f = open("%s%s" % (dvar, modconfpath), 'w')
             f.write("%s\n" % modconf)
             f.close()
         elif modconf:
             bb.error("Please ensure module %s is listed in KERNEL_MODULE_PROBECONF since module_conf_%s is set" % (basename, basename))
 
-        files = d.getVar('FILES:%s' % pkg)
-        files = "%s /etc/modules-load.d/%s.conf /etc/modprobe.d/%s.conf" % (files, basename, basename)
-        d.setVar('FILES:%s' % pkg, files)
-
-        conffiles = d.getVar('CONFFILES:%s' % pkg)
-        conffiles = "%s /etc/modules-load.d/%s.conf /etc/modprobe.d/%s.conf" % (conffiles, basename, basename)
-        d.setVar('CONFFILES:%s' % pkg, conffiles)
+        appendfiles = " %s %s" % (autoloadpath, modconfpath)
+        d.appendVar('FILES:%s' % pkg, appendfiles)
+        d.appendVar('CONFFILES:%s' % pkg, appendfiles)
 
         if "description" in vals:
             old_desc = d.getVar('DESCRIPTION:' + pkg) or ""
@@ -169,8 +168,7 @@  python split_kernel_module_packages () {
     postrm = d.getVar('pkg_postrm:modules')
 
     if splitmods != '1':
-        etcdir = d.getVar('sysconfdir')
-        d.appendVar('FILES:' + metapkg, '%s/modules-load.d/ %s/modprobe.d/ %s/modules/' % (etcdir, etcdir, d.getVar("nonarch_base_libdir")))
+        d.appendVar('FILES:' + metapkg, '%s/ %s/ %s/modules/' % (modulesloaddir, modprobedir, d.getVar("nonarch_base_libdir")))
         d.appendVar('pkg_postinst:%s' % metapkg, postinst)
         d.prependVar('pkg_postrm:%s' % metapkg, postrm);
         return
@@ -189,7 +187,7 @@  python split_kernel_module_packages () {
     # avoid warnings. removedirs only raises an OSError if an empty
     # directory cannot be removed.
     dvar = d.getVar('PKGD')
-    for dir in ["%s/etc/modprobe.d" % (dvar), "%s/etc/modules-load.d" % (dvar), "%s/etc" % (dvar)]:
+    for dir in ["%s%s" % (dvar, modprobedir), "%s%s" % (dvar, modulesloaddir)]:
         if len(os.listdir(dir)) == 0:
             os.rmdir(dir)
 }
diff --git a/meta/conf/distro/include/init-manager-systemd.inc b/meta/conf/distro/include/init-manager-systemd.inc
index 7867d90028..fc13089764 100644
--- a/meta/conf/distro/include/init-manager-systemd.inc
+++ b/meta/conf/distro/include/init-manager-systemd.inc
@@ -5,3 +5,7 @@  VIRTUAL-RUNTIME_init_manager ??= "systemd"
 VIRTUAL-RUNTIME_initscripts ??= "systemd-compat-units"
 VIRTUAL-RUNTIME_login_manager ??= "shadow-base"
 VIRTUAL-RUNTIME_dev_manager ??= "systemd"
+
+# use autoload and probeconf distribution specific
+modulesloaddir ?= "${libdir}/modules-load.d"
+modprobedir ?= "${nonarch_base_libdir}/modprobe.d"