Files
linux/kernel
Prarit Bhargava 360fbcf864 kernel/module.c: Only return -EEXIST for modules that have finished loading
[ Upstream commit 6e6de3dee5 ]

Microsoft HyperV disables the X86_FEATURE_SMCA bit on AMD systems, and
linux guests boot with repeated errors:

amd64_edac_mod: Unknown symbol amd_unregister_ecc_decoder (err -2)
amd64_edac_mod: Unknown symbol amd_register_ecc_decoder (err -2)
amd64_edac_mod: Unknown symbol amd_report_gart_errors (err -2)
amd64_edac_mod: Unknown symbol amd_unregister_ecc_decoder (err -2)
amd64_edac_mod: Unknown symbol amd_register_ecc_decoder (err -2)
amd64_edac_mod: Unknown symbol amd_report_gart_errors (err -2)

The warnings occur because the module code erroneously returns -EEXIST
for modules that have failed to load and are in the process of being
removed from the module list.

module amd64_edac_mod has a dependency on module edac_mce_amd.  Using
modules.dep, systemd will load edac_mce_amd for every request of
amd64_edac_mod.  When the edac_mce_amd module loads, the module has
state MODULE_STATE_UNFORMED and once the module load fails and the state
becomes MODULE_STATE_GOING.  Another request for edac_mce_amd module
executes and add_unformed_module() will erroneously return -EEXIST even
though the previous instance of edac_mce_amd has MODULE_STATE_GOING.
Upon receiving -EEXIST, systemd attempts to load amd64_edac_mod, which
fails because of unknown symbols from edac_mce_amd.

add_unformed_module() must wait to return for any case other than
MODULE_STATE_LIVE to prevent a race between multiple loads of
dependent modules.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Signed-off-by: Barret Rhoden <brho@google.com>
Cc: David Arcari <darcari@redhat.com>
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2023-05-15 14:09:01 +09:00
..
2023-05-15 14:00:42 +09:00
2017-09-02 07:07:53 +02:00
2016-01-22 18:04:28 -05:00
2016-04-04 09:46:47 -04:00
2023-05-15 13:34:34 +09:00
2018-05-01 16:49:34 +00:00
2017-10-12 22:31:24 +02:00
2015-11-23 09:44:58 +01:00
2023-05-12 16:39:07 +09:00
2016-02-16 13:04:58 -05:00
2016-03-01 20:36:56 +01:00
2023-05-12 16:43:35 +09:00
2018-05-09 09:50:20 +02:00
2018-04-03 11:15:30 -07:00
2016-09-22 20:00:36 -05:00
2018-05-09 19:39:28 -07:00
2018-05-09 19:39:28 -07:00