I tested this on a system that had the script in patch#0 fail 100% of the time. With this patch, I haven't seen any failure in a few hours. Haven't seen any unexpected side effect either. Tested-By: Nicolas Morey-Chaisemartin <nmoreychaisemartin@xxxxxxxx> On 12/3/20 2:51 PM, Jessica Yu wrote: > Apparently there has been a longstanding race between udev/systemd and > the module loader. Currently, the module loader sends a uevent right > after sysfs initialization, but before the module calls its init > function. However, some udev rules expect that the module has > initialized already upon receiving the uevent. > > This race has been triggered recently (see link in references) in some > systemd mount unit files. For instance, the configfs module creates the > /sys/kernel/config mount point in its init function, however the module > loader issues the uevent before this happens. sys-kernel-config.mount > expects to be able to mount /sys/kernel/config upon receipt of the > module loading uevent, but if the configfs module has not called its > init function yet, then this directory will not exist and the mount unit > fails. A similar situation exists for sys-fs-fuse-connections.mount, as > the fuse sysfs mount point is created during the fuse module's init > function. If udev is faster than module initialization then the mount > unit would fail in a similar fashion. > > To fix this race, delay the module KOBJ_ADD uevent until after the > module has finished calling its init routine. > > References: https://github.com/systemd/systemd/issues/17586 > Signed-off-by: Jessica Yu <jeyu@xxxxxxxxxx> > --- > kernel/module.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/kernel/module.c b/kernel/module.c > index a40ec708f8f2..e1dd0df57244 100644 > --- a/kernel/module.c > +++ b/kernel/module.c > @@ -1897,7 +1897,6 @@ static int mod_sysfs_init(struct module *mod) > if (err) > mod_kobject_put(mod); > > - /* delay uevent until full sysfs population */ > out: > return err; > } > @@ -1934,7 +1933,6 @@ static int mod_sysfs_setup(struct module *mod, > add_sect_attrs(mod, info); > add_notes_attrs(mod, info); > > - kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); > return 0; > > out_unreg_modinfo_attrs: > @@ -3656,6 +3654,9 @@ static noinline int do_init_module(struct module *mod) > blocking_notifier_call_chain(&module_notify_list, > MODULE_STATE_LIVE, mod); > > + /* Delay uevent until module has finished its init routine */ > + kobject_uevent(&mod->mkobj.kobj, KOBJ_ADD); > + > /* > * We need to finish all async code before the module init sequence > * is done. This has potential to deadlock. For example, a newly > _______________________________________________ systemd-devel mailing list systemd-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/systemd-devel