• Michael Ellerman's avatar
    powerpc/mm/radix: Fix off-by-one in split mapping logic · 5c6499b7
    Michael Ellerman authored
    When we have CONFIG_STRICT_KERNEL_RWX enabled, we try to split the
    kernel linear (1:1) mapping so that the kernel text is in a separate
    page to kernel data, so we can mark the former read-only.
    
    We could achieve that just by always using 64K pages for the linear
    mapping, but we try to be smarter. Instead we use huge pages when
    possible, and only switch to smaller pages when necessary.
    
    However we have an off-by-one bug in that logic, which causes us to
    calculate the wrong boundary between text and data.
    
    For example with the end of the kernel text at 16M we see:
    
      radix-mmu: Mapped 0x0000000000000000-0x0000000001200000 with 64.0 KiB pages
      radix-mmu: Mapped 0x0000000001200000-0x0000000040000000 with 2.00 MiB pages
      radix-mmu: Mapped 0x0000000040000000-0x0000000100000000 with 1.00 GiB pages
    
    ie. we mapped from 0 to 18M with 64K pages, even though the boundary
    between text and data is at 16M.
    
    With the fix we see we're correctly hitting the 16M boundary:
    
      radix-mmu: Mapped 0x0000000000000000-0x0000000001000000 with 64.0 KiB pages
      radix-mmu: Mapped 0x0000000001000000-0x0000000040000000 with 2.00 MiB pages
      radix-mmu: Mapped 0x0000000040000000-0x0000000100000000 with 1.00 GiB pages
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    5c6499b7
pgtable-radix.c 26.3 KB