From nobody Tue Dec 16 14:38:30 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 25E90253B67; Tue, 27 May 2025 09:08:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748336903; cv=none; b=Tpl3Zs/NLffa/sy00t2sElHdliHRlhaWGeZIX5mPoLLzwjCyE/TZtlKxd2Y3tpNybJnwA3o4I9beh6//Gz7MM120dN7Sd96M1eET2QTnxngfFsmma5hRMAYfKdhI8XB2ClH9NzIUeWHOCMEP1KEgF57bc77ugaB5ouDPFyzlGns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1748336903; c=relaxed/simple; bh=mJpj1Azln1Y2J+zvehMHovrxqXkIUpTzjvkjnQsPP6k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aD4MHqDVaHhsKTbslRdu8ZhGYA/iQV27CO0P2KjjGfgFoVyahcKLMZdywyYFatAgBCec1lJN+qOqORwmWVWjXIjoZXvcHfQaYkeNyUKBQ4KLQVvp/l47j5+yjtmEoofcFGPWjvcYx4Rfsg+gxrJcYfXYkMtCgXtau4dHj+l2oGQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=irdlx2Un; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="irdlx2Un" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4EC1BC4CEEA; Tue, 27 May 2025 09:08:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1748336902; bh=mJpj1Azln1Y2J+zvehMHovrxqXkIUpTzjvkjnQsPP6k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=irdlx2UnZE6MS5lIcwfz2hcG3xBxTeq50M5gsJOiva6bQTRlG7pbqeb55tpAycUU2 TsKOnzg5ESzOCEXbeKy/A0OfgtK2dTcTyMgs7FugkfdNwfliKGJijfE9pcuxG47FKu SH1DIW97obcH5fdyWvj6QFtZ2xI32vfNRpWuZXM7O/2xVKwIPkSBG7WRTNcKGkxH1G +1tEaKltquYyRK6556DGd/QidUDIPb7DhCcU04PMkbamcrEGozrwOJ8V9ViyfAKSsQ 4ZnmpN0MhAF5B7O2uaBvb05yOeiZL6I/+d+BrfkoyyYmsbAwAEWwSKV508KNzik3mu vp4oaynHUk1Iw== From: Alexey Gladkov To: Petr Pavlu , Luis Chamberlain , Sami Tolvanen , Daniel Gomez , Masahiro Yamada , Nathan Chancellor , Nicolas Schier Cc: linux-kernel@vger.kernel.org, linux-modules@vger.kernel.org, linux-kbuild@vger.kernel.org, Alexey Gladkov Subject: [PATCH v3 4/6] modpost: Create modalias for builtin modules Date: Tue, 27 May 2025 11:07:58 +0200 Message-ID: X-Mailer: git-send-email 2.49.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" For some modules, modalias is generated using the modpost utility and the section is added to the module file. When a module is added inside vmlinux, modpost does not generate modalias for such modules and the information is lost. As a result kmod (which uses modules.builtin.modinfo in userspace) cannot determine that modalias is handled by a builtin kernel module. $ cat /sys/devices/pci0000:00/0000:00:14.0/modalias pci:v00008086d0000A36Dsv00001043sd00008694bc0Csc03i30 $ modinfo xhci_pci name: xhci_pci filename: (builtin) license: GPL file: drivers/usb/host/xhci-pci description: xHCI PCI Host Controller Driver Missing modalias "pci:v*d*sv*sd*bc0Csc03i30*" which will be generated by modpost if the module is built separately. To fix this it is necessary to generate the same modalias for vmlinux as for the individual modules. Fortunately '.vmlinux.export.o' is already generated from which '.modinfo' can be extracted in the same way as for vmlinux.o. Signed-off-by: Masahiro Yamada Signed-off-by: Alexey Gladkov Reviewed-by: Petr Pavlu --- include/linux/module.h | 4 ---- scripts/mod/file2alias.c | 16 ++++++++++++++++ scripts/mod/modpost.c | 13 ++++++++++++- scripts/mod/modpost.h | 2 ++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/include/linux/module.h b/include/linux/module.h index e7506684069d..0be9b0f1660e 100644 --- a/include/linux/module.h +++ b/include/linux/module.h @@ -259,14 +259,10 @@ struct module_kobject *lookup_or_create_module_kobjec= t(const char *name); __PASTE(type, \ __PASTE(__, name))))))) =20 -#ifdef MODULE /* Creates an alias so file2alias.c can find device table. */ #define MODULE_DEVICE_TABLE(type, name) \ extern typeof(name) __mod_device_table(type, name) \ __attribute__ ((unused, alias(__stringify(name)))) -#else /* !MODULE */ -#define MODULE_DEVICE_TABLE(type, name) -#endif =20 /* Version of form [:][-]. * Or for CVS/RCS ID version, everything but the number is stripped. diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index dff1799a4c79..d42f2c742fd6 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -1527,5 +1527,21 @@ void handle_moddevtable(struct module *mod, struct e= lf_info *info, } } =20 + if (mod->is_vmlinux) { + struct module_alias *alias; + + /* + * If this is vmlinux, record the name of the builtin module. + * Traverse the linked list in the reverse order, and set the + * builtin_modname unless it has already been set in the + * previous call. + */ + list_for_each_entry_reverse(alias, &mod->aliases, node) { + if (alias->builtin_modname) + break; + alias->builtin_modname =3D xstrndup(modname, modnamelen); + } + } + free(zeros); } diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index be89921d60b6..c7c601c6f82d 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -2021,11 +2021,22 @@ static void write_if_changed(struct buffer *b, cons= t char *fname) static void write_vmlinux_export_c_file(struct module *mod) { struct buffer buf =3D { }; + struct module_alias *alias, *next; =20 buf_printf(&buf, - "#include \n"); + "#include \n" + "#include \n"); =20 add_exported_symbols(&buf, mod); + + list_for_each_entry_safe(alias, next, &mod->aliases, node) { + buf_printf(&buf, "MODULE_ALIAS_MODNAME(\"%s\", \"%s\");\n", + alias->builtin_modname, alias->str); + list_del(&alias->node); + free(alias->builtin_modname); + free(alias); + } + write_if_changed(&buf, ".vmlinux.export.c"); free(buf.p); } diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 9133e4c3803f..2aecb8f25c87 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -99,10 +99,12 @@ buf_write(struct buffer *buf, const char *s, int len); * struct module_alias - auto-generated MODULE_ALIAS() * * @node: linked to module::aliases + * @modname: name of the builtin module (only for vmlinux) * @str: a string for MODULE_ALIAS() */ struct module_alias { struct list_head node; + char *builtin_modname; char str[]; }; =20 --=20 2.49.0