• Miguel Ojeda's avatar
    include/linux/module.h: copy __init/__exit attrs to init/cleanup_module · 85f8197a
    Miguel Ojeda authored
    commit a6e60d84 upstream.
    
    The upcoming GCC 9 release extends the -Wmissing-attributes warnings
    (enabled by -Wall) to C and aliases: it warns when particular function
    attributes are missing in the aliases but not in their target.
    
    In particular, it triggers for all the init/cleanup_module
    aliases in the kernel (defined by the module_init/exit macros),
    ending up being very noisy.
    
    These aliases point to the __init/__exit functions of a module,
    which are defined as __cold (among other attributes). However,
    the aliases themselves do not have the __cold attribute.
    
    Since the compiler behaves differently when compiling a __cold
    function as well as when compiling paths leading to calls
    to __cold functions, the warning is trying to point out
    the possibly-forgotten attribute in the alias.
    
    In order to keep the warning enabled, we decided to silence
    this case. Ideally, we would mark the aliases directly
    as __init/__exit. However, there are currently around 132 modules
    in the kernel which are missing __init/__exit in their init/cleanup
    functions (either because they are missing, or for other reasons,
    e.g. the functions being called from somewhere else); and
    a section mismatch is a hard error.
    
    A conservative alternative was to mark the aliases as __cold only.
    However, since we would like to eventually enforce __init/__exit
    to be always marked,  we chose to use the new __copy function
    attribute (introduced by GCC 9 as well to deal with this).
    With it, we copy the attributes used by the target functions
    into the aliases. This way, functions that were not marked
    as __init/__exit won't have their aliases marked either,
    and therefore there won't be a section mismatch.
    
    Note that the warning would go away marking either the extern
    declaration, the definition, or both. However, we only mark
    the definition of the alias, since we do not want callers
    (which only see the declaration) to be compiled as if the function
    was __cold (and therefore the paths leading to those calls
    would be assumed to be unlikely).
    
    Link: https://lore.kernel.org/lkml/20190123173707.GA16603@gmail.com/
    Link: https://lore.kernel.org/lkml/20190206175627.GA20399@gmail.com/Suggested-by: default avatarMartin Sebor <msebor@gcc.gnu.org>
    Acked-by: default avatarJessica Yu <jeyu@kernel.org>
    Signed-off-by: default avatarMiguel Ojeda <miguel.ojeda.sandonis@gmail.com>
    Signed-off-by: default avatarStefan Agner <stefan@agner.ch>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    85f8197a
Name
Last commit
Last update
Documentation Loading commit data...
arch Loading commit data...
block Loading commit data...
certs Loading commit data...
crypto Loading commit data...
drivers Loading commit data...
firmware Loading commit data...
fs Loading commit data...
include Loading commit data...
init Loading commit data...
ipc Loading commit data...
kernel Loading commit data...
lib Loading commit data...
mm Loading commit data...
net Loading commit data...
samples Loading commit data...
scripts Loading commit data...
security Loading commit data...
sound Loading commit data...
tools Loading commit data...
usr Loading commit data...
virt Loading commit data...
.cocciconfig Loading commit data...
.get_maintainer.ignore Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
Kbuild Loading commit data...
Kconfig Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README Loading commit data...
flymake.mk Loading commit data...