highmem and VMALLOC_END
Eric Miao
eric.y.miao at gmail.com
Tue Nov 23 04:59:26 EST 2010
On Tue, Nov 23, 2010 at 5:42 PM, Chao Xie <cxie4 at marvell.com> wrote:
> hi
> in arch/arm/mmu,c, when define CONFIG_HIGHMEM, in sanity_check_meminfo, it will check the memory banks,
> and if the memory bank is in high memory, it will be marked as highmem.
> lowmem_limit = __pa(vmalloc_min - 1) + 1;
> memblock_set_current_limit(lowmem_limit);
>
> for (i = 0, j = 0; i < meminfo.nr_banks; i++) {
> struct membank *bank = &meminfo.bank[j];
> *bank = meminfo.bank[i];
>
> #ifdef CONFIG_HIGHMEM
> if (__va(bank->start) > vmalloc_min ||
> __va(bank->start) < (void *)PAGE_OFFSET)
> highmem = 1;
> if VMALLOC_END is 0xe8000000, and "vmalloc" is 0x18000000, vmalloc_min will be 0xd0000000.
> There are two banks, each bank is 256MB. Based on __phys_to_virt(), __va(first bank start) is
> 0xc0000000, while __va(second bank start) is 0xd0000000. Based on previous if, the second bank
> is not marked highmem, but in fact it will occupy the virtual address from 0xd0000000 to 0xdfffffff,
> and it should be in high memory.
> It will be fine if change the code as
> -- if (__va(bank->start) > vmalloc_min ||
> ++ if (__va(bank->start) >= vmalloc_min ||
> Is it a bug or I understand wrong? Thanks.
>
>
It's a bug. Nico?
More information about the linux-arm-kernel
mailing list