18 Oct, 2019

3 commits

  • The introduction of Symbol Namespaces changed the naming schema of the
    __ksymtab entries from __kysmtab__symbol to __ksymtab_NAMESPACE.symbol.

    That caused some breakages in tools that depend on the name layout in
    either the binaries(vmlinux,*.ko) or in System.map. E.g. kmod's depmod
    would not be able to read System.map without a patch to support symbol
    namespaces. A warning reported by depmod for namespaced symbols would
    look like

    depmod: WARNING: [...]/uas.ko needs unknown symbol usb_stor_adjust_quirks

    In order to address this issue, revert to the original naming scheme and
    rather read the __kstrtabns_ entries and their corresponding
    values from __ksymtab_strings to update the namespace values for
    symbols. After having read all symbols and handled them in
    handle_modversions(), the symbols are created. In a second pass, read
    the __kstrtabns_ entries and update the namespaces accordingly.

    Fixes: 8651ec01daed ("module: add support for symbol namespaces.")
    Reported-by: Stefan Wahren
    Suggested-by: Masahiro Yamada
    Acked-by: Will Deacon
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Masahiro Yamada
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     
  • Setting the symbol namespace of a symbol within sym_add_exported feels
    displaced and lead to issues in the current implementation of symbol
    namespaces. This patch makes updating the namespace an explicit call to
    decouple it from adding a symbol to the export list.

    Acked-by: Will Deacon
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Masahiro Yamada
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     
  • Let the function 'sym_update_namespace' take care of updating the
    namespace for a symbol. While this currently only replaces one single
    location where namespaces are updated, in a following patch, this
    function will get more call sites.

    The function signature is intentionally close to sym_update_crc and
    taking the name by char* seems like unnecessary work as the symbol has
    to be looked up again. In a later patch of this series, this concern
    will be addressed.

    This function ensures that symbol::namespace is either NULL or has a
    valid non-empty value. Previously, the empty string was considered 'no
    namespace' as well and this lead to confusion.

    Acked-by: Will Deacon
    Reviewed-by: Greg Kroah-Hartman
    Reviewed-by: Masahiro Yamada
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     

12 Oct, 2019

1 commit

  • Pull module fixes from Jessica Yu:
    "Code cleanups and kbuild/namespace related fixups from Masahiro.

    Most importantly, it fixes a namespace-related modpost issue for
    external module builds

    - Fix broken external module builds due to a modpost bug in
    read_dump(), where the namespace was not being strdup'd and
    sym->namespace would be set to bogus data.

    - Various namespace-related kbuild fixes and cleanups thanks to
    Masahiro Yamada"

    * tag 'modules-for-v5.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
    doc: move namespaces.rst from kbuild/ to core-api/
    nsdeps: make generated patches independent of locale
    nsdeps: fix hashbang of scripts/nsdeps
    kbuild: fix build error of 'make nsdeps' in clean tree
    module: rename __kstrtab_ns_* to __kstrtabns_* to avoid symbol conflict
    modpost: fix broken sym->namespace for external module builds
    module: swap the order of symbol.namespace
    scripts: add_namespace: Fix coccicheck failed

    Linus Torvalds
     

08 Oct, 2019

