• Y
    memblock: don't adjust size in memblock_find_base() · e6d2e2b2
    Yinghai Lu 提交于
    While applying patch to use memblock to find aperture for 64bit x86.
    Ingo found system with 1g + force_iommu
    
    > No AGP bridge found
    > Node 0: aperture @ 38000000 size 32 MB
    > Aperture pointing to e820 RAM. Ignoring.
    > Your BIOS doesn't leave a aperture memory hole
    > Please enable the IOMMU option in the BIOS setup
    > This costs you 64 MB of RAM
    > Cannot allocate aperture memory hole (0,65536K)
    
    the corresponding code:
    
    	addr = memblock_find_in_range(0, 1ULL<<32, aper_size, 512ULL<<20);
    	if (addr == MEMBLOCK_ERROR || addr + aper_size > 0xffffffff) {
    		printk(KERN_ERR
    			"Cannot allocate aperture memory hole (%lx,%uK)\n",
    				addr, aper_size>>10);
    		return 0;
    	}
    	memblock_x86_reserve_range(addr, addr + aper_size, "aperture64")
    
    fails because memblock core code align the size with 512M.  That could
    make size way too big.
    
    So don't align the size in that case.
    
    actually __memblock_alloc_base, the another caller already align that
    before calling that function.
    
    BTW. x86 does not use __memblock_alloc_base...
    Signed-off-by: NYinghai Lu <yinghai@kernel.org>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: David Miller <davem@davemloft.net>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Dave Airlie <airlied@linux.ie>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    e6d2e2b2
memblock.c 22.4 KB