lmb_alloc() and page memory overlap
Prashant Bhole
prashantsmailcenter at gmail.com
Thu Dec 1 15:21:56 EST 2011
On Thu, Dec 1, 2011 at 9:30 AM, Benjamin Herrenschmidt
<benh at kernel.crashing.org> wrote:
> On Tue, 2011-11-29 at 18:51 +0530, Prashant Bhole wrote:
>> Hi,
>> I am using custom 460ex board with kernel version 2.6.30.
>> I noticed that page_alloc() is returning a page whose memory
>> is already allocated by lmb_alloc() while unflattening the device
>> tree. As per my knowledge the memory allocated by lmb_alloc()
>> should be reserved till the end, right?
>
> This should have been fixed in memblock in recent kernel, at least I
> believe it is. It looks like this is caused by overlapping lmb_reserve()
> at boot (or lmb_reserve() overlapping an lmb_alloc'ated region which
> boils down to the same thing).
>
> Old lmb didn't deal with that well at all and that lead to corruption of
> the lmb list. We fixed that in
>
> 8f7a66051b7523108c5aefb08c6a637e54aedc47
>
> mm/memblock: properly handle overlaps and fix error path
>
> Which got merged in 2.6.39.
>
> If you absolutely need to stick to 2.6.30, you can try backporting the
> fix to lmb.
>
> Cheers,
> Ben.
>
I need to stick to 2.6.30, will try backporting the fix. Is this the same thing
which is causing the wrong page (already allocated memory) allocation?
>> Some more explanation of what I observed:
>>
>> unflatten_device_tree() allocates memory, which will be used
>> for "struct node" objects in the device tree. I obtained base
>> address of allocated memory in "unsigned long base_mem"
>>
>> Now I executed the following code after the kernel booted properly.
>>
>> ---------------------------------------------------------------
>> extern unsigned long mem; // lmb_alloc() memory
>> struct page *test_page = virt_to_page(mem);
>> struct page *new_page = NULL;
>>
>> while(1)
>> {
>> new_page = NULL;
>> new_page = alloc_page(GFP_KERNEL);
>> if(!new_page)
>> {
>> printk("Allocation failed\n");
>> while(1);
>> }
>> if(test_page == new_page)
>> {
>> printk("Memory already allocated by lmb_alloc\n");
>> while(1);
>> }
>> }
>> ---------------------------------------------------------------
>>
>> After many page allocations, I always hit the condition (test_page == new_page).
>> Am I doing anything wrong here?
>> Has anybody faced this kind of problem before?
>>
>>
>> I also noticed that lmb_dump_all() shows 2 regions overlapping (last two):
>>
>> LMB configuration:
>> rmo_size = 0x30000000
>> memory.size = 0x30000000
>> memory.cnt = 0x1
>> memory[0x0] 0x0000000000000000 - 0x000000002fffffff, 0x30000000 bytes
>> reserved.cnt = 0x6
>> reserved[0x0] 0x0000000000000000 - 0x00000000006bffff, 0x6c0000 bytes
>> reserved[0x1] 0x0000000000ffa000 - 0x0000000000ffcfff, 0x3000 bytes
>> reserved[0x2] 0x000000002fdd0000 - 0x000000002fddffff, 0x10000 bytes
>> reserved[0x3] 0x000000002fde4000 - 0x000000002fde9fff, 0x6000 bytes
>> reserved[0x4] 0x000000002fdeb060 - 0x000000002ffff768, 0x214709 bytes
>> reserved[0x5] 0x000000002fdee000 - 0x000000002ffff769, 0x21176a bytes
>>
>>
>> Thanks,
>> Prashant
>> _______________________________________________
>> Linuxppc-dev mailing list
>> Linuxppc-dev at lists.ozlabs.org
>> https://lists.ozlabs.org/listinfo/linuxppc-dev
>
>
Thanks,
Prashant
More information about the Linuxppc-dev
mailing list