2 commits

  • Currently, external module builds produce tons of false-positives:

    WARNING: module uses symbol from namespace , but does not import it.

    Here, the part shows a random string.

    When you build external modules, the symbol info of vmlinux and
    in-kernel modules are read from $(objtree)/Module.symvers, but
    read_dump() is buggy in multiple ways:

    [1] When the modpost is run for vmlinux and in-kernel modules,
    sym_extract_namespace() allocates memory for the namespace. On the
    other hand, read_dump() does not, then sym->namespace will point to
    somewhere in the line buffer of get_next_line(). The data in the
    buffer will be replaced soon, and sym->namespace will end up with
    pointing to unrelated data. As a result, check_exports() will show
    random strings in the warning messages.

    [2] When there is no namespace, sym_extract_namespace() returns NULL.
    On the other hand, read_dump() sets namespace to an empty string "".
    (but, it will be later replaced with unrelated data due to bug [1].)
    The check_exports() shows a warning unless exp->namespace is NULL,
    so every symbol read from read_dump() emits the warning, which is
    mostly false positive.

    To address [1], sym_add_exported() calls strdup() for s->namespace.
    The namespace from sym_extract_namespace() must be freed to avoid
    memory leak.

    For [2], I changed the if-conditional in check_exports().

    This commit also fixes sym_add_exported() to set s->namespace correctly
    when the symbol is preloaded.

    Reviewed-by: Matthias Maennich
    Signed-off-by: Masahiro Yamada
    Signed-off-by: Jessica Yu

    Masahiro Yamada
     
  • Currently, EXPORT_SYMBOL_NS(_GPL) constructs the kernel symbol as
    follows:

    __ksymtab_SYMBOL.NAMESPACE

    The sym_extract_namespace() in modpost allocates memory for the part
    SYMBOL.NAMESPACE when '.' is contained. One problem is that the pointer
    returned by strdup() is lost because the symbol name will be copied to
    malloc'ed memory by alloc_symbol(). No one will keep track of the
    pointer of strdup'ed memory.

    sym->namespace still points to the NAMESPACE part. So, you can free it
    with complicated code like this:

    free(sym->namespace - strlen(sym->name) - 1);

    It complicates memory free.

    To fix it elegantly, I swapped the order of the symbol and the
    namespace as follows:

    __ksymtab_NAMESPACE.SYMBOL

    then, simplified sym_extract_namespace() so that it allocates memory
    only for the NAMESPACE part.

    I prefer this order because it is intuitive and also matches to major
    languages. For example, NAMESPACE::NAME in C++, MODULE.NAME in Python.

    Reviewed-by: Matthias Maennich
    Signed-off-by: Masahiro Yamada
    Signed-off-by: Jessica Yu

    Masahiro Yamada
     

01 Oct, 2019

1 commit

  • Johannes Berg reports lots of modpost warnings on ARCH=um builds:

    WARNING: "rename" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "lseek" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "ftruncate64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "getuid" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "lseek64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "unlink" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "pwrite64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "close" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "opendir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "pread64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "syscall" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "readdir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "readdir64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "futimes" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__lxstat" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "write" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "closedir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__xstat" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "fsync" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__lxstat64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__fxstat64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "telldir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "printf" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "readlink" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__sprintf_chk" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "link" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "rmdir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "fdatasync" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "truncate" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "statfs" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__errno_location" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__xmknod" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "open64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "truncate64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "open" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "read" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "chown" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "chmod" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "utime" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "fchmod" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "seekdir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "ioctl" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "dup2" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "statfs64" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "utimes" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "mkdir" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "fchown" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__guard" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "symlink" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "access" [vmlinux] is a static EXPORT_SYMBOL
    WARNING: "__stack_smash_handler" [vmlinux] is a static EXPORT_SYMBOL

    When you run "make", the modpost is run twice; before linking vmlinux,
    and before building modules. All the warnings above are from the second
    modpost.

    The offending symbols are defined not in vmlinux, but in the C library.
    The first modpost is run against the relocatable vmlinux.o, and those
    warnings are nicely suppressed because the SH_UNDEF entries from the
    symbol table clear the ->is_static flag.

    The second modpost is run against the executable vmlinux (+ modules),
    where those symbols have been resolved, but the definitions do not
    exist.

    This commit fixes it in a straightforward way; suppress the static
    EXPORT_SYMBOL warnings from "vmlinux".

    Without this commit, we see valid warnings twice anyway. For example,
    ARCH=arm64 defconfig shows the following warning twice:

    WARNING: "HYPERVISOR_platform_op" [vmlinux] is a static EXPORT_SYMBOL_GPL

    So, it is reasonable to suppress the second one.

    Fixes: 15bfc2348d54 ("modpost: check for static EXPORT_SYMBOL* functions")
    Reported-by: Johannes Berg
    Signed-off-by: Masahiro Yamada
    Tested-by: Johannes Berg
    Tested-by: Denis Efremov

    Masahiro Yamada
     

23 Sep, 2019

