• Masahiro Yamada's avatar
    kbuild: create *.mod with full directory path and remove MODVERDIR · b7dca6dd
    Masahiro Yamada authored
    While descending directories, Kbuild produces objects for modules,
    but do not link final *.ko files; it is done in the modpost.
    To keep track of modules, Kbuild creates a *.mod file in $(MODVERDIR)
    for every module it is building. Some post-processing steps read the
    necessary information from *.mod files. This avoids descending into
    directories again. This mechanism was introduced in 2003 or so.
    Later, commit 551559e1 ("kbuild: implement modules.order") added
    modules.order. So, we can simply read it out to know all the modules
    with directory paths. This is easier than parsing the first line of
    *.mod files.
    $(MODVERDIR) has a flat directory structure, that is, *.mod files
    are named only with base names. This is based on the assumption that
    the module name is unique across the tree. This assumption is really
    Stephen Rothwell reported a race condition caused by a module name
    In parallel building, two different threads could write to the same
    $(MODVERDIR)/*.mod simultaneously.
    Non-unique module names are the source of all kind of troubles, hence
    commit 3a48a919 ("kbuild: check uniqueness of module names")
    introduced a new checker script.
    However, it is still fragile in the build system point of view because
    this race happens before scripts/modules-check.sh is invoked. If it
    happens again, the modpost will emit unclear error messages.
    To fix this issue completely, create *.mod with full directory path
    so that two threads never attempt to write to the same file.
    $(MODVERDIR) is no longer needed.
    Since modules with directory paths are listed in modules.order, Kbuild
    is still able to find *.mod files without additional descending.
    I also killed cmd_secanalysis; scripts/mod/sumversion.c computes MD4 hash
    it occurs not only in the modpost stage, but also during directory
    descending, where sumversion.c may parse stale *.mod files. It would emit
    'No such file or directory' warning when an object consisting a module is
    renamed, or when a single-obj module is turned into a multi-obj module or
    vice versa.
    Signed-off-by: 's avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Acked-by: 's avatarNicolas Pitre <nico@fluxnic.net>