lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0025/1039] riscv: try to allocate crashkern region from 32bit addressible memory
    Date
    From: Nick Kossifidis <mick@ics.forth.gr>

    commit decf89f86ecd3c3c3de81c562010d5797bea3de1 upstream.

    When allocating crash kernel region without explicitly specifying its
    base address/size, memblock_phys_alloc_range will attempt to allocate
    memory top to bottom (memblock.bottom_up is false), so the crash
    kernel region will end up in highmem on 64bit systems. This way
    swiotlb can't work on the crash kernel, since there won't be any
    32bit addressible memory available for the bounce buffers.

    Try to allocate 32bit addressible memory if available, for the
    crash kernel by restricting the top search address to be less
    than SZ_4G. If that fails fallback to the previous behavior.

    I tested this on HiFive Unmatched where the pci-e controller needs
    swiotlb to work, with this patch it's possible to access the pci-e
    controller on crash kernel and mount the rootfs from the nvme.

    Signed-off-by: Nick Kossifidis <mick@ics.forth.gr>
    Fixes: e53d28180d4d ("RISC-V: Add kdump support")
    Cc: stable@vger.kernel.org
    Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/riscv/mm/init.c | 17 +++++++++++++----
    1 file changed, 13 insertions(+), 4 deletions(-)

    --- a/arch/riscv/mm/init.c
    +++ b/arch/riscv/mm/init.c
    @@ -812,13 +812,22 @@ static void __init reserve_crashkernel(v
    /*
    * Current riscv boot protocol requires 2MB alignment for
    * RV64 and 4MB alignment for RV32 (hugepage size)
    + *
    + * Try to alloc from 32bit addressible physical memory so that
    + * swiotlb can work on the crash kernel.
    */
    crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
    - search_start, search_end);
    + search_start,
    + min(search_end, (unsigned long) SZ_4G));
    if (crash_base == 0) {
    - pr_warn("crashkernel: couldn't allocate %lldKB\n",
    - crash_size >> 10);
    - return;
    + /* Try again without restricting region to 32bit addressible memory */
    + crash_base = memblock_phys_alloc_range(crash_size, PMD_SIZE,
    + search_start, search_end);
    + if (crash_base == 0) {
    + pr_warn("crashkernel: couldn't allocate %lldKB\n",
    + crash_size >> 10);
    + return;
    + }
    }

    pr_info("crashkernel: reserved 0x%016llx - 0x%016llx (%lld MB)\n",

    \
     
     \ /
      Last update: 2022-01-24 23:09    [W:4.138 / U:0.316 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site