1 commit

  • Pull modules updates from Jessica Yu:
    "The main bulk of this pull request introduces a new exported symbol
    namespaces feature. The number of exported symbols is increasingly
    growing with each release (we're at about 31k exports as of 5.3-rc7)
    and we currently have no way of visualizing how these symbols are
    "clustered" or making sense of this huge export surface.

    Namespacing exported symbols allows kernel developers to more
    explicitly partition and categorize exported symbols, as well as more
    easily limiting the availability of namespaced symbols to other parts
    of the kernel. For starters, we have introduced the USB_STORAGE
    namespace to demonstrate the API's usage. I have briefly summarized
    the feature and its main motivations in the tag below.

    Summary:

    - Introduce exported symbol namespaces.

    This new feature allows subsystem maintainers to partition and
    categorize their exported symbols into explicit namespaces. Module
    authors are now required to import the namespaces they need.

    Some of the main motivations of this feature include: allowing
    kernel developers to better manage the export surface, allow
    subsystem maintainers to explicitly state that usage of some
    exported symbols should only be limited to certain users (think:
    inter-module or inter-driver symbols, debugging symbols, etc), as
    well as more easily limiting the availability of namespaced symbols
    to other parts of the kernel.

    With the module import requirement, it is also easier to spot the
    misuse of exported symbols during patch review.

    Two new macros are introduced: EXPORT_SYMBOL_NS() and
    EXPORT_SYMBOL_NS_GPL(). The API is thoroughly documented in
    Documentation/kbuild/namespaces.rst.

    - Some small code and kbuild cleanups here and there"

    * tag 'modules-for-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
    module: Remove leftover '#undef' from export header
    module: remove unneeded casts in cmp_name()
    module: move CONFIG_UNUSED_SYMBOLS to the sub-menu of MODULES
    module: remove redundant 'depends on MODULES'
    module: Fix link failure due to invalid relocation on namespace offset
    usb-storage: export symbols in USB_STORAGE namespace
    usb-storage: remove single-use define for debugging
    docs: Add documentation for Symbol Namespaces
    scripts: Coccinelle script for namespace dependencies.
    modpost: add support for generating namespace dependencies
    export: allow definition default namespaces in Makefiles or sources
    module: add config option MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
    modpost: add support for symbol namespaces
    module: add support for symbol namespaces.
    export: explicitly align struct kernel_symbol
    module: support reading multiple values per modinfo tag

    Linus Torvalds
     

14 Sep, 2019

2 commits


10 Sep, 2019

2 commits

  • This patch adds an option to modpost to generate a .ns_deps file
    per module, containing the namespace dependencies for that module.

    E.g. if the linked module my-module.ko would depend on the symbol
    myfunc.MY_NS in the namespace MY_NS, the my-module.ns_deps file created
    by modpost would contain the entry MY_NS to express the namespace
    dependency of my-module imposed by using the symbol myfunc.

    These files can subsequently be used by static analysis tools (like
    coccinelle scripts) to address issues with missing namespace imports. A
    later patch of this series will introduce such a script 'nsdeps' and a
    corresponding make target to automatically add missing
    MODULE_IMPORT_NS() definitions to the module's sources. For that it uses
    the information provided in the generated .ns_deps files.

    Co-developed-by: Martijn Coenen
    Signed-off-by: Martijn Coenen
    Reviewed-by: Greg Kroah-Hartman
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     
  • Add support for symbols that are exported into namespaces. For that,
    extract any namespace suffix from the symbol name. In addition, emit a
    warning whenever a module refers to an exported symbol without
    explicitly importing the namespace that it is defined in. This patch
    consistently adds the namespace suffix to symbol names exported into
    Module.symvers.

    Example warning emitted by modpost in case of the above violation:

    WARNING: module ums-usbat uses symbol usb_stor_resume from namespace
    USB_STORAGE, but does not import it.

    Co-developed-by: Martijn Coenen
    Signed-off-by: Martijn Coenen
    Reviewed-by: Joel Fernandes (Google)
    Reviewed-by: Greg Kroah-Hartman
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     

04 Sep, 2019

2 commits

  • Add NOFAIL check for the strndup call, because the function
    allocates memory and can return NULL. All calls to strdup in
    modpost are checked with NOFAIL.

    Signed-off-by: Denis Efremov
    Signed-off-by: Masahiro Yamada

    Denis Efremov
     
  • Since guid_t is the recommended data type for UUIDs in
    kernel (and I guess uuid_le is meant to be ultimately
    replaced with it), it should be made available here as
    well.

    Signed-off-by: Heikki Krogerus
    Signed-off-by: Masahiro Yamada

    Heikki Krogerus
     

14 Aug, 2019

1 commit

  • This patch adds a check to warn about static EXPORT_SYMBOL* functions
    during the modpost. In most of the cases, a static symbol marked for
    exporting is an odd combination that should be fixed either by deleting
    the exporting mark or by removing the static attribute and adding the
    appropriate declaration to headers.

    This check could help to detect the following problems:
    1. 550113d4e9f5 ("i2c: add newly exported functions to the header, too")
    2. 54638c6eaf44 ("net: phy: make exported variables non-static")
    3. 98ef2046f28b ("mm: remove the exporting of totalram_pages")
    4. 73df167c819e ("s390/zcrypt: remove the exporting of ap_query_configuration")
    5. a57caf8c527f ("sunrpc/cache: remove the exporting of cache_seq_next")
    6. e4e4730698c9 ("crypto: skcipher - remove the exporting of skcipher_walk_next")
    7. 14b4c48bb1ce ("gve: Remove the exporting of gve_probe")
    8. 9b79ee9773a8 ("scsi: libsas: remove the exporting of sas_wait_eh")
    9. ...

    The build time impact is very limited and is almost at the unnoticeable
    level (< 1 sec).

    Acked-by: Emil Velikov
    Signed-off-by: Denis Efremov
    Signed-off-by: Masahiro Yamada

    Denis Efremov
     

18 Jul, 2019

2 commits

  • The current format of *.mod is like this:

    line 1: directory path to the .ko file
    line 2: a list of objects linked into this module
    line 3: unresolved symbols (only when CONFIG_TRIM_UNUSED_KSYMS=y)

    Now that *.mod and *.ko are created in the same directory, the line 1
    provides no valuable information. It can be derived by replacing the
    extension .mod with .ko. In fact, nobody uses the first line any more.

    Cut down the first line.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • 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 551559e13af1 ("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
    fragile.

    Stephen Rothwell reported a race condition caused by a module name
    conflict:

    https://lkml.org/lkml/2019/5/13/991

    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 3a48a91901c5 ("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
    for modules with MODULE_VERSION(). When CONFIG_DEBUG_SECTION_MISMATCH=y,
    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: Masahiro Yamada
    Acked-by: Nicolas Pitre

    Masahiro Yamada
     

28 Mar, 2019

1 commit

  • Fix commit 56067812d5b0 ("kbuild: modversions: add infrastructure for
    emitting relative CRCs") where CRCs are interpreted in host byte order
    rather than proper kernel byte order. The bug is conditional on
    CONFIG_MODULE_REL_CRCS.

    For example, when loading a BE module into a BE kernel compiled with a LE
    system, the error "disagrees about version of symbol module_layout" is
    produced. A message such as "Found checksum D7FA6856 vs module 5668FAD7"
    will be given with debug enabled, which indicates an obvious endian
    problem within __kcrctab within the kernel image.

    The general solution is to use the macro TO_NATIVE, as is done in
    similar cases throughout modpost.c. With this correction it has been
    verified that a BE kernel compiled with a LE system accepts BE modules.

    This change has also been verified with a LE kernel compiled with a LE
    system, in which case TO_NATIVE returns its value unmodified since the
    byte orders match. This is by far the common case.

    Fixes: 56067812d5b0 ("kbuild: modversions: add infrastructure for emitting relative CRCs")
    Signed-off-by: Fredrik Noring
    Cc: stable@vger.kernel.org
    Signed-off-by: Masahiro Yamada

    Fredrik Noring
     

14 Mar, 2019

1 commit

  • Unless CONFIG_DEBUG_SECTION_MISMATCH is enabled, modpost only shows
    the number of section mismatches.

    If you want to know the symbols causing the issue, you need to rebuild
    with CONFIG_DEBUG_SECTION_MISMATCH. It is tedious.

    I think it is fine to show annoying warning when a new section mismatch
    comes in.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

11 Mar, 2019

1 commit

  • Pull x86 platform driver updates from Darren Hart:

    - use MODULE_DEVICE_TABLE across several wmi drivers, keeping
    wmi_device_id and MODULE_ALIAS() declarations in sync

    - add several Ideapad models to the no_hw_rfkill list

    - add support for new Mellanox platforms, including new fan and LED
    functionality

    - address Dell keyboard backlight change event and power button release
    issues

    - update dell_rbu to use appropriate memory allocation mechanisms

    - several small fixes and Ice Lake support for intel_pmc_core

    - fix a suspend regression for Cherry Trail based devices in
    intel_int0002_vgpio

    - a few other routine fixes

    * tag 'platform-drivers-x86-v5.1-1' of git://git.infradead.org/linux-platform-drivers-x86: (50 commits)
    MAINTAINERS: Include mlxreg.h in Mellanox Platform Driver files
    platform/x86: ideapad-laptop: Add S130-14IGM to no_hw_rfkill list
    platform/x86: mlx-platform: Fix access mode for fan_dir attribute
    platform/x86: mlx-platform: Add UID LED for the next generation systems
    platform/x86: mlx-platform: Add extra CPLD for next generation systems
    platform/x86: wmi-bmof: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: intel-wmi-thunderbolt: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: huawei-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: dell-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: dell-wmi-descriptor: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: dell-smbios-wmi: use MODULE_DEVICE_TABLE() instead of MODULE_ALIAS()
    platform/x86: wmi: add WMI support to MODULE_DEVICE_TABLE()
    platform/x86: wmi: move struct wmi_device_id to mod_devicetable.h
    modpost: file2alias: define size of alias
    platform/x86: touchscreen_dmi: Add info for the CHUWI Hi10 Air tablet
    platform/x86: ideapad-laptop: Add Ideapad 530S-14ARR to no_hw_rfkill list
    platform/x86: ideapad-laptop: Add Yoga C930 to no_hw_rfkill_list
    platform/x86: intel_pmc_core: Quirk to ignore XTAL shutdown
    platform/x86: intel_pmc_core: Add Package cstates residency info
    platform/x86: intel_pmc_core: Add ICL platform support
    ...

    Linus Torvalds
     

08 Mar, 2019

2 commits

  • The kernel provides the macro MODULE_DEVICE_TABLE() where driver authors
    can specify their device type and their array of device_ids and thereby
    trigger the generation of the appropriate MODULE_ALIAS() output. This is
    opposed to having to specify one MODULE_ALIAS() for each device. The WMI
    device type is currently not supported.

    While using MODULE_DEVICE_TABLE() does increase the complexity as well
    as spreading out the implementation across the kernel, it does come with
    some benefits too;
    * It makes different drivers look more similar; if you can specify the
    array of device_ids any device type specific input to MODULE_ALIAS()
    will automatically be generated for you.
    * It helps each driver avoid keeping multiple versions of the same
    information in sync. That is, both the array of device_ids and the
    potential multitude of MODULE_ALIAS()'s.

    Add WMI support to MODULE_DEVICE_TABLE() by adding info about struct
    wmi_device_id in devicetable-offsets.c and add a WMI entry point in
    file2alias.c.

    The type argument for MODULE_DEVICE_TABLE(type, name) is wmi.

    Suggested-by: Pali Rohár
    Signed-off-by: Mattias Jacobsson
    Acked-by: Masahiro Yamada
    Signed-off-by: Darren Hart (VMware)

    Mattias Jacobsson
     
  • In preparation for adding WMI support to MODULE_DEVICE_TABLE() move the
    definition of struct wmi_device_id to mod_devicetable.h and inline
    guid_string in the struct.

    Changing guid_string to an inline char array changes the loop conditions
    when looping over an array of struct wmi_device_id. Therefore update
    wmi_dev_match()'s loop to check for an empty guid_string instead of a
    NULL pointer.

    Signed-off-by: Mattias Jacobsson
    [dvhart: Move UUID_STRING_LEN define to this patch]
    Signed-off-by: Darren Hart (VMware)

    Mattias Jacobsson
     

07 Mar, 2019

1 commit

  • The size of the variable alias provided to do_entry functions are
    currently not readily available. Thus hindering do_entry functions to
    perform bounds checking.

    Define the macro ALIAS_SIZE containing the size of the variable alias.

    Signed-off-by: Mattias Jacobsson
    Acked-by: Masahiro Yamada
    Signed-off-by: Darren Hart (VMware)

    Mattias Jacobsson
     

01 Feb, 2019

1 commit

  • Introduce a generic TEE bus driver concept for TEE based kernel drivers
    which would like to communicate with TEE based devices/services. Also
    add support in module device table for these new TEE based devices.

    In this TEE bus concept, devices/services are identified via Universally
    Unique Identifier (UUID) and drivers register a table of device UUIDs
    which they can support.

    So this TEE bus framework registers following apis:
    - match(): Iterates over the driver UUID table to find a corresponding
    match for device UUID. If a match is found, then this particular device
    is probed via corresponding probe api registered by the driver. This
    process happens whenever a device or a driver is registered with TEE
    bus.
    - uevent(): Notifies user-space (udev) whenever a new device is registered
    on this bus for auto-loading of modularized drivers.

    Also this framework allows for device enumeration to be specific to
    corresponding TEE implementation like OP-TEE etc.

    Signed-off-by: Sumit Garg
    Reviewed-by: Daniel Thompson
    Reviewed-by: Bhupesh Sharma
    Signed-off-by: Jens Wiklander

    Sumit Garg
     

09 Jan, 2019

1 commit

  • Commit

    4cd24de3a098 ("x86/retpoline: Make CONFIG_RETPOLINE depend on compiler support")

    replaced the RETPOLINE define with CONFIG_RETPOLINE checks. Remove the
    remaining pieces.

    [ bp: Massage commit message. ]

    Fixes: 4cd24de3a098 ("x86/retpoline: Make CONFIG_RETPOLINE depend on compiler support")
    Signed-off-by: WANG Chao
    Signed-off-by: Borislav Petkov
    Reviewed-by: Zhenzhong Duan
    Reviewed-by: Masahiro Yamada
    Cc: "H. Peter Anvin"
    Cc: Andi Kleen
    Cc: Andrew Morton
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Daniel Borkmann
    Cc: David Woodhouse
    Cc: Geert Uytterhoeven
    Cc: Jessica Yu
    Cc: Jiri Kosina
    Cc: Kees Cook
    Cc: Konrad Rzeszutek Wilk
    Cc: Luc Van Oostenryck
    Cc: Michal Marek
    Cc: Miguel Ojeda
    Cc: Peter Zijlstra
    Cc: Tim Chen
    Cc: Vasily Gorbik
    Cc: linux-kbuild@vger.kernel.org
    Cc: srinivas.eeda@oracle.com
    Cc: stable
    Cc: x86-ml
    Link: https://lkml.kernel.org/r/20181210163725.95977-1-chao.wang@ucloud.cn

    WANG Chao
     

01 Dec, 2018

7 commits

  • I am eagar to build under the scripts/ directory only with $(HOSTCC),
    but scripts/mod/ highly depends on the $(CC) and target arch headers.
    That it why the 'scripts' target must depend on 'asm-generic',
    'gcc-plugins', and $(autoksyms_h).

    Move it to the 'prepare0' stage. I know this is a cheesy workaround,
    but better than the current situation.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • This will fit better in check_exports() than add_versions().

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • Probably, this is just a matter of the order of error/warning
    messages. Merge the two for-loops.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • You do not need to iterate over all modules for resetting ->seen flag
    because add_depends() is only interested in modules that export symbols
    referenced from the given 'mod'.

    This also avoids shadowing the 'modules' parameter of add_depends().

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • Use specific prototype instead of an opaque pointer so that the
    compiler can catch function prototype mismatch.

    Signed-off-by: Masahiro Yamada
    Reviewed-by: Mathieu Malaterre

    Masahiro Yamada
     
  • Commit e49ce14150c6 ("modpost: use linker section to generate table.")
    was not so cool as we had expected first; it ended up with ugly section
    hacks when commit dd2a3acaecd7 ("mod/file2alias: make modpost compile
    on darwin again") came in.

    Given a certain degree of unknowledge about the link stage of host
    programs, I really want to see simple, stupid table lookup so that
    this works in the same way regardless of the underlying executable
    format.

    Signed-off-by: Masahiro Yamada
    Acked-by: Mathieu Malaterre

    Masahiro Yamada
     
  • During development of a serial console driver with a gcc 8.2.0
    toolchain for RISC-V, the following modpost warning appeared:

    ----
    WARNING: vmlinux.o(.data+0x19b10): Section mismatch in reference from the variable .LANCHOR1 to the function .init.text:sifive_serial_console_setup()
    The variable .LANCHOR1 references
    the function __init sifive_serial_console_setup()
    If the reference is valid then annotate the
    variable with __init* or __refdata (see linux/init.h) or name the variable:
    *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console
    ----

    ".LANCHOR1" is an ELF local symbol, automatically created by gcc's section
    anchor generation code:

    https://gcc.gnu.org/onlinedocs/gccint/Anchored-Addresses.html

    https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/varasm.c;h=cd9591a45617464946dcf9a126dde277d9de9804;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l7473

    This was verified by compiling the kernel with -fno-section-anchors
    and observing that the ".LANCHOR1" ELF local symbol disappeared, and
    modpost no longer warned about the section mismatch. The serial
    driver code idiom triggering the warning is standard Linux serial
    driver practice that has a specific whitelist inclusion in modpost.c.

    I'm neither a modpost nor an ELF expert, but naively, it doesn't seem
    useful for modpost to report section mismatch warnings caused by ELF
    local symbols by default. Local symbols have compiler-generated
    names, and thus bypass modpost's whitelisting algorithm, which relies
    on the presence of a non-autogenerated symbol name. This increases
    the likelihood that false positive warnings will be generated (as in
    the above case).

    Thus, disable section mismatch reporting on ELF local symbols. The
    rationale here is similar to that of commit 2e3a10a1551d ("ARM: avoid
    ARM binutils leaking ELF local symbols") and of similar code already
    present in modpost.c:

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/scripts/mod/modpost.c?h=v4.19-rc4&id=7876320f88802b22d4e2daf7eb027dd14175a0f8#n1256

    This third version of the patch implements a suggestion from Masahiro
    Yamada to restructure the code as an
    additional pattern matching step inside secref_whitelist(), and
    further improves the patch description.

    Signed-off-by: Paul Walmsley
    Signed-off-by: Paul Walmsley
    Acked-by: Sam Ravnborg
    Signed-off-by: Masahiro Yamada

    Paul Walmsley
     

21 Nov, 2018

2 commits

  • Drop modpost command line switches that are no longer used by
    makefile.modpost, upon request from Sam Ravnborg ,
    who wrote:

    modpost is not supposed to be used outside the kernel build. [...]
    I checked if there were any options supported by modpost that
    was not configurable in Makefile.modpost.
    And I could see that the -M and -K options in getopt() were leftovers.
    The code that used these option was dropped in:
    commit a8773769d1a1 ("Kbuild: clear marker out of modpost")

    Could you add a patch that delete these on top of what you already have.

    https://lore.kernel.org/lkml/20181020140835.GA3351@ravnborg.org/

    Suggested-by: Sam Ravnborg
    Signed-off-by: Paul Walmsley
    Signed-off-by: Paul Walmsley
    Acked-by: Sam Ravnborg
    Signed-off-by: Masahiro Yamada

    Paul Walmsley
     
  • If an ARM mapping symbol shares an address with a valid symbol,
    find_elf_symbol can currently return the mapping symbol instead, as the
    symbol is not validated. This can result in confusing warnings:

    WARNING: vmlinux.o(.text+0x18f4028): Section mismatch in reference
    from the function set_reset_devices() to the variable .init.text:$x.0

    This change adds a call to is_valid_name to find_elf_symbol, similarly
    to how it's already used in find_elf_symbol2.

    Signed-off-by: Sami Tolvanen
    Signed-off-by: Masahiro Yamada

    Sami Tolvanen
     

29 Oct, 2018

1 commit

  • Pull Kbuild updates from Masahiro Yamada:

    - optimize kallsyms slightly

    - remove check for old CFLAGS usage

    - add some compiler flags unconditionally instead of evaluating
    $(call cc-option,...)

    - fix variable shadowing in host tools

    - refactor scripts/mkmakefile

    - refactor various makefiles

    * tag 'kbuild-v4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild:
    modpost: Create macro to avoid variable shadowing
    ASN.1: Remove unnecessary shadowed local variable
    kbuild: use 'else ifeq' for checksrc to improve readability
    kbuild: remove unneeded link_multi_deps
    kbuild: add -Wno-unused-but-set-variable flag unconditionally
    kbuild: add -Wdeclaration-after-statement flag unconditionally
    kbuild: add -Wno-pointer-sign flag unconditionally
    modpost: remove leftover symbol prefix handling for module device table
    kbuild: simplify command line creation in scripts/mkmakefile
    kbuild: do not pass $(objtree) to scripts/mkmakefile
    kbuild: remove user ID check in scripts/mkmakefile
    kbuild: remove VERSION and PATCHLEVEL from $(objtree)/Makefile
    kbuild: add --include-dir flag only for out-of-tree build
    kbuild: remove dead code in cmd_files calculation in top Makefile
    kbuild: hide most of targets when running config or mixed targets
    kbuild: remove old check for CFLAGS use
    kbuild: prefix Makefile.dtbinst path with $(srctree) unconditionally
    kallsyms: remove left-over Blackfin code
    kallsyms: reduce size a little on 64-bit

    Linus Torvalds
     

28 Oct, 2018

1 commit

  • Create DEF_FIELD_ADDR_VAR as a more generic version of the DEF_FIELD_ADD
    macro, allowing usage of a variable name other than the struct element name.
    Also, sets DEF_FIELD_ADDR as a specific usage of DEF_FILD_ADDR_VAR in which
    the var name is the same as the struct element name.
    Then, makes use of DEF_FIELD_ADDR_VAR to create a variable of another name,
    in order to avoid variable shadowing.

    Signed-off-by: Leonardo Bras
    Signed-off-by: Masahiro Yamada

    Leonardo Bras
     

19 Oct, 2018

1 commit


04 Oct, 2018

1 commit

  • … asm() related GCC inlining bugs

    Using macros in inline assembly allows us to work around bugs
    in GCC's inlining decisions.

    Compile macros.S and use it to assemble all C files.
    Currently only x86 will use it.

    Background:

    The inlining pass of GCC doesn't include an assembler, so it's not aware
    of basic properties of the generated code, such as its size in bytes,
    or that there are such things as discontiuous blocks of code and data
    due to the newfangled linker feature called 'sections' ...

    Instead GCC uses a lazy and fragile heuristic: it does a linear count of
    certain syntactic and whitespace elements in inlined assembly block source
    code, such as a count of new-lines and semicolons (!), as a poor substitute
    for "code size and complexity".

    Unsurprisingly this heuristic falls over and breaks its neck whith certain
    common types of kernel code that use inline assembly, such as the frequent
    practice of putting useful information into alternative sections.

    As a result of this fresh, 20+ years old GCC bug, GCC's inlining decisions
    are effectively disabled for inlined functions that make use of such asm()
    blocks, because GCC thinks those sections of code are "large" - when in
    reality they are often result in just a very low number of machine
    instructions.

    This absolute lack of inlining provess when GCC comes across such asm()
    blocks both increases generated kernel code size and causes performance
    overhead, which is particularly noticeable on paravirt kernels, which make
    frequent use of these inlining facilities in attempt to stay out of the
    way when running on baremetal hardware.

    Instead of fixing the compiler we use a workaround: we set an assembly macro
    and call it from the inlined assembly block. As a result GCC considers the
    inline assembly block as a single instruction. (Which it often isn't but I digress.)

    This uglifies and bloats the source code - for example just the refcount
    related changes have this impact:

    Makefile | 9 +++++++--
    arch/x86/Makefile | 7 +++++++
    arch/x86/kernel/macros.S | 7 +++++++
    scripts/Kbuild.include | 4 +++-
    scripts/mod/Makefile | 2 ++
    5 files changed, 26 insertions(+), 3 deletions(-)

    Yay readability and maintainability, it's not like assembly code is hard to read
    and maintain ...

    We also hope that GCC will eventually get fixed, but we are not holding
    our breath for that. Yet we are optimistic, it might still happen, any decade now.

    [ mingo: Wrote new changelog describing the background. ]

    Tested-by: Kees Cook <keescook@chromium.org>
    Signed-off-by: Nadav Amit <namit@vmware.com>
    Acked-by: Masahiro Yamada <yamada.masahiro@socionext.com>
    Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Michal Marek <michal.lkml@markovi.net>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sam Ravnborg <sam@ravnborg.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kbuild@vger.kernel.org
    Link: http://lkml.kernel.org/r/20181003213100.189959-3-namit@vmware.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>

    Nadav Amit
     

22 Aug, 2018

1 commit


19 Aug, 2018

1 commit

  • Pull USB/PHY updates from Greg KH:
    "Here is the big USB and phy driver patch set for 4.19-rc1.

    Nothing huge but there was a lot of work that happened this
    development cycle:

    - lots of type-c work, with drivers graduating out of staging, and
    displayport support being added.

    - new PHY drivers

    - the normal collection of gadget driver updates and fixes

    - code churn to work on the urb handling path, using irqsave()
    everywhere in anticipation of making this codepath a lot simpler in
    the future.

    - usbserial driver fixes and reworks

    - other misc changes

    All of these have been in linux-next with no reported issues for a
    while"

    * tag 'usb-4.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (159 commits)
    USB: serial: pl2303: add a new device id for ATEN
    usb: renesas_usbhs: Kconfig: convert to SPDX identifiers
    usb: dwc3: gadget: Check MaxPacketSize from descriptor
    usb: dwc2: Turn on uframe_sched on "stm32f4x9_fsotg" platforms
    usb: dwc2: Turn on uframe_sched on "amlogic" platforms
    usb: dwc2: Turn on uframe_sched on "his" platforms
    usb: dwc2: Turn on uframe_sched on "bcm" platforms
    usb: dwc2: gadget: ISOC's starting flow improvement
    usb: dwc2: Make dwc2_readl/writel functions endianness-agnostic.
    usb: dwc3: core: Enable AutoRetry feature in the controller
    usb: dwc3: Set default mode for dwc_usb31
    usb: gadget: udc: renesas_usb3: Add register of usb role switch
    usb: dwc2: replace ioread32/iowrite32_rep with dwc2_readl/writel_rep
    usb: dwc2: Modify dwc2_readl/writel functions prototype
    usb: dwc3: pci: Intel Merrifield can be host
    usb: dwc3: pci: Supply device properties via driver data
    arm64: dts: dwc3: description of incr burst type
    usb: dwc3: Enable undefined length INCR burst type
    usb: dwc3: add global soc bus configuration reg0
    usb: dwc3: Describe 'wakeup_work' field of struct dwc3_pci
    ...

    Linus Torvalds