• Tiezhu Yang's avatar
    MIPS: Make sparse_init() using top-down allocation · 269b3a9a
    Tiezhu Yang authored
    In the current code, if CONFIG_SWIOTLB is set, when failed to get IO TLB
    memory from the low pages by plat_swiotlb_setup(), it may lead to the boot
    process failed with kernel panic.
    
    (1) On the Loongson and SiByte platform
    arch/mips/loongson64/dma.c
    arch/mips/sibyte/common/dma.c
    void __init plat_swiotlb_setup(void)
    {
    	swiotlb_init(1);
    }
    
    kernel/dma/swiotlb.c
    void  __init
    swiotlb_init(int verbose)
    {
    ...
    	vstart = memblock_alloc_low(PAGE_ALIGN(bytes), PAGE_SIZE);
    	if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
    		return;
    ...
    	pr_warn("Cannot allocate buffer");
    	no_iotlb_memory = true;
    }
    
    phys_addr_t swiotlb_tbl_map_single()
    {
    ...
    	if (no_iotlb_memory)
    		panic("Can not allocate SWIOTLB buffer earlier ...");
    ...
    }
    
    (2) On the Cavium OCTEON platform
    arch/mips/cavium-octeon/dma-octeon.c
    void __init plat_swiotlb_setup(void)
    {
    ...
    	octeon_swiotlb = memblock_alloc_low(swiotlbsize, PAGE_SIZE);
    	if (!octeon_swiotlb)
    		panic("%s: Failed to allocate %zu bytes align=%lx\n",
    		      __func__, swiotlbsize, PAGE_SIZE);
    ...
    }
    
    Because IO_TLB_DEFAULT_SIZE is 64M, if the rest size of low memory is less
    than 64M when call plat_swiotlb_setup(), we can easily reproduce the panic
    case.
    
    In order to reduce the possibility of kernel panic when failed to get IO
    TLB memory under CONFIG_SWIOTLB, it is better to allocate low memory as
    small as possible before plat_swiotlb_setup(), so make sparse_init() using
    top-down allocation.
    Reported-by: default avatarJuxin Gao <gaojuxin@loongson.cn>
    Co-developed-by: default avatarJuxin Gao <gaojuxin@loongson.cn>
    Signed-off-by: default avatarJuxin Gao <gaojuxin@loongson.cn>
    Signed-off-by: default avatarTiezhu Yang <yangtiezhu@loongson.cn>
    Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
    269b3a9a
setup.c 21.4 KB