• Mark Rutland's avatar
    arm64: module: rework module VA range selection · 3e35d303
    Mark Rutland authored
    Currently, the modules region is 128M in size, which is a problem for
    some large modules. Shanker reports [1] that the NVIDIA GPU driver alone
    can consume 110M of module space in some configurations. We'd like to
    make the modules region a full 2G such that we can always make use of a
    2G range.
    
    It's possible to build kernel images which are larger than 128M in some
    configurations, such as when many debug options are selected and many
    drivers are built in. In these configurations, we can't legitimately
    select a base for a 128M module region, though we currently select a
    value for which allocation will fail. It would be nicer to have a
    diagnostic message in this case.
    
    Similarly, in theory it's possible to build a kernel image which is
    larger than 2G and which cannot support modules. While this isn't likely
    to be the case for any realistic kernel deplyed in the field, it would
    be nice if we could print a diagnostic in this case.
    
    This patch reworks the module VA range selection to use a 2G range, and
    improves handling of cases where we cannot select legitimate module
    regions. We now attempt to select a 128M region and a 2G region:
    
    * The 128M region is selected such that modules can use direct branches
      (with JUMP26/CALL26 relocations) to branch to kernel code and other
      modules, and so that modules can reference data and text (using PREL32
      relocations) anywhere in the kernel image and other modules.
    
      This region covers the entire kernel image (rather than just the text)
      to ensure that all PREL32 relocations are in range even when the
      kernel data section is absurdly large. Where we cannot allocate from
      this region, we'll fall back to the full 2G region.
    
    * The 2G region is selected such that modules can use direct branches
      with PLTs to branch to kernel code and other modules, and so that
      modules can use reference data and text (with PREL32 relocations) in
      the kernel image and other modules.
    
      This region covers the entire kernel image, and the 128M region (if
      one is selected).
    
    The two module regions are randomized independently while ensuring the
    constraints described above.
    
    [1] https://lore.kernel.org/linux-arm-kernel/159ceeab-09af-3174-5058-445bc8dcf85b@nvidia.com/Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reviewed-by: default avatarArd Biesheuvel <ardb@kernel.org>
    Cc: Shanker Donthineni <sdonthineni@nvidia.com>
    Cc: Will Deacon <will@kernel.org>
    Tested-by: default avatarShanker Donthineni <sdonthineni@nvidia.com>
    Link: https://lore.kernel.org/r/20230530110328.2213762-7-mark.rutland@arm.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    3e35d303
memory.h 12.6 KB