diff mbox series

RFC: Handle hard module dependencies that are not symbol-based (r8169 + realtek)

Message ID 92546e9f-db6e-ccc0-147d-f3692984d620@gmail.com (mailing list archive)
State New, archived
Headers show
Series RFC: Handle hard module dependencies that are not symbol-based (r8169 + realtek) | expand

Commit Message

Heiner Kallweit April 1, 2020, 9:22 p.m. UTC
Mistakenly sent it to linux-module instead of linux-modules.

-------- Forwarded Message --------
Subject: RFC: Handle hard module dependencies that are not symbol-based (r8169 + realtek)
Date: Wed, 1 Apr 2020 23:20:20 +0200
From: Heiner Kallweit <hkallweit1@gmail.com>
To: Lucas De Marchi <lucas.demarchi@intel.com>, Jessica Yu <jeyu@kernel.org>
CC: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>, linux-module@vger.kernel.org, netdev@vger.kernel.org <netdev@vger.kernel.org>

Currently we have no way to express a hard dependency that is not
a symbol-based dependency (symbol defined in module A is used in
module B). Use case:
Network driver ND uses callbacks in the dedicated PHY driver DP
for the integrated PHY (namely read_page() and write_page() in
struct phy_driver). If DP can't be loaded (e.g. because ND is in
initramfs but DP is not), then phylib will use the generic
PHY driver GP. GP doesn't implement certain callbacks that are
needed by ND, therefore ND's probe has to bail out with an error
once it detects that DP is not loaded.
We have this problem with driver r8169 having such a dependency
on PHY driver realtek. Some distributions have tools for
configuring initramfs that consider hard dependencies based on
depmod output. Means so far somebody can add r8169.ko to initramfs,
and neither human being nor machine will have an idea that
realtek.ko needs to be added too.

Attached patch set (two patches for kmod, one for the kernel)
allows to express this hard dependency of ND from DP. depmod will
read this dependency information and treat it like a symbol-based
dependency. As a result tools e.g. populating initramfs can
consider the dependency and place DP in initramfs if ND is in
initramfs. On my system the patch set does the trick when
adding following line to r8169_main.c:
MODULE_HARDDEP("realtek");

I'm interested in your opinion on the patches, and whether you
maybe have a better idea how to solve the problem.

Heiner
From 290e7dee9f6043d677f08dc06e612e13ee0d2d83 Mon Sep 17 00:00:00 2001
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Tue, 31 Mar 2020 23:02:47 +0200
Subject: [PATCH 1/2] depmod: add helper mod_add_dep_unique

Create new helper mod_add_dep_unique(), next patch in this series will
also make use of it.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 tools/depmod.c | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/tools/depmod.c b/tools/depmod.c
index 875e314..5419d4d 100644
--- a/tools/depmod.c
+++ b/tools/depmod.c
@@ -907,23 +907,35 @@  static void mod_free(struct mod *mod)
 	free(mod);
 }
 
-static int mod_add_dependency(struct mod *mod, struct symbol *sym)
+static int mod_add_dep_unique(struct mod *mod, struct mod *dep)
 {
 	int err;
 
-	DBG("%s depends on %s %s\n", mod->path, sym->name,
-	    sym->owner != NULL ? sym->owner->path : "(unknown)");
-
-	if (sym->owner == NULL)
+	if (dep == NULL)
 		return 0;
 
-	err = array_append_unique(&mod->deps, sym->owner);
+	err = array_append_unique(&mod->deps, dep);
 	if (err == -EEXIST)
 		return 0;
 	if (err < 0)
 		return err;
 
-	sym->owner->users++;
+	dep->users++;
+
+	return 1;
+}
+
+static int mod_add_dependency(struct mod *mod, struct symbol *sym)
+{
+	int err;
+
+	DBG("%s depends on %s %s\n", mod->path, sym->name,
+	    sym->owner != NULL ? sym->owner->path : "(unknown)");
+
+	err = mod_add_dep_unique(mod, sym->owner);
+	if (err <= 0)
+		return err;
+
 	SHOW("%s needs \"%s\": %s\n", mod->path, sym->name, sym->owner->path);
 	return 0;
 }