• Arnd Bergmann's avatar
    arch: pgtable: define MAX_POSSIBLE_PHYSMEM_BITS where needed · cef39703
    Arnd Bergmann authored
    Stefan Agner reported a bug when using zsram on 32-bit Arm machines
    with RAM above the 4GB address boundary:
    
      Unable to handle kernel NULL pointer dereference at virtual address 00000000
      pgd = a27bd01c
      [00000000] *pgd=236a0003, *pmd=1ffa64003
      Internal error: Oops: 207 [#1] SMP ARM
      Modules linked in: mdio_bcm_unimac(+) brcmfmac cfg80211 brcmutil raspberrypi_hwmon hci_uart crc32_arm_ce bcm2711_thermal phy_generic genet
      CPU: 0 PID: 123 Comm: mkfs.ext4 Not tainted 5.9.6 #1
      Hardware name: BCM2711
      PC is at zs_map_object+0x94/0x338
      LR is at zram_bvec_rw.constprop.0+0x330/0xa64
      pc : [<c0602b38>]    lr : [<c0bda6a0>]    psr: 60000013
      sp : e376bbe0  ip : 00000000  fp : c1e2921c
      r10: 00000002  r9 : c1dda730  r8 : 00000000
      r7 : e8ff7a00  r6 : 00000000  r5 : 02f9ffa0  r4 : e3710000
      r3 : 000fdffe  r2 : c1e0ce80  r1 : ebf979a0  r0 : 00000000
      Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
      Control: 30c5383d  Table: 235c2a80  DAC: fffffffd
      Process mkfs.ext4 (pid: 123, stack limit = 0x495a22e6)
      Stack: (0xe376bbe0 to 0xe376c000)
    
    As it turns out, zsram needs to know the maximum memory size, which
    is defined in MAX_PHYSMEM_BITS when CONFIG_SPARSEMEM is set, or in
    MAX_POSSIBLE_PHYSMEM_BITS on the x86 architecture.
    
    The same problem will be hit on all 32-bit architectures that have a
    physical address space larger than 4GB and happen to not enable sparsemem
    and include asm/sparsemem.h from asm/pgtable.h.
    
    After the initial discussion, I suggested just always defining
    MAX_POSSIBLE_PHYSMEM_BITS whenever CONFIG_PHYS_ADDR_T_64BIT is
    set, or provoking a build error otherwise. This addresses all
    configurations that can currently have this runtime bug, but
    leaves all other configurations unchanged.
    
    I looked up the possible number of bits in source code and
    datasheets, here is what I found:
    
     - on ARC, CONFIG_ARC_HAS_PAE40 controls whether 32 or 40 bits are used
     - on ARM, CONFIG_LPAE enables 40 bit addressing, without it we never
       support more than 32 bits, even though supersections in theory allow
       up to 40 bits as well.
     - on MIPS, some MIPS32r1 or later chips support 36 bits, and MIPS32r5
       XPA supports up to 60 bits in theory, but 40 bits are more than
       anyone will ever ship
     - On PowerPC, there are three different implementations of 36 bit
       addressing, but 32-bit is used without CONFIG_PTE_64BIT
     - On RISC-V, the normal page table format can support 34 bit
       addressing. There is no highmem support on RISC-V, so anything
       above 2GB is unused, but it might be useful to eventually support
       CONFIG_ZRAM for high pages.
    
    Fixes: 61989a80 ("staging: zsmalloc: zsmalloc memory allocation library")
    Fixes: 02390b87 ("mm/zsmalloc: Prepare to variable MAX_PHYSMEM_BITS")
    Acked-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
    Reviewed-by: default avatarStefan Agner <stefan@agner.ch>
    Tested-by: default avatarStefan Agner <stefan@agner.ch>
    Acked-by: default avatarMike Rapoport <rppt@linux.ibm.com>
    Link: https://lore.kernel.org/linux-mm/bdfa44bf1c570b05d6c70898e2bbb0acf234ecdf.1604762181.git.stefan@agner.ch/Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
    cef39703
pgtable-32.h 7.99 